@@ -116,3 +116,52 @@ class CSVParserSuite extends FunSuite:
116116 val result = CSVParser .parseLine(line)
117117 assertEquals(result, List (" " , " field2" , " field3" ))
118118 }
119+
120+ // Tests for full escape character support (ESCAPE specification)
121+ test(" parseLine should handle backslash-escaped linefeeds" ) {
122+ val line = " field1,\" field2 with \\ n newline\" ,field3"
123+ val result = CSVParser .parseLine(line)
124+ assertEquals(result, List (" field1" , " field2 with \n newline" , " field3" ))
125+ }
126+
127+ test(" parseLine should handle backslash-escaped carriage returns" ) {
128+ val line = " field1,\" field2 with \\ r return\" ,field3"
129+ val result = CSVParser .parseLine(line)
130+ assertEquals(result, List (" field1" , " field2 with \r return" , " field3" ))
131+ }
132+
133+ test(" parseLine should handle backslash-escaped delimiters" ) {
134+ val line = " field1,\" field2 with \\ , comma\" ,field3"
135+ val result = CSVParser .parseLine(line)
136+ assertEquals(result, List (" field1" , " field2 with , comma" , " field3" ))
137+ }
138+
139+ test(" parseLine should handle backslash-escaped backslashes" ) {
140+ val line = " field1,\" field2 with \\\\ backslash\" ,field3"
141+ val result = CSVParser .parseLine(line)
142+ assertEquals(result, List (" field1" , " field2 with \\ backslash" , " field3" ))
143+ }
144+
145+ test(" parseLine should handle custom delimiter with backslash-escaped delimiter" ) {
146+ val line = " field1;\" field2 with \\ ; semicolon\" ;field3"
147+ val result = CSVParser .parseLine(line, delimiter = ';' )
148+ assertEquals(result, List (" field1" , " field2 with ; semicolon" , " field3" ))
149+ }
150+
151+ test(" parseLine should handle multiple escape sequences in one field" ) {
152+ val line = " field1,\" field2 with \\ n\\ r\\ , and \\\" escapes\" ,field3"
153+ val result = CSVParser .parseLine(line)
154+ assertEquals(result, List (" field1" , " field2 with \n\r , and \" escapes" , " field3" ))
155+ }
156+
157+ test(" parseLine should handle backslash at end of field (not escaping anything)" ) {
158+ val line = " field1,\" field2 ends with \\\\\" ,field3"
159+ val result = CSVParser .parseLine(line)
160+ assertEquals(result, List (" field1" , " field2 ends with \\ " , " field3" ))
161+ }
162+
163+ test(" parseLine should handle invalid escape sequences by treating backslash literally" ) {
164+ val line = " field1,\" field2 with \\ z invalid escape\" ,field3"
165+ val result = CSVParser .parseLine(line)
166+ assertEquals(result, List (" field1" , " field2 with \\ z invalid escape" , " field3" ))
167+ }
0 commit comments