2ea282e6创建于 2025年1月21日历史提交
package csv4cj

import std.unittest.*
import std.unittest.testmacro.*
import std.posix.*
import std.time.*
import std.io.*
import std.fs.*

@Test
public class CSVReaderTest {
    @TestCase
    public func testLookAHead(): Unit {
        let content = "hello,仓颉"
        let readerStream = StringStream(content)

        let reader = CSVReader(readerStream)

        let ahead = reader.lookAhead()

        @Assert(ahead.isSome())
        @Expect( ahead.getOrThrow(),r'h')

        let buf: Array<Rune> = Array<Rune>(10, item: Constants.DISABLED)
        let count = reader.lookAhead(buf)
        @Assert(count,8)
        let value = String(buf[0..=7])
        @Expect( value,content)
    }

    @TestCase
    public func testSimpleRead(): Unit {
        let content = "A2*%@><z+-"
        let contentRuneArray = content.toRuneArray()
        let readerStream = StringStream(content)

        let reader = CSVReader(readerStream)

        var index = 0
        while (index < contentRuneArray.size) {
            let readChr = if (let Some(value) <- reader.read()) {
                value
            } else {
                Constants.DISABLED
            }

            @Expect(readChr,contentRuneArray[index])
            index++
        }

        let tmpChr = if (let Some(value) <- reader.read()) {
            value
        } else {
            Constants.DISABLED
        }

        @Expect(tmpChr ,Constants.DISABLED)
    }

    @TestCase
    public func testExtraRead(): Unit {
        let content = "\r\n\".,"
        let contentRuneArray = content.toRuneArray()

        let readerStream = StringStream(content)

        let reader = CSVReader(readerStream)

        var index = 0
        while (index < contentRuneArray.size) {
            let readChr = if (let Some(value) <- reader.read()) {
                value
            } else {
                Constants.DISABLED
            }
            @Expect(readChr,contentRuneArray[index])
            index++
        }
    }

    @TestCase
    public func testLineNumber(): Unit {
        let content = "你好,仓颉\r\nhello cangjie\ncsv4cj是开源的csv文件处理库"
        let readerStream = StringStream(content)

        let reader = CSVReader(readerStream)

        var readChr = reader.read()
        var index = 0
        while (readChr.isSome()) {
            let realChr = readChr.getOrThrow()
            if (index == 0) {
                @Assert(realChr,r'你')
                @Expect( reader.getCurrentLineNumber(),1)
            } else if (index == 7) {
                @Assert(realChr,r'h')
                @Expect( reader.getCurrentLineNumber(),2)
            }
            index++
            readChr = reader.read()
        }

        @Assert(index,39)
        @Expect( reader.getCurrentLineNumber(),3)
    }

    @TestCase
    public func testLineNumberWithEmpty(): Unit {
        let content = "ab,\r\n12\n\r\n#注释\r\n仓颉"
        let readerStream = StringStream(content)
        let reader = CSVReader(readerStream)
        @Assert(reader.getCurrentLineNumber(),0)
        reader.read() //a
        @Assert(reader.getCurrentLineNumber(),1)
        reader.read() //b
        reader.read() //,
        reader.read() //\r
        @Assert(reader.getCurrentLineNumber(),1)
        reader.read() //\n
        @Assert(reader.getCurrentLineNumber(),1)
        reader.read() //1
        @Assert(reader.getCurrentLineNumber(),2)
        reader.read() //2
        reader.read() //\n
        @Assert(reader.getCurrentLineNumber(),2)
        reader.read() //\r
        @Assert(reader.getCurrentLineNumber(),3)
        reader.read() //\n
        @Assert(reader.getCurrentLineNumber(),3)
        reader.readLine()
        @Assert(reader.getCurrentLineNumber(),3)
        reader.read() //仓
        @Assert(reader.getCurrentLineNumber(),4)
        reader.read() //颉
        @Assert(reader.getCurrentLineNumber(),4)
        reader.read()
        @Assert(reader.getCurrentLineNumber(),4)
    }

