113 lines
3.9 KiB
Swift
113 lines
3.9 KiB
Swift
import CSV
|
|
import XCTest
|
|
|
|
final class ParserTests: XCTestCase {
|
|
func testParserInit() {
|
|
let parser = Parser(onHeader: nil, onCell: nil)
|
|
|
|
XCTAssert(parser.onCell == nil)
|
|
XCTAssert(parser.onHeader == nil)
|
|
}
|
|
|
|
func testParserParse() {
|
|
var headers: [String] = []
|
|
var cells: [String: [String?]] = [:]
|
|
|
|
var parser = Parser(
|
|
onHeader: { header in
|
|
if let title = String(bytes: header, encoding: .utf8) {
|
|
headers.append(title)
|
|
}
|
|
},
|
|
onCell: { header, cell in
|
|
if let title = String(bytes: header, encoding: .utf8) {
|
|
let contents = cell.count > 0 ? String(bytes: cell, encoding: .utf8) : nil
|
|
cells[title, default: []].append(contents)
|
|
}
|
|
}
|
|
)
|
|
let csv = Array(data.utf8)
|
|
|
|
parser.parse(csv)
|
|
|
|
XCTAssertEqual(headers, ["first name", "last_name", "age", "gender", "tagLine"])
|
|
XCTAssertEqual(cells["first name"], ["Caleb", "Benjamin", "Doc", "Grace", "Anne", "TinTin"])
|
|
XCTAssertEqual(cells["last_name"], ["Kleveter", "Franklin", "Holliday", "Hopper", "Shirley", nil])
|
|
XCTAssertEqual(cells["age"], ["18", "269", "174", "119", "141", "16"])
|
|
XCTAssertEqual(cells["gender"], ["M", "M", "M", "F", "F", "M"])
|
|
XCTAssertEqual(cells["tagLine"], [
|
|
"😜",
|
|
"A penny saved is a penny earned",
|
|
"Bang",
|
|
nil,
|
|
"God's in His heaven,\nall's right with the world",
|
|
"Great snakes!"
|
|
])
|
|
}
|
|
|
|
func testChunkedParsing() {
|
|
var headers: [String] = []
|
|
var cells: [String: [String?]] = [:]
|
|
|
|
var parser = Parser(
|
|
onHeader: { header in
|
|
if let title = String(bytes: header, encoding: .utf8) {
|
|
headers.append(title)
|
|
}
|
|
},
|
|
onCell: { header, cell in
|
|
if let title = String(bytes: header, encoding: .utf8) {
|
|
let contents = cell.count > 0 ? String(bytes: cell, encoding: .utf8) : nil
|
|
cells[title, default: []].append(contents)
|
|
}
|
|
}
|
|
)
|
|
|
|
for chunk in chunks {
|
|
let data = Array(chunk.utf8)
|
|
parser.parse(data, length: 270)
|
|
}
|
|
|
|
XCTAssertEqual(chunks.reduce(into: "", { $0.append($1) }), data)
|
|
|
|
XCTAssertEqual(headers, ["first name", "last_name", "age", "gender", "tagLine"])
|
|
XCTAssertEqual(cells["first name"], ["Caleb", "Benjamin", "Doc", "Grace", "Anne", "TinTin"])
|
|
XCTAssertEqual(cells["last_name"], ["Kleveter", "Franklin", "Holliday", "Hopper", "Shirley", nil])
|
|
XCTAssertEqual(cells["age"], ["18", "269", "174", "119", "141", "16"])
|
|
XCTAssertEqual(cells["gender"], ["M", "M", "M", "F", "F", "M"])
|
|
XCTAssertEqual(cells["tagLine"], [
|
|
"😜",
|
|
"A penny saved is a penny earned",
|
|
"Bang",
|
|
nil,
|
|
"God's in His heaven,\nall's right with the world",
|
|
"Great snakes!"
|
|
])
|
|
}
|
|
|
|
func testMeasureFullParse() {
|
|
var parser = Parser(onHeader: { _ in return }, onCell: { _, _ in return })
|
|
let csv = Array(data.utf8)
|
|
|
|
// 0.900
|
|
measure {
|
|
for _ in 0..<100_000 {
|
|
parser.parse(csv)
|
|
}
|
|
}
|
|
}
|
|
|
|
func testMeasureChunkedParse() {
|
|
var parser = Parser(onHeader: { _ in return }, onCell: { _, _ in return })
|
|
let chnks = chunks.map { Array($0.utf8) }
|
|
let length = chnks.reduce(0) { $0 + $1.count }
|
|
|
|
// 1.198
|
|
measure {
|
|
for _ in 0..<100_000 {
|
|
chnks.forEach { chunk in parser.parse(chunk, length: length) }
|
|
}
|
|
}
|
|
}
|
|
}
|