@@ -84,6 +84,11 @@ struct CSVDialectDetectionTests {
8484 let detected = CSVDialect . detect ( from: " a,b \n 1,2 \n " . data ( using: . utf8) !)
8585 #expect( detected. escapeChar == 0x22 )
8686 }
87+
88+ @Test ( " Escape character follows a non-default quote character " )
89+ func escapeFollowsQuote( ) {
90+ #expect( CSVDialect ( delimiter: 0x2C , quoteChar: 0x27 ) . escapeChar == 0x27 )
91+ }
8792}
8893
8994@Suite ( " CSVStreamingParser " )
@@ -159,6 +164,18 @@ struct CSVStreamingParserTests {
159164 #expect( fields == [ #"a\b"# ] )
160165 }
161166
167+ @Test ( " field(at:column:) honors the backslash escape inside a quoted field " )
168+ func fieldBackslashEscape( ) {
169+ var dialect = CSVDialect . csv
170+ dialect. escapeChar = 0x5C
171+ let ( data, ranges, parser) = parse ( #""a\"b",c"# + " \n " , dialect: dialect)
172+ let first = data. withUnsafeBytes { raw -> String in
173+ guard let base = raw. bindMemory ( to: UInt8 . self) . baseAddress else { return " " }
174+ return parser. field ( UnsafeBufferPointer ( start: base, count: raw. count) , range: ranges [ 0 ] , column: 0 )
175+ }
176+ #expect( first == #"a"b"# )
177+ }
178+
162179 @Test ( " Empty fields preserved " )
163180 func emptyFields( ) {
164181 let ( data, ranges, parser) = parse ( " ,,, \n " )
0 commit comments