    @TestCase
    public func testReadArray(): Unit {
        var cr01 = CSVReader(StringStream("kimi,12,男, hangzhou"))
        var buf01 = Array<Rune>(3, repeat: r'c')

        cr01.read(buf01, 1, 3)
        let buf02: Array<Rune> = [r'c', r'k', r'i']
        @Assert(buf01, buf02)
    }

    @TestCase
    public func testReadLine(): Unit {
        var content = ""
        var readerStream = StringStream(content)
        var reader = CSVReader(readerStream)
        var line = reader.readLine()
        @Expect(line.isNone())

        @Expect(isReadLineMatch("abc", "abc"))

        @Expect(isReadLineMatch("你好\n仓颉", "你好"))

        @Expect(isReadLineMatch("cangjie\r仓颉", "cangjie"))

        @Expect(isReadLineMatch("Hello\r\n仓颉", "Hello"))
    }

    func isReadLineMatch(content: String, matchValue: String): Bool {
        var readerStream = StringStream(content)
        var reader = CSVReader(readerStream)
        var line = reader.readLine()
        if (let Some(value) <- line) {
            return value == matchValue
        }

        return false
    }

    @TestCase
    public func testEndOfStream(): Unit {
        let content = ###"姓名,  性   别,籍  贯,学校,  年 龄,
张三,男,陕 西 省,  北京     大学  ,25,
李四,女,江西省,三峡大学,24,"###
        let contentRuneArray = content.toRuneArray()

        let readerStream = StringStream(content)

        var reader = CSVReader(readerStream)
        for (index in 0..contentRuneArray.size) {
            reader.read()
            @Assert(reader.getIsEndOfStream(),false)
        }

        @Assert(reader.read().isNone())
        @Assert(reader.getIsEndOfStream())

        let fileName = getcwd() + "/" + DateTime.now().toString("yyyyMMddHHmmss") + ".log"
        let sw = StringWriter(File(fileName, OpenMode.Append))
        sw.write(content)
        sw.flush()

        let stream = UTF8ReaderStream(File(fileName, OpenMode.Read))

        reader = CSVReader(stream)
        for (index in 0..contentRuneArray.size) {
            reader.read()
            @Assert(reader.getIsEndOfStream(),false)
        }

        @Assert(reader.read().isNone())
        @Assert(reader.getIsEndOfStream())
    }

    @TestCase
    public func testLastChar(): Unit {
        let content = "kimi,12,男,hangzhou\nkimi,03,男"
        let readerStream = StringStream(content)

        var reader = CSVReader(readerStream)

        @Assert(reader.getLastChar(),Option.None)

        reader.read()
        @Assert(reader.getLastChar().getOrThrow(),r'k')

        for (i in 0..4) {
            reader.read()
        }
        @Assert(reader.getLastChar().getOrThrow(),r',')

        for (i in 0..4) {
            reader.read()
        }
        @Assert(reader.getLastChar().getOrThrow(),r'男')

        for (i in 0..10) {
            reader.read()
        }
        @Assert(reader.getLastChar().getOrThrow(),r'\n')

        for (i in 0..9) {
            reader.read()
        }
        @Assert(reader.getLastChar().getOrThrow(),r'男')

        reader.read()
        @Assert(reader.getLastChar(),Option.None)

        let fileName = getcwd() + "/" + DateTime.now().toString("yyyyMMddHHmmss") + ".txt"
        let sw = StringWriter(File(fileName, OpenMode.Append))
        sw.write(content)
        sw.flush()

        let stream = UTF8ReaderStream(File(fileName, OpenMode.Read))
        reader = CSVReader(stream)

        @Assert(reader.getLastChar(),Option.None)

        reader.read()
        @Assert(reader.getLastChar().getOrThrow(),r'k')

        for (i in 0..4) {
            reader.read()
        }
        @Assert(reader.getLastChar().getOrThrow(),r',')

        for (i in 0..4) {
            reader.read()
        }
        @Assert(reader.getLastChar().getOrThrow(),r'男')

        for (i in 0..10) {
            reader.read()
        }
        @Assert(reader.getLastChar().getOrThrow(),r'\n')

        for (i in 0..9) {
            reader.read()
        }
        @Assert(reader.getLastChar().getOrThrow(),r'男')

        reader.read()
        @Assert(reader.getLastChar(),Option.None)
    }
}