package csv4cj

import std.unittest.*
import std.unittest.testmacro.*

@Test
public class CSVPrinterTest {
    @TestCase
    public func testPrintWithComment(): Unit {
        let csvRecord = CSVRecord(["1", "taobao", "小米", "200斤"], "注释\r\n第二行")
        let format = CSVOutFormat.DEFAULT
        let csvPrint = CSVPrinter(format)
        let sb = StringBuilder()

        csvPrint.printWithComment(csvRecord, sb)
        @Expect(sb.toString(),"# 注释\r\n# 第二行\r\n1,taobao,小米,200斤")
    }

    @TestCase
    public func testPrintWithQuote(): Unit {
        let format = CSVOutFormat.DEFAULT
        let csvPrint = CSVPrinter(format)
        let sb = StringBuilder()

        csvPrint.printWithQuote("abc".toRuneArray(), sb)
        @Expect(sb.toString(),#""abc""#)
        sb.reset()

        csvPrint.printWithQuote(#"a"\bc"#.toRuneArray(), sb)
        @Expect(sb.toString(),#""a\"\\bc""#)
        sb.reset()
    }

    @TestCase
    public func testPrintSpecialCols(): Unit {
        let format = CSVOutFormat.DEFAULT.setQuoteMode(QuoteMode.CfgCols).setQuotedColsIndex([1, 2])
        let csvPrint = CSVPrinter(format)
        let sb = StringBuilder()
        csvPrint.print(["abc", "1", "a\tc", ","], sb)
        @Expect(sb.toString(),"abc,\"1\",\"a\tc\",\",\"")
    }

    @TestCase
    public func testPrintWithEscapes(): Unit {
        let format = CSVOutFormat.DEFAULT
        let csvPrint = CSVPrinter(format)
        let sb = StringBuilder()

        csvPrint.printWithEscapes("abc".toRuneArray(), sb)
        @Expect(sb.toString(),#"abc"#)
        sb.reset()

        csvPrint.printWithEscapes(#"a,b\c"#.toRuneArray(), sb)
        var result = sb.toString() == #"a\,b\\c"#
        @Expect(result,true)
        sb.reset()

        csvPrint.printWithEscapes("a\r\nb\nc".toRuneArray(), sb)
        result = sb.toString() == #"a\r\nb\nc"#
        @Expect(result,true)
        sb.reset()
    }

    @TestCase
    public func testPrintWithSpecialDelimiter(): Unit {
        var format = CSVOutFormat.DEFAULT.setDelimiter("**")
        let csvPrint = CSVPrinter(format)
        let sb = StringBuilder()

        csvPrint.printWithEscapes("abc".toRuneArray(), sb)
        @Expect(sb.toString(),#"abc"#)
        sb.reset()

        csvPrint.printWithEscapes(#"a**b**c*d"#.toRuneArray(), sb)
        var result = sb.toString() == #"a\*\*b\*\*c*d"#
        @Expect(result,true)
        sb.reset()

        csvPrint.printWithQuote(#"a**b**c*d"#.toRuneArray(), sb)
        result = sb.toString() == #""a**b**c*d""#
        @Expect(result,true)
        sb.reset()
    }

    @TestCase
    public func testPrintCommon(): Unit {
        var format = CSVOutFormat.DEFAULT
        let csvPrint = CSVPrinter(format)
        let sb = StringBuilder()

        csvPrint.print(["abc", "123", "-=@$%"], sb)
        @Expect(sb.toString(),#"abc,123,-=@$%"#)
        sb.reset()

        let list = [" trim   ", #"""#, ",", "\\"]
        csvPrint.print(list, sb)

        @Expect(sb.toString(),#"trim,"\"",",","\\""#)
        sb.reset()
    }
}