Files
UUVPN/iOS-SwiftUI-Code/GRDB.swift-6.29.3/Tests/Crash/DatabaseValueConvertibleCrashTests.swift

88 lines
3.4 KiB
Swift

import XCTest
import GRDB
// A type that adopts DatabaseValueConvertible but does not adopt StatementColumnConvertible
private struct IntConvertible: DatabaseValueConvertible {
let int: Int
init(int: Int) {
self.int = int
}
var databaseValue: DatabaseValue { int.databaseValue }
static func fromDatabaseValue(_ dbValue: DatabaseValue) -> IntConvertible? {
guard let int = Int.fromDatabaseValue(dbValue) else {
return nil
}
return IntConvertible(int: int)
}
}
class DatabaseValueConvertibleCrashTests: GRDBCrashTestCase {
func testCrashFetchDatabaseValueConvertibleFromStatement() {
assertCrash("could not convert NULL to IntConvertible.") {
try dbQueue.inDatabase { db in
try db.execute(sql: "CREATE TABLE ints (int Int)")
try db.execute(sql: "INSERT INTO ints (int) VALUES (1)")
try db.execute(sql: "INSERT INTO ints (int) VALUES (NULL)")
let statement = try db.makeStatement(sql: "SELECT int FROM ints ORDER BY int")
let sequence = IntConvertible.fetch(statement)
for _ in sequence { }
}
}
}
func testCrashFetchAllDatabaseValueConvertibleFromStatement() {
assertCrash("could not convert NULL to IntConvertible.") {
try dbQueue.inDatabase { db in
try db.execute(sql: "CREATE TABLE ints (int Int)")
try db.execute(sql: "INSERT INTO ints (int) VALUES (1)")
try db.execute(sql: "INSERT INTO ints (int) VALUES (NULL)")
let statement = try db.makeStatement(sql: "SELECT int FROM ints ORDER BY int")
_ = IntConvertible.fetchAll(statement)
}
}
}
func testCrashFetchDatabaseValueConvertibleFromDatabase() {
assertCrash("could not convert NULL to IntConvertible.") {
try dbQueue.inDatabase { db in
try db.execute(sql: "CREATE TABLE ints (int Int)")
try db.execute(sql: "INSERT INTO ints (int) VALUES (1)")
try db.execute(sql: "INSERT INTO ints (int) VALUES (NULL)")
let sequence = IntConvertible.fetch(db, "SELECT int FROM ints ORDER BY int")
for _ in sequence { }
}
}
}
func testCrashFetchAllDatabaseValueConvertibleFromDatabase() {
assertCrash("could not convert NULL to IntConvertible.") {
try dbQueue.inDatabase { db in
try db.execute(sql: "CREATE TABLE ints (int Int)")
try db.execute(sql: "INSERT INTO ints (int) VALUES (1)")
try db.execute(sql: "INSERT INTO ints (int) VALUES (NULL)")
_ = IntConvertible.fetchAll(db, sql: "SELECT int FROM ints ORDER BY int")
}
}
}
func testCrashDatabaseValueConvertibleInvalidConversionFromNULL() {
assertCrash("could not convert NULL to IntConvertible.") {
let row = Row(["int": nil])
_ = row["int"] as IntConvertible
}
}
func testCrashDatabaseValueConvertibleInvalidConversionFromInvalidType() {
assertCrash("could not convert \"foo\" to IntConvertible") {
let row = Row(["int": "foo"])
_ = row["int"] as IntConvertible
}
}
}