88 "bytes"
99 "encoding/csv"
1010 "io"
11+ "strconv"
1112 "strings"
1213 "testing"
1314
@@ -21,14 +22,21 @@ func TestCreateReader(t *testing.T) {
2122 assert .Equal (t , ',' , rd .Comma )
2223}
2324
24- //nolint
25+ func decodeSlashes (t * testing.T , s string ) string {
26+ s = strings .ReplaceAll (s , "\n " , "\\ n" )
27+ s = strings .ReplaceAll (s , "\" " , "\\ \" " )
28+ decoded , err := strconv .Unquote (`"` + s + `"` )
29+ assert .NoError (t , err , "unable to decode string" )
30+ return decoded
31+ }
32+
2533func TestCreateReaderAndDetermineDelimiter (t * testing.T ) {
2634 var cases = []struct {
2735 csv string
2836 expectedRows [][]string
2937 expectedDelimiter rune
3038 }{
31- // case 0 - semicolon delmited
39+ // case 0 - semicolon delimited
3240 {
3341 csv : `a;b;c
34421;2;3
@@ -47,11 +55,11 @@ a, b c
4755 e f
4856g h i
4957j l
50- m n,
58+ m n,\t
5159p q r
5260 u
5361v w x
54- y
62+ y\t\t
5563 ` ,
5664 expectedRows : [][]string {
5765 {"col1" , "col2" , "col3" },
7482 a, b, c
7583d,e,f
7684 ,h, i
77- j, ,
85+ j, ,\x20
7886 , , ` ,
7987 expectedRows : [][]string {
8088 {"col1" , "col2" , "col3" },
8997 }
9098
9199 for n , c := range cases {
92- rd , err := CreateReaderAndDetermineDelimiter (nil , strings .NewReader (c .csv ))
100+ rd , err := CreateReaderAndDetermineDelimiter (nil , strings .NewReader (decodeSlashes ( t , c .csv ) ))
93101 assert .NoError (t , err , "case %d: should not throw error: %v\n " , n , err )
94102 assert .EqualValues (t , c .expectedDelimiter , rd .Comma , "case %d: delimiter should be '%c', got '%c'" , n , c .expectedDelimiter , rd .Comma )
95103 rows , err := rd .ReadAll ()
@@ -222,7 +230,7 @@ John Doe
[email protected] This,note,had,a,lot,of,commas,to,test,delimters`,
222230 }
223231
224232 for n , c := range cases {
225- delimiter := determineDelimiter (& markup.RenderContext {Filename : c .filename }, []byte (c .csv ))
233+ delimiter := determineDelimiter (& markup.RenderContext {Filename : c .filename }, []byte (decodeSlashes ( t , c .csv ) ))
226234 assert .EqualValues (t , c .expectedDelimiter , delimiter , "case %d: delimiter should be equal, expected '%c' got '%c'" , n , c .expectedDelimiter , delimiter )
227235 }
228236}
@@ -287,7 +295,7 @@ abc | |123
287295 }
288296
289297 for n , c := range cases {
290- modifiedText := removeQuotedString (c .text )
298+ modifiedText := removeQuotedString (decodeSlashes ( t , c .text ) )
291299 assert .EqualValues (t , c .expectedText , modifiedText , "case %d: modified text should be equal" , n )
292300 }
293301}
@@ -353,7 +361,7 @@ John Doe
[email protected] This,note,had,a,lot,of,commas,to,test,delimters`,
353361 quoted,
354362text," a
3553632 "some,
356- quoted,
364+ quoted,\t
357365 text," b
3583663 "some,
359367quoted,
@@ -442,7 +450,7 @@ jkl`,
442450 }
443451
444452 for n , c := range cases {
445- delimiter := guessDelimiter ([]byte (c .csv ))
453+ delimiter := guessDelimiter ([]byte (decodeSlashes ( t , c .csv ) ))
446454 assert .EqualValues (t , c .expectedDelimiter , delimiter , "case %d: delimiter should be equal, expected '%c' got '%c'" , n , c .expectedDelimiter , delimiter )
447455 }
448456}
@@ -459,7 +467,7 @@ func TestGuessFromBeforeAfterQuotes(t *testing.T) {
459467 quoted,
460468text," a
4614692 "some,
462- quoted,
470+ quoted,\t
463471 text," b
4644723 "some,
465473quoted,
@@ -534,7 +542,7 @@ a|"he said, ""here I am"""`,
534542 }
535543
536544 for n , c := range cases {
537- delimiter := guessFromBeforeAfterQuotes ([]byte (c .csv ))
545+ delimiter := guessFromBeforeAfterQuotes ([]byte (decodeSlashes ( t , c .csv ) ))
538546 assert .EqualValues (t , c .expectedDelimiter , delimiter , "case %d: delimiter should be equal, expected '%c' got '%c'" , n , c .expectedDelimiter , delimiter )
539547 }
540548}
@@ -549,6 +557,10 @@ func (l mockLocale) Tr(s string, _ ...interface{}) string {
549557 return s
550558}
551559
560+ func (l mockLocale ) TrN (_cnt interface {}, key1 , _keyN string , _args ... interface {}) string {
561+ return key1
562+ }
563+
552564func TestFormatError (t * testing.T ) {
553565 var cases = []struct {
554566 err error
0 commit comments