Files
data-lite-coder/Tests/DLCEncoderTests/SingleRowEncoderTests.swift

165 lines
5.3 KiB
Swift

import XCTest
import DataLiteCore
import DLCCommon
@testable import DLCEncoder
final class SingleRowEncoderTests: XCTestCase {
func testSetValueForKey() throws {
let encoder = SingleRowEncoder(
dateEncoder: MockDateEncoder(),
codingPath: [],
userInfo: [:]
)
try encoder.set(SQLiteRawValue.int(42), for: CodingKeys.key1)
try encoder.set(SQLiteRawValue.real(3.14), for: CodingKeys.key2)
XCTAssertEqual(encoder.sqliteData[CodingKeys.key1], .int(42))
XCTAssertEqual(encoder.sqliteData[CodingKeys.key2], .real(3.14))
XCTAssertEqual(encoder.count, encoder.sqliteData.count)
}
func testSetInvalidValueForKey() {
let value = "Test Value"
let path = [CodingKeys.key1]
let encoder = SingleRowEncoder(
dateEncoder: MockDateEncoder(),
codingPath: path,
userInfo: [:]
)
XCTAssertThrowsError(
try encoder.set(value, for: CodingKeys.key2)
) { error in
guard case let EncodingError.invalidValue(thrownValue, context) = error else {
return XCTFail("Expected EncodingError.invalidValue, got \(error)")
}
XCTAssertEqual(thrownValue as? String, value)
XCTAssertEqual(context.codingPath as? [CodingKeys], path + [.key2])
XCTAssertEqual(context.debugDescription, "The value does not match SQLiteRawValue")
}
}
func testEncodeNilForKey() throws {
let encoder = SingleRowEncoder(
dateEncoder: MockDateEncoder(),
codingPath: [],
userInfo: [:]
)
try encoder.encodeNil(for: CodingKeys.key1)
XCTAssertEqual(encoder.sqliteData[CodingKeys.key1], .null)
XCTAssertEqual(encoder.count, encoder.sqliteData.count)
}
func testEncodeDateForKey() throws {
let date = Date()
let mockDateEncoder = MockDateEncoder()
let encoder = SingleRowEncoder(
dateEncoder: mockDateEncoder,
codingPath: [],
userInfo: [:]
)
try encoder.encodeDate(date, for: CodingKeys.key1)
XCTAssertTrue(mockDateEncoder.didCallEncode)
XCTAssertEqual(encoder.sqliteData[CodingKeys.key1], date.sqliteRawValue)
XCTAssertEqual(encoder.count, encoder.sqliteData.count)
}
func testEncodeValueForKey() throws {
let encoder = SingleRowEncoder(
dateEncoder: MockDateEncoder(),
codingPath: [],
userInfo: [:]
)
try encoder.encode(123, for: CodingKeys.key1)
try encoder.encode(3.14, for: CodingKeys.key2)
try encoder.encode("Hello", for: CodingKeys.key3)
XCTAssertEqual(encoder.sqliteData[CodingKeys.key1], .int(123))
XCTAssertEqual(encoder.sqliteData[CodingKeys.key2], .real(3.14))
XCTAssertEqual(encoder.sqliteData[CodingKeys.key3], .text("Hello"))
XCTAssertEqual(encoder.count, encoder.sqliteData.count)
}
func testEncoderForKey() throws {
let path = [CodingKeys.key1]
let encoder = SingleRowEncoder(
dateEncoder: MockDateEncoder(),
codingPath: path,
userInfo: [:]
)
let key = CodingKeys.key2
let nestedEncoder = try encoder.encoder(for: key)
XCTAssertTrue(nestedEncoder is SingleValueEncoder)
XCTAssertEqual(nestedEncoder.codingPath as? [CodingKeys], path + [key])
}
func testKeyedContainer() {
let path = [CodingKeys.key1]
let encoder = SingleRowEncoder(
dateEncoder: MockDateEncoder(),
codingPath: path,
userInfo: [:]
)
let container = encoder.container(keyedBy: CodingKeys.self)
XCTAssertEqual(container.codingPath as? [CodingKeys], path)
}
func testUnkeyedContainer() {
let path = [CodingKeys.key1]
let encoder = SingleRowEncoder(
dateEncoder: MockDateEncoder(),
codingPath: path,
userInfo: [:]
)
let container = encoder.unkeyedContainer()
XCTAssertTrue(container is FailedEncodingContainer<RowCodingKey>)
XCTAssertEqual(container.codingPath as? [CodingKeys], path)
}
func testSingleValueContainer() {
let path = [CodingKeys.key1]
let encoder = SingleRowEncoder(
dateEncoder: MockDateEncoder(),
codingPath: path,
userInfo: [:]
)
let container = encoder.singleValueContainer()
XCTAssertTrue(container is FailedEncodingContainer<RowCodingKey>)
XCTAssertEqual(container.codingPath as? [CodingKeys], path)
}
}
private extension SingleRowEncoderTests {
enum CodingKeys: CodingKey {
case key1
case key2
case key3
}
final class MockDateEncoder: DateEncoder {
private(set) var didCallEncode = false
func encode(
_ date: Date,
to encoder: any ValueEncoder
) throws {
fatalError()
}
func encode(
_ date: Date,
for key: any CodingKey,
to encoder: any RowEncoder
) throws {
didCallEncode = true
try encoder.encode(date, for: key)
}
}
}