CSV/Tests/CSVTests/EncoderTests.swift

96 lines
3.0 KiB
Swift

import XCTest
import CSV
final class EncoderTests: XCTestCase {
func testAsyncEncode() throws {
var rows: [[UInt8]] = []
let encoder = CSVEncoder().async { row in rows.append(row) }
for person in people {
try encoder.encode(person)
}
let string = String(decoding: Array(rows.joined(separator: [10])), as: UTF8.self)
XCTAssertEqual(string, expected)
}
func testMeasureAsyncEncode() {
// 0.543
measure {
for _ in 0..<10_000 {
let encoder = CSVEncoder().async { _ in return }
do {
try people.forEach(encoder.encode)
} catch let error as EncodingError {
XCTFail(error.failureReason ?? "No failure reason")
error.errorDescription.map { print($0) }
error.recoverySuggestion.map { print($0) }
} catch let error {
XCTFail(error.localizedDescription)
}
}
}
}
func testSyncEncode() throws {
let encoder = CSVEncoder().sync
let encoded = try encoder.encode(people)
let string = String(decoding: encoded, as: UTF8.self)
XCTAssertEqual(string, expected)
}
func testMeasureSyncEncode() {
// 0.621
measure {
for _ in 0..<10_000 {
let encoder = CSVEncoder().sync
do {
_ = try encoder.encode(people)
} catch let error as EncodingError {
XCTFail(error.failureReason ?? "No failure reason")
error.errorDescription.map { print($0) }
error.recoverySuggestion.map { print($0) }
} catch let error {
XCTFail(error.localizedDescription)
}
}
}
}
}
fileprivate struct Person: Codable, Equatable {
let firstName: String
let lastName: String?
let age: Int
let gender: Gender
let tagLine: String?
enum Gender: String, Codable {
case female = "F"
case male = "M"
}
enum CodingKeys: String, CodingKey {
case firstName = "first name"
case lastName = "last_name"
case age
case gender
case tagLine
}
}
fileprivate let people = [
Person(firstName: "Caleb", lastName: "Kleveter", age: 18, gender: .male, tagLine: "😜"),
Person(firstName: "Benjamin", lastName: "Franklin", age: 269, gender: .male, tagLine: "A penny saved is a penny earned"),
Person(firstName: "Doc", lastName: "Holliday", age: 174, gender: .male, tagLine: "Bang"),
Person(firstName: "Grace", lastName: "Hopper", age: 119, gender: .female, tagLine: nil),
Person(
firstName: "Anne", lastName: "Shirley", age: 141, gender: .female,
tagLine: "God's in His heaven,\nall's right with the world"
),
Person(firstName: "TinTin", lastName: nil, age: 16, gender: .male, tagLine: "Great snakes!")
]