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())
    }
}