8
8
"bytes"
9
9
"encoding/csv"
10
10
"io"
11
+ "strconv"
11
12
"strings"
12
13
"testing"
13
14
@@ -21,14 +22,23 @@ func TestCreateReader(t *testing.T) {
21
22
assert .Equal (t , ',' , rd .Comma )
22
23
}
23
24
24
- //nolint
25
+ func decodeSlashes (s string ) string {
26
+ s = strings .ReplaceAll (s , "\n " , "\\ n" )
27
+ s = strings .ReplaceAll (s , "\" " , "\\ \" " )
28
+ decoded , err := strconv .Unquote (`"` + s + `"` )
29
+ if err != nil {
30
+ panic ("unable to decode string:" + err .Error () + "\n " + s )
31
+ }
32
+ return decoded
33
+ }
34
+
25
35
func TestCreateReaderAndDetermineDelimiter (t * testing.T ) {
26
36
var cases = []struct {
27
37
csv string
28
38
expectedRows [][]string
29
39
expectedDelimiter rune
30
40
}{
31
- // case 0 - semicolon delmited
41
+ // case 0 - semicolon delimited
32
42
{
33
43
csv : `a;b;c
34
44
1;2;3
@@ -47,11 +57,11 @@ a, b c
47
57
e f
48
58
g h i
49
59
j l
50
- m n,
60
+ m n,\t
51
61
p q r
52
62
u
53
63
v w x
54
- y
64
+ y\t\t
55
65
` ,
56
66
expectedRows : [][]string {
57
67
{"col1" , "col2" , "col3" },
74
84
a, b, c
75
85
d,e,f
76
86
,h, i
77
- j, ,
87
+ j, ,\x20
78
88
, , ` ,
79
89
expectedRows : [][]string {
80
90
{"col1" , "col2" , "col3" },
89
99
}
90
100
91
101
for n , c := range cases {
92
- rd , err := CreateReaderAndDetermineDelimiter (nil , strings .NewReader (c .csv ))
102
+ rd , err := CreateReaderAndDetermineDelimiter (nil , strings .NewReader (decodeSlashes ( c .csv ) ))
93
103
assert .NoError (t , err , "case %d: should not throw error: %v\n " , n , err )
94
104
assert .EqualValues (t , c .expectedDelimiter , rd .Comma , "case %d: delimiter should be '%c', got '%c'" , n , c .expectedDelimiter , rd .Comma )
95
105
rows , err := rd .ReadAll ()
@@ -222,7 +232,7 @@ John Doe
[email protected] This,note,had,a,lot,of,commas,to,test,delimters`,
222
232
}
223
233
224
234
for n , c := range cases {
225
- delimiter := determineDelimiter (& markup.RenderContext {Filename : c .filename }, []byte (c .csv ))
235
+ delimiter := determineDelimiter (& markup.RenderContext {Filename : c .filename }, []byte (decodeSlashes ( c .csv ) ))
226
236
assert .EqualValues (t , c .expectedDelimiter , delimiter , "case %d: delimiter should be equal, expected '%c' got '%c'" , n , c .expectedDelimiter , delimiter )
227
237
}
228
238
}
@@ -287,7 +297,7 @@ abc | |123
287
297
}
288
298
289
299
for n , c := range cases {
290
- modifiedText := removeQuotedString (c .text )
300
+ modifiedText := removeQuotedString (decodeSlashes ( c .text ) )
291
301
assert .EqualValues (t , c .expectedText , modifiedText , "case %d: modified text should be equal" , n )
292
302
}
293
303
}
@@ -353,7 +363,7 @@ John Doe
[email protected] This,note,had,a,lot,of,commas,to,test,delimters`,
353
363
quoted,
354
364
text," a
355
365
2 "some,
356
- quoted,
366
+ quoted,\t
357
367
text," b
358
368
3 "some,
359
369
quoted,
@@ -442,7 +452,7 @@ jkl`,
442
452
}
443
453
444
454
for n , c := range cases {
445
- delimiter := guessDelimiter ([]byte (c .csv ))
455
+ delimiter := guessDelimiter ([]byte (decodeSlashes ( c .csv ) ))
446
456
assert .EqualValues (t , c .expectedDelimiter , delimiter , "case %d: delimiter should be equal, expected '%c' got '%c'" , n , c .expectedDelimiter , delimiter )
447
457
}
448
458
}
@@ -459,7 +469,7 @@ func TestGuessFromBeforeAfterQuotes(t *testing.T) {
459
469
quoted,
460
470
text," a
461
471
2 "some,
462
- quoted,
472
+ quoted,\t
463
473
text," b
464
474
3 "some,
465
475
quoted,
@@ -534,7 +544,7 @@ a|"he said, ""here I am"""`,
534
544
}
535
545
536
546
for n , c := range cases {
537
- delimiter := guessFromBeforeAfterQuotes ([]byte (c .csv ))
547
+ delimiter := guessFromBeforeAfterQuotes ([]byte (decodeSlashes ( c .csv ) ))
538
548
assert .EqualValues (t , c .expectedDelimiter , delimiter , "case %d: delimiter should be equal, expected '%c' got '%c'" , n , c .expectedDelimiter , delimiter )
539
549
}
540
550
}
0 commit comments