2022-01-07 02:18:52 +01:00
// Copyright 2021 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package charset
import (
"reflect"
"strings"
"testing"
2022-08-13 20:32:34 +02:00
"code.gitea.io/gitea/modules/translation"
2022-01-07 02:18:52 +01:00
)
type escapeControlTest struct {
name string
text string
status EscapeStatus
result string
}
var escapeControlTests = [ ] escapeControlTest {
{
name : "<empty>" ,
} ,
{
name : "single line western" ,
text : "single line western" ,
result : "single line western" ,
2022-08-13 20:32:34 +02:00
status : EscapeStatus { } ,
2022-01-07 02:18:52 +01:00
} ,
{
name : "multi line western" ,
text : "single line western\nmulti line western\n" ,
result : "single line western\nmulti line western\n" ,
2022-08-13 20:32:34 +02:00
status : EscapeStatus { } ,
2022-01-07 02:18:52 +01:00
} ,
{
name : "multi line western non-breaking space" ,
text : "single line western\nmulti line western\n" ,
result : ` single line<span class="escaped-code-point" data-escaped="[U+00A0]"><span class="char"> </span></span>western ` + "\n" + ` multi line<span class="escaped-code-point" data-escaped="[U+00A0]"><span class="char"> </span></span>western ` + "\n" ,
2022-08-13 20:32:34 +02:00
status : EscapeStatus { Escaped : true , HasInvisible : true } ,
2022-01-07 02:18:52 +01:00
} ,
{
name : "mixed scripts: western + japanese" ,
text : "日属秘ぞしちゅ。Then some western." ,
result : "日属秘ぞしちゅ。Then some western." ,
2022-08-13 20:32:34 +02:00
status : EscapeStatus { } ,
2022-01-07 02:18:52 +01:00
} ,
{
name : "japanese" ,
text : "日属秘ぞしちゅ。" ,
result : "日属秘ぞしちゅ。" ,
2022-08-13 20:32:34 +02:00
status : EscapeStatus { } ,
2022-01-07 02:18:52 +01:00
} ,
{
name : "hebrew" ,
text : "עד תקופת י ו ו ן העתיקה היה העיסוק במתמטיקה תכליתי בלבד: היא שימשה כאוסף של נוסחאות לחישוב קרקע, אוכלוסין וכו'. פריצת הדרך של היוונים, פרט לתרומותיהם הגדולות לידע המתמטי, הייתה בלימוד המתמטיקה כשלעצמה, מתוקף ערכה הרוחני. יחסם של חלק מהיוונים הקדמונים למתמטיקה היה דתי - למשל, הכת שאסף סביבו פיתגורס האמינה כי המתמטיקה היא הבסיס לכל הדברים. היוונים נחשבים ליוצרי מושג ההוכחה המתמטית, וכן לראשונים שעסקו במתמטיקה לשם עצמה, כלומר כתחום מחקרי עיוני ומופשט ולא רק כעזר שימושי. עם זאת, לצדה" ,
2022-08-13 20:32:34 +02:00
result : ` עד תקופת <span class="ambiguous-code-point tooltip" data-content="repo.ambiguous_character"><span class="char">י </span></span><span class="ambiguous-code-point tooltip" data-content="repo.ambiguous_character"><span class="char">ו </span></span><span class="ambiguous-code-point tooltip" data-content="repo.ambiguous_character"><span class="char">ו </span></span><span class="ambiguous-code-point tooltip" data-content="repo.ambiguous_character"><span class="char">ן </span></span> העתיקה היה העיסוק במתמטיקה תכליתי בלבד: היא שימשה כאוסף של נוסחאות לחישוב קרקע, אוכלוסין וכו'. פריצת הדרך של היוונים, פרט לתרומותיהם הגדולות לידע המתמטי, הייתה בלימוד המתמטיקה כשלעצמה, מתוקף ערכה הרוחני. יחסם של חלק מהיוונים הקדמונים למתמטיקה היה דתי - למשל, הכת שאסף סביבו פיתגורס האמינה כי המתמטיקה היא הבסיס לכל הדברים. היוונים נחשבים ליוצרי מושג ההוכחה המתמטית, וכן לראשונים שעסקו במתמטיקה לשם עצמה, כלומר כתחום מחקרי עיוני ומופשט ולא רק כעזר שימושי. עם זאת, לצדה ` ,
status : EscapeStatus { Escaped : true , HasAmbiguous : true } ,
2022-01-07 02:18:52 +01:00
} ,
{
name : "more hebrew" ,
text : ` ב ת ק ו פ ה מ א ו ח ר ת י ו ת ר , ה ש ת מ ש ו ה י ו ו נ י ם ב ש י ט ת ס י מ ו ן מ ת ק ד מ ת י ו ת ר , ש ב ה ה ו צ ג ו ה מ ס פ ר י ם ל פ י 22 א ו ת י ו ת ה א ל פ ב י ת ה י ו ו נ י . ל ס י מ ו ן ה מ ס פ ר י ם ב י ן 1 ל - 9 נ ק ב ע ו ת ש ע ה א ו ת י ו ת ה ר א ש ו נ ו ת , ב ת ו ס פ ת ג ר ש ( ' ) ב צ ד י מ י ן ש ל ה א ו ת , ל מ ע ל ה ; ת ש ע ה א ו ת י ו ת ה ב א ו ת י י צ ג ו א ת ה ע ש ר ו ת מ - 10 ע ד 90 , ו ה ב א ו ת א ת ה מ א ו ת . ל ס י מ ו ן ה ס פ ר ו ת ב י ן 1000 ל - 900 , 000 , ה ש ת מ ש ו ה י ו ו נ י ם ב א ו ת ן א ו ת י ו ת , א ך ה ו ס י פ ו ל א ו ת י ו ת א ת ה ג ר ש ד ו ו ק א מ צ ד ש מ א ל ש ל ה א ו ת י ו ת , ל מ ט ה . מ מ י ל י ו ן ו מ ע ל ה , כ נ ר א ה ה ש ת מ ש ו ה י ו ו נ י ם ב ש נ י ת ג י ם ב מ ק ו ם א ח ד .
ה מ ת מ ט י ק א י ה ב ו ל ט ה ר א ש ו ן ב י ו ו ן ה ע ת י ק ה , ו י ש ה א ו מ ר י ם ב ת ו ל ד ו ת ה א נ ו ש ו ת , ה ו א ת א ל ס ( 624 ל פ נ ה "ס - 546 לפנה" ס ב ק י ר ו ב ) . [ 1 ] ל א י ה י ה ז ה מ ש ו ל ל י ס ו ד ל ה נ י ח ש ה ו א ה א ד ם ה ר א ש ו ן ש ה ו כ י ח מ ש פ ט מ ת מ ט י , ו ל א ר ק ג י ל ה א ו ת ו . ת א ל ס ה ו כ י ח ש י ש ר י ם מ ק ב י ל י ם ח ו ת כ י ם מ צ ד א ח ד ש ל ש ו ק י ז ו ו י ת ק ט ע י ם ב ע ל י י ח ס י ם ש ו ו י ם ( מ ש פ ט ת א ל ס ה ר א ש ו ן ) , ש ה ז ו ו י ת ה מ ו נ ח ת ע ל ק ו ט ר ב מ ע ג ל ה י א ז ו ו י ת י ש ר ה ( מ ש פ ט ת א ל ס ה ש נ י ) , ש ה ק ו ט ר מ ח ל ק א ת ה מ ע ג ל ל ש נ י ח ל ק י ם ש ו ו י ם , ו ש ז ו ו י ו ת ה ב ס י ס ב מ ש ו ל ש ש ו ו ה - ש ו ק י י ם ש ו ו ת ז ו ל ז ו . מ י ו ח ס ו ת ל ו ג ם ש י ט ו ת ל מ ד י ד ת ג ו ב ה ן ש ל ה פ י ר מ י ד ו ת ב ע ז ר ת מ ד י ד ת צ י ל ן ו ל ק ב י ע ת מ י ק ו מ ה ש ל ס פ י נ ה ה נ ר א י ת מ ן ה ח ו ף .
ב ש נ י ם 582 ל פ נ ה "ס עד 496 לפנה" ס , ב ק י ר ו ב , ח י מ ת מ ט י ק א י ח ש ו ב ב מ י ו ח ד - פ י ת ג ו ר ס . ה מ ק ו ר ו ת ה ר א ש ו נ י י ם ע ל י ו מ ו ע ט י ם , ו ה ה י ס ט ו ר י ו נ י ם מ ת ק ש י ם ל ה פ ר י ד א ת ה ע ו ב ד ו ת מ ש כ ב ת ה מ ס ת ו ר י ן ו ה א ג ד ו ת ש נ ק ש ר ו ב ו . י ד ו ע ש ס ב י ב ו ה ת ק ב צ ה ה א ס כ ו ל ה ה פ י ת ג ו ר א י ת מ ע י ן כ ת פ ס ב ד ו - מ ת מ ט י ת ש ה א מ י נ ה ש "הכל מספר" , א ו ל י ת ר ד י ו ק ה כ ל נ י ת ן ל כ י מ ו ת , ו י י ח ס ה ל מ ס פ ר י ם מ ש מ ע ו י ו ת מ י ס ט י ו ת . כ כ ל ה נ ר א ה ה פ י ת ג ו ר א י ם י ד ע ו ל ב נ ו ת א ת ה ג ו פ י ם ה א פ ל ט ו נ י י ם , ה כ י ר ו א ת ה מ מ ו צ ע ה א ר י ת מ ט י , ה מ מ ו צ ע ה ג א ו מ ט ר י ו ה מ מ ו צ ע ה ה ר מ ו נ י ו ה ג י ע ו ל ה י ש ג י ם ח ש ו ב י ם נ ו ס פ י ם . נ י ת ן ל ו מ ר ש ה פ י ת ג ו ר א י ם ג י ל ו א ת ה י ו ת ו ש ל ה ש ו ר ש ה ר י ב ו ע י ש ל 2 , ש ה ו א ג ם ה א ל כ ס ו ן ב ר י ב ו ע ש א ו ר ך צ ל ע ו ת י ו 1 , א י ר צ י ו נ ל י , א ך ת ג ל י ת ם ה י י ת ה ל מ ע ש ה ר ק ש ה ק ט ע י ם "חסרי מידה משותפת" , ו מ ו ש ג ה מ ס פ ר ה א י ר צ י ו נ ל י מ א ו ח ר י ו ת ר . [ 2 ] א ז כ ו ר ר א ש ו ן ל ק י ו מ ם ש ל ק ט ע י ם ח ס ר י מ י ד ה מ ש ו ת פ ת מ ו פ י ע ב ד י א ל ו ג "תאיטיטוס" ש ל א פ ל ט ו ן , א ך ר ע י ו ן ז ה ה י ה מ ו כ ר ע ו ד ק ו ד ם ל כ ן , ב מ א ה ה ח מ י ש י ת ל פ נ ה " ס ל ה י פ א ס ו ס , ב ן ה א ס כ ו ל ה ה פ י ת ג ו ר א י ת , ו א ו ל י ל פ י ת ג ו ר ס ע צ מ ו . [ 3 ] ` ,
2022-08-13 20:32:34 +02:00
result : ` ב ת ק ו פ ה מ א ו ח ר ת י ו ת ר , ה ש ת מ ש ו ה י ו ו נ י ם ב ש י ט ת ס י מ ו ן מ ת ק ד מ ת י ו ת ר , ש ב ה ה ו צ ג ו ה מ ס פ ר י ם ל פ י 22 א ו ת י ו ת ה א ל פ ב י ת ה י ו ו נ י . ל ס י מ ו ן ה מ ס פ ר י ם ב י ן 1 ל - 9 נ ק ב ע ו ת ש ע ה א ו ת י ו ת ה ר א ש ו נ ו ת , ב ת ו ס פ ת ג ר ש ( & # 39 ; ) ב צ ד י מ י ן ש ל ה א ו ת , ל מ ע ל ה ; ת ש ע ה א ו ת י ו ת ה ב א ו ת י י צ ג ו א ת ה ע ש ר ו ת מ - 10 ע ד 90 , ו ה ב א ו ת א ת ה מ א ו ת . ל ס י מ ו ן ה ס פ ר ו ת ב י ן 1000 ל - 900 , 000 , ה ש ת מ ש ו ה י ו ו נ י ם ב א ו ת ן א ו ת י ו ת , א ך ה ו ס י פ ו ל א ו ת י ו ת א ת ה ג ר ש ד ו ו ק א מ צ ד ש מ א ל ש ל ה א ו ת י ו ת , ל מ ט ה . מ מ י ל י ו ן ו מ ע ל ה , כ נ ר א ה ה ש ת מ ש ו ה י ו ו נ י ם ב ש נ י ת ג י ם ב מ ק ו ם א ח ד .
2022-01-07 02:18:52 +01:00
2022-08-13 20:32:34 +02:00
ה מ ת מ ט י ק א י ה ב ו ל ט ה ר א ש ו ן ב י ו ו ן ה ע ת י ק ה , ו י ש ה א ו מ ר י ם ב ת ו ל ד ו ת ה א נ ו ש ו ת , ה ו א ת א ל ס ( 624 ל פ נ ה & # 34 ; < span class = "ambiguous-code-point tooltip" data - content = "repo.ambiguous_character" > < span class = "char" > ס < / span > < / span > - 546 ל פ נ ה & # 34 ; < span class = "ambiguous-code-point tooltip" data - content = "repo.ambiguous_character" > < span class = "char" > ס < / span > < / span > ב ק י ר ו ב ) . [ 1 ] ל א י ה י ה ז ה מ ש ו ל ל י ס ו ד ל ה נ י ח ש ה ו א ה א ד ם ה ר א ש ו ן ש ה ו כ י ח מ ש פ ט מ ת מ ט י , ו ל א ר ק ג י ל ה א ו ת ו . ת א ל ס ה ו כ י ח ש י ש ר י ם מ ק ב י ל י ם ח ו ת כ י ם מ צ ד א ח ד ש ל ש ו ק י ז ו ו י ת ק ט ע י ם ב ע ל י י ח ס י ם ש ו ו י ם ( מ ש פ ט ת א ל ס ה ר א ש ו ן ) , ש ה ז ו ו י ת ה מ ו נ ח ת ע ל ק ו ט ר ב מ ע ג ל ה י א ז ו ו י ת י ש ר ה ( מ ש פ ט ת א ל ס ה ש נ י ) , ש ה ק ו ט ר מ ח ל ק א ת ה מ ע ג ל ל ש נ י ח ל ק י ם ש ו ו י ם , ו ש ז ו ו י ו ת ה ב ס י ס ב מ ש ו ל ש ש ו ו ה - ש ו ק י י ם ש ו ו ת ז ו ל ז ו . מ י ו ח ס ו ת ל ו ג ם ש י ט ו ת ל מ ד י ד ת ג ו ב ה ן ש ל ה פ י ר מ י ד ו ת ב ע ז ר ת מ ד י ד ת צ י ל ן ו ל ק ב י ע ת מ י ק ו מ ה ש ל ס פ י נ ה ה נ ר א י ת מ ן ה ח ו ף .
2022-01-07 02:18:52 +01:00
2022-08-13 20:32:34 +02:00
ב ש נ י ם 582 ל פ נ ה & # 34 ; < span class = "ambiguous-code-point tooltip" data - content = "repo.ambiguous_character" > < span class = "char" > ס < / span > < / span > ע ד 496 ל פ נ ה & # 34 ; < span class = "ambiguous-code-point tooltip" data - content = "repo.ambiguous_character" > < span class = "char" > ס < / span > < / span > , ב ק י ר ו ב , ח י מ ת מ ט י ק א י ח ש ו ב ב מ י ו ח ד - פ י ת ג ו ר ס . ה מ ק ו ר ו ת ה ר א ש ו נ י י ם ע ל י ו מ ו ע ט י ם , ו ה ה י ס ט ו ר י ו נ י ם מ ת ק ש י ם ל ה פ ר י ד א ת ה ע ו ב ד ו ת מ ש כ ב ת ה מ ס ת ו ר י ן ו ה א ג ד ו ת ש נ ק ש ר ו ב ו . י ד ו ע ש ס ב י ב ו ה ת ק ב צ ה ה א ס כ ו ל ה ה פ י ת ג ו ר א י ת מ ע י ן כ ת פ ס ב ד ו - מ ת מ ט י ת ש ה א מ י נ ה ש & # 34 ; ה כ ל מ ס פ ר & # 34 ; , א ו ל י ת ר ד י ו ק ה כ ל נ י ת ן ל כ י מ ו ת , ו י י ח ס ה ל מ ס פ ר י ם מ ש מ ע ו י ו ת מ י ס ט י ו ת . כ כ ל ה נ ר א ה ה פ י ת ג ו ר א י ם י ד ע ו ל ב נ ו ת א ת ה ג ו פ י ם ה א פ ל ט ו נ י י ם , ה כ י ר ו א ת ה מ מ ו צ ע ה א ר י ת מ ט י , ה מ מ ו צ ע ה ג א ו מ ט ר י ו ה מ מ ו צ ע ה ה ר מ ו נ י ו ה ג י ע ו ל ה י ש ג י ם ח ש ו ב י ם נ ו ס פ י ם . נ י ת ן ל ו מ ר ש ה פ י ת ג ו ר א י ם ג י ל ו א ת ה י ו ת ו ש ל ה ש ו ר ש ה ר י ב ו ע י ש ל 2 , ש ה ו א ג ם ה א ל כ ס ו ן ב ר י ב ו ע ש א ו ר ך צ ל ע ו ת י ו 1 , א י ר צ י ו נ ל י , א ך ת ג ל י ת ם ה י י ת ה ל מ ע ש ה ר ק ש ה ק ט ע י ם & # 34 ; ח ס ר י מ י ד ה מ ש ו ת פ ת & # 34 ; , ו מ ו ש ג ה מ ס פ ר ה א י ר צ י ו נ ל י מ א ו ח ר י ו ת ר . [ 2 ] א ז כ ו ר ר א ש ו ן ל ק י ו מ ם ש ל ק ט ע י ם ח ס ר י מ י ד ה מ ש ו ת פ ת מ ו פ י ע ב ד י א ל ו ג & # 34 ; ת א י ט י ט ו ס & # 34 ; ש ל א פ ל ט ו ן , א ך ר ע י ו ן ז ה ה י ה מ ו כ ר ע ו ד ק ו ד ם ל כ ן , ב מ א ה ה ח מ י ש י ת ל פ נ ה & # 34 ; < span class = "ambiguous-code-point tooltip" data - content = "repo.ambiguous_character" > < span class = "char" > ס < / span > < / span > ל ה י פ א ס ו ס , ב ן ה א ס כ ו ל ה ה פ י ת ג ו ר א י ת , ו א ו ל י ל פ י ת ג ו ר ס ע צ מ ו . [ 3 ] ` ,
status : EscapeStatus { Escaped : true , HasAmbiguous : true } ,
2022-01-07 02:18:52 +01:00
} ,
{
name : "Mixed RTL+LTR" ,
text : ` Many computer programs fail to display bidirectional text correctly .
For example , the Hebrew name Sarah ( ש ר ה ) is spelled : sin ( ש ) ( which appears rightmost ) ,
then resh ( ר ) , and finally heh ( ה ) ( which should appear leftmost ) . ` ,
result : ` Many computer programs fail to display bidirectional text correctly .
For example , the Hebrew name Sarah ( ש ר ה ) is spelled : sin ( ש ) ( which appears rightmost ) ,
then resh ( ר ) , and finally heh ( ה ) ( which should appear leftmost ) . ` ,
2022-08-13 20:32:34 +02:00
status : EscapeStatus { } ,
2022-01-07 02:18:52 +01:00
} ,
{
name : "Mixed RTL+LTR+BIDI" ,
text : ` Many computer programs fail to display bidirectional text correctly .
For example , the Hebrew name Sarah ` + "\u2067" + ` ש ר ה ` + "\u2066\n" +
` sin (ש) (which appears rightmost), then resh (ר), and finally heh (ה) (which should appear leftmost). ` ,
result : ` Many computer programs fail to display bidirectional text correctly .
2022-08-13 20:32:34 +02:00
For example , the Hebrew name Sarah ` + "\u2067" + ` ש ר ה ` + "\u2066\n" +
2022-01-07 02:18:52 +01:00
` sin (ש) (which appears rightmost), then resh (ר), and finally heh (ה) (which should appear leftmost). ` ,
2022-08-13 20:32:34 +02:00
status : EscapeStatus { } ,
2022-01-07 02:18:52 +01:00
} ,
{
name : "Accented characters" ,
text : string ( [ ] byte { 0xc3 , 0xa1 , 0xc3 , 0xa9 , 0xc3 , 0xad , 0xc3 , 0xb3 , 0xc3 , 0xba } ) ,
result : string ( [ ] byte { 0xc3 , 0xa1 , 0xc3 , 0xa9 , 0xc3 , 0xad , 0xc3 , 0xb3 , 0xc3 , 0xba } ) ,
2022-08-13 20:32:34 +02:00
status : EscapeStatus { } ,
2022-01-07 02:18:52 +01:00
} ,
{
name : "Program" ,
text : "string([]byte{0xc3, 0xa1, 0xc3, 0xa9, 0xc3, 0xad, 0xc3, 0xb3, 0xc3, 0xba})" ,
result : "string([]byte{0xc3, 0xa1, 0xc3, 0xa9, 0xc3, 0xad, 0xc3, 0xb3, 0xc3, 0xba})" ,
2022-08-13 20:32:34 +02:00
status : EscapeStatus { } ,
2022-01-07 02:18:52 +01:00
} ,
{
name : "CVE testcase" ,
text : "if access_level != \"user\u202E \u2066// Check if admin\u2069 \u2066\" {" ,
2022-08-13 20:32:34 +02:00
result : ` if access_level != "user<span class="escaped-code-point" data-escaped="[U+202E]"><span class="char"> ` + "\u202e" + ` </span></span> <span class="escaped-code-point" data-escaped="[U+2066]"><span class="char"> ` + "\u2066" + ` </span></span>// Check if admin<span class="escaped-code-point" data-escaped="[U+2069]"><span class="char"> ` + "\u2069" + ` </span></span> <span class="escaped-code-point" data-escaped="[U+2066]"><span class="char"> ` + "\u2066" + ` </span></span>" { ` ,
status : EscapeStatus { Escaped : true , HasInvisible : true } ,
2022-01-07 02:18:52 +01:00
} ,
{
name : "Mixed testcase with fail" ,
text : ` Many computer programs fail to display bidirectional text correctly .
For example , the Hebrew name Sarah ` + "\u2067" + ` ש ר ה ` + "\u2066\n" +
` sin (ש) (which appears rightmost), then resh (ר), and finally heh (ה) (which should appear leftmost). ` +
"\nif access_level != \"user\u202E \u2066// Check if admin\u2069 \u2066\" {\n" ,
result : ` Many computer programs fail to display bidirectional text correctly .
2022-08-13 20:32:34 +02:00
For example , the Hebrew name Sarah ` + "\u2067" + ` ש ר ה ` + "\u2066\n" +
2022-01-07 02:18:52 +01:00
` sin (ש) (which appears rightmost), then resh (ר), and finally heh (ה) (which should appear leftmost). ` +
2022-08-13 20:32:34 +02:00
"\n" + ` if access_level != "user<span class="escaped-code-point" data-escaped="[U+202E]"><span class="char"> ` + "\u202e" + ` </span></span> <span class="escaped-code-point" data-escaped="[U+2066]"><span class="char"> ` + "\u2066" + ` </span></span>// Check if admin<span class="escaped-code-point" data-escaped="[U+2069]"><span class="char"> ` + "\u2069" + ` </span></span> <span class="escaped-code-point" data-escaped="[U+2066]"><span class="char"> ` + "\u2066" + ` </span></span>" { ` + "\n" ,
status : EscapeStatus { Escaped : true , HasInvisible : true } ,
2022-01-07 02:18:52 +01:00
} ,
2022-02-26 17:48:23 +01:00
{
// UTF-8/16/32 all use the same codepoint for BOM
// Gitea could read UTF-16/32 content and convert into UTF-8 internally then render it, so we only process UTF-8 internally
name : "UTF BOM" ,
text : "\xef\xbb\xbftest" ,
result : "\xef\xbb\xbftest" ,
2022-08-13 20:32:34 +02:00
status : EscapeStatus { } ,
2022-02-26 17:48:23 +01:00
} ,
2022-01-07 02:18:52 +01:00
}
func TestEscapeControlString ( t * testing . T ) {
for _ , tt := range escapeControlTests {
t . Run ( tt . name , func ( t * testing . T ) {
2022-08-13 20:32:34 +02:00
locale := translation . NewLocale ( "en_US" )
status , result := EscapeControlString ( tt . text , locale )
if ! reflect . DeepEqual ( * status , tt . status ) {
2022-01-07 02:18:52 +01:00
t . Errorf ( "EscapeControlString() status = %v, wanted= %v" , status , tt . status )
}
if result != tt . result {
t . Errorf ( "EscapeControlString()\nresult= %v,\nwanted= %v" , result , tt . result )
}
} )
}
}
func TestEscapeControlReader ( t * testing . T ) {
// lets add some control characters to the tests
tests := make ( [ ] escapeControlTest , 0 , len ( escapeControlTests ) * 3 )
copy ( tests , escapeControlTests )
2022-02-26 17:48:23 +01:00
// if there is a BOM, we should keep the BOM
addPrefix := func ( prefix , s string ) string {
if strings . HasPrefix ( s , "\xef\xbb\xbf" ) {
return s [ : 3 ] + prefix + s [ 3 : ]
}
return prefix + s
}
2022-01-07 02:18:52 +01:00
for _ , test := range escapeControlTests {
test . name += " (+Control)"
2022-02-26 17:48:23 +01:00
test . text = addPrefix ( "\u001E" , test . text )
test . result = addPrefix ( ` <span class="escaped-code-point" data-escaped="[U+001E]"><span class="char"> ` + "\u001e" + ` </span></span> ` , test . result )
2022-01-07 02:18:52 +01:00
test . status . Escaped = true
2022-08-13 20:32:34 +02:00
test . status . HasInvisible = true
2022-01-07 02:18:52 +01:00
tests = append ( tests , test )
}
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
input := strings . NewReader ( tt . text )
output := & strings . Builder { }
2022-08-13 20:32:34 +02:00
status , err := EscapeControlReader ( input , output , translation . NewLocale ( "en_US" ) )
2022-01-07 02:18:52 +01:00
result := output . String ( )
if err != nil {
t . Errorf ( "EscapeControlReader(): err = %v" , err )
}
2022-08-13 20:32:34 +02:00
if ! reflect . DeepEqual ( * status , tt . status ) {
2022-01-07 02:18:52 +01:00
t . Errorf ( "EscapeControlReader() status = %v, wanted= %v" , status , tt . status )
}
if result != tt . result {
t . Errorf ( "EscapeControlReader()\nresult= %v,\nwanted= %v" , result , tt . result )
}
} )
}
}
2022-02-19 16:25:31 +01:00
func TestEscapeControlReader_panic ( t * testing . T ) {
bs := make ( [ ] byte , 0 , 20479 )
bs = append ( bs , 'A' )
for i := 0 ; i < 6826 ; i ++ {
bs = append ( bs , [ ] byte ( "—" ) ... )
}
2022-08-13 20:32:34 +02:00
_ , _ = EscapeControlString ( string ( bs ) , translation . NewLocale ( "en_US" ) )
2022-02-19 16:25:31 +01:00
}