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