120 lines
6.3 KiB
Swift
120 lines
6.3 KiB
Swift
import XCTest
|
|
import GRDB
|
|
|
|
class DatabaseValueTests: GRDBTestCase {
|
|
|
|
func testDatabaseValueAsDatabaseValueConvertible() throws {
|
|
let dbQueue = try makeDatabaseQueue()
|
|
try dbQueue.inDatabase { db in
|
|
XCTAssertEqual(try DatabaseValue.fetchOne(db, sql: "SELECT 1")!.storage, DatabaseValue.Storage.int64(1))
|
|
XCTAssertEqual(try DatabaseValue.fetchOne(db, sql: "SELECT 1.0")!.storage, DatabaseValue.Storage.double(1))
|
|
XCTAssertEqual(try DatabaseValue.fetchOne(db, sql: "SELECT 'foo'")!.storage, DatabaseValue.Storage.string("foo"))
|
|
XCTAssertEqual(try DatabaseValue.fetchOne(db, sql: "SELECT x'53514C697465'")!.storage, DatabaseValue.Storage.blob("SQLite".data(using: .utf8)!))
|
|
XCTAssertTrue(try DatabaseValue.fetchOne(db, sql: "SELECT NULL")!.isNull)
|
|
}
|
|
}
|
|
|
|
func testDatabaseValueCanBeUsedAsStatementArgument() throws {
|
|
let dbQueue = try makeDatabaseQueue()
|
|
try dbQueue.inDatabase { db in
|
|
try db.execute(sql: "CREATE TABLE integers (integer INTEGER)")
|
|
try db.execute(sql: "INSERT INTO integers (integer) VALUES (1)")
|
|
let dbValue: DatabaseValue = 1.databaseValue
|
|
let count = try Int.fetchOne(db, sql: "SELECT COUNT(*) FROM integers WHERE integer = ?", arguments: [dbValue])!
|
|
XCTAssertEqual(count, 1)
|
|
}
|
|
}
|
|
|
|
func testDatabaseValueEquatable() {
|
|
let fooData = "foo".data(using: .utf8)!
|
|
let barData = "bar".data(using: .utf8)!
|
|
|
|
// Any integer up to 2^53 has an exact representation as a IEEE-754 double
|
|
let twoPower53 = Int64(1) << 53
|
|
|
|
XCTAssertEqual(DatabaseValue.null, DatabaseValue.null)
|
|
XCTAssertNotEqual(DatabaseValue.null, 1.databaseValue)
|
|
XCTAssertNotEqual(DatabaseValue.null, 1.0.databaseValue)
|
|
XCTAssertNotEqual(DatabaseValue.null, "foo".databaseValue)
|
|
XCTAssertNotEqual(DatabaseValue.null, fooData.databaseValue)
|
|
|
|
XCTAssertNotEqual(1.databaseValue, DatabaseValue.null)
|
|
XCTAssertEqual(1.databaseValue, 1.databaseValue)
|
|
XCTAssertNotEqual(1.databaseValue, 2.databaseValue)
|
|
XCTAssertEqual(1.databaseValue, 1.0.databaseValue)
|
|
XCTAssertNotEqual(1.databaseValue, 1.1.databaseValue)
|
|
XCTAssertNotEqual(1.databaseValue, 2.0.databaseValue)
|
|
XCTAssertEqual((twoPower53 - 1).databaseValue, Double(twoPower53 - 1).databaseValue)
|
|
XCTAssertEqual(twoPower53.databaseValue, Double(twoPower53).databaseValue)
|
|
XCTAssertNotEqual((twoPower53 + 1).databaseValue, Double(twoPower53 + 1).databaseValue)
|
|
XCTAssertEqual((Int64(1) << 54).databaseValue, Double(Int64(1) << 54).databaseValue)
|
|
XCTAssertNotEqual(Int64.max.databaseValue, Double(Int64.max).databaseValue)
|
|
XCTAssertNotEqual(1.databaseValue, "foo".databaseValue)
|
|
XCTAssertNotEqual(1.databaseValue, "1".databaseValue)
|
|
XCTAssertNotEqual(1.databaseValue, "1.0".databaseValue)
|
|
XCTAssertNotEqual(1.databaseValue, fooData.databaseValue)
|
|
|
|
XCTAssertNotEqual(1.0.databaseValue, DatabaseValue.null)
|
|
XCTAssertEqual(1.0.databaseValue, 1.databaseValue)
|
|
XCTAssertNotEqual(1.1.databaseValue, 1.databaseValue)
|
|
XCTAssertNotEqual(1.0.databaseValue, 2.databaseValue)
|
|
XCTAssertEqual(1.0.databaseValue, 1.0.databaseValue)
|
|
XCTAssertNotEqual(1.0.databaseValue, 2.0.databaseValue)
|
|
XCTAssertEqual(Double(twoPower53 - 1).databaseValue, (twoPower53 - 1).databaseValue)
|
|
XCTAssertEqual(Double(twoPower53).databaseValue, twoPower53.databaseValue)
|
|
XCTAssertNotEqual(Double(twoPower53 + 1).databaseValue, (twoPower53 + 1).databaseValue)
|
|
XCTAssertEqual(Double(Int64(1) << 54).databaseValue, (Int64(1) << 54).databaseValue)
|
|
XCTAssertNotEqual(Double(Int64.max).databaseValue, Int64.max.databaseValue)
|
|
XCTAssertNotEqual(1.0.databaseValue, "foo".databaseValue)
|
|
XCTAssertNotEqual(1.0.databaseValue, "1".databaseValue)
|
|
XCTAssertNotEqual(1.0.databaseValue, "1.0".databaseValue)
|
|
XCTAssertNotEqual(1.0.databaseValue, fooData.databaseValue)
|
|
|
|
XCTAssertNotEqual("foo".databaseValue, DatabaseValue.null)
|
|
XCTAssertNotEqual("foo".databaseValue, 1.databaseValue)
|
|
XCTAssertNotEqual("foo".databaseValue, 1.0.databaseValue)
|
|
XCTAssertEqual("foo".databaseValue, "foo".databaseValue)
|
|
XCTAssertNotEqual("foo".databaseValue, "bar".databaseValue)
|
|
XCTAssertNotEqual("foo".databaseValue, fooData.databaseValue)
|
|
|
|
XCTAssertNotEqual(fooData.databaseValue, DatabaseValue.null)
|
|
XCTAssertNotEqual(fooData.databaseValue, 1.databaseValue)
|
|
XCTAssertNotEqual(fooData.databaseValue, 1.0.databaseValue)
|
|
XCTAssertNotEqual(fooData.databaseValue, "foo".databaseValue)
|
|
XCTAssertEqual(fooData.databaseValue, fooData.databaseValue)
|
|
XCTAssertNotEqual(fooData.databaseValue, barData.databaseValue)
|
|
}
|
|
|
|
func testDatabaseValueHash() {
|
|
// Equal => Same hash
|
|
let intValue = 1.databaseValue
|
|
let doubleValue = 1.0.databaseValue
|
|
XCTAssertEqual(intValue, doubleValue)
|
|
XCTAssertEqual(intValue.hashValue, doubleValue.hashValue)
|
|
|
|
let string1 = "foo".databaseValue
|
|
let string2 = "foo".databaseValue
|
|
XCTAssertEqual(string1, string2)
|
|
XCTAssertEqual(string1.hashValue, string2.hashValue)
|
|
|
|
let fooData1 = "foo".data(using: .utf8)!.databaseValue
|
|
let fooData2 = "foo".data(using: .utf8)!.databaseValue
|
|
XCTAssertEqual(fooData1, fooData2)
|
|
XCTAssertEqual(fooData1.hashValue, fooData2.hashValue)
|
|
}
|
|
|
|
func testDatabaseValueDescription() {
|
|
let databaseValue_Null = DatabaseValue.null
|
|
let databaseValue_Int64 = Int64(1).databaseValue
|
|
let databaseValue_Double = Double(100000.1).databaseValue
|
|
let databaseValue_String = "foo\n\t\r".databaseValue
|
|
let databaseValue_Data = "foo".data(using: .utf8)!.databaseValue
|
|
|
|
XCTAssertEqual(databaseValue_Null.description, "NULL")
|
|
XCTAssertEqual(databaseValue_Int64.description, "1")
|
|
XCTAssertEqual(databaseValue_Double.description, "100000.1")
|
|
XCTAssertEqual(databaseValue_String.description, "\"foo\\n\\t\\r\"")
|
|
XCTAssertEqual(databaseValue_Data.description, "Data(3 bytes)") // may be fragile
|
|
}
|
|
}
|