package csv4cj
import std.unittest.*
import std.unittest.testmacro.*
@Test
public class LexerTest {
@TestCase
public func testNextRecord(): Unit {
let csvContent = #" 1 ,"2","\,""#
let format = CSVParseFormat.DEFAULT
let csvReader = CSVReader(StringStream(csvContent))
let csvParser = CSVParser(csvReader, format)
var csvRecord = csvParser.nextRecord()
let record = csvRecord.getOrThrow()
@Assert(record.size(),3)
@Expect(record.get(0),"1")
@Expect(record.get(1) ,"2")
@Expect(record.get(2) ,",")
}
@TestCase
public func testQuoteInQuote(): Unit {
let csvContent = #""\"",1"2","""""#
let format = CSVParseFormat.DEFAULT
let csvReader = CSVReader(StringStream(csvContent))
let csvParser = CSVParser(csvReader, format)
var csvRecord = csvParser.nextRecord()
let record = csvRecord.getOrThrow()
@Assert(record.size(),3)
@Expect(record.get(0),#"""#)
@Expect(record.get(1) ,#"1"2""#)
@Expect(record.get(2) ,#"""#)
}
@TestCase
public func testSpecialSign(): Unit {
let csvContent = #"@this is comment
123||abc||"你好""#
let format = CSVParseFormat.DEFAULT.setCommentMarker(r'@').setDelimiter("||")
let csvReader = CSVReader(StringStream(csvContent))
let csvParser = CSVParser(csvReader, format)
var csvRecord = csvParser.nextRecord()
let record = csvRecord.getOrThrow()
@Assert(record.size(),3)
@Expect(record.getComment().getOrThrow(),"this is comment")
@Expect(record.get(0),"123")
@Expect(record.get(1),"abc")
@Expect(record.get(2),"你好")
}
@TestCase
public func testEmptyLine(): Unit {
let csvContent = "abc\n\r\ndef\n\n"
let format = CSVParseFormat.DEFAULT.setIgnoreEmptyLines(true)
let csvReader = CSVReader(StringStream(csvContent))
let csvParser = CSVParser(csvReader, format)
var csvRecord = csvParser.nextRecord()
var record = csvRecord.getOrThrow()
@Assert(record.size(),1)
@Expect(record.get(0),"abc")
csvRecord = csvParser.nextRecord()
record = csvRecord.getOrThrow()
@Assert(record.size(),1)
@Expect(record.get(0),"def")
csvRecord = csvParser.nextRecord()
@Assert(csvRecord.isNone())
}
}