123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681 |
- import XCTest
- import RealmSwift
- import Realm
- import Realm.Dynamic
- import Foundation
- @discardableResult
- private func realmWithSingleClassProperties(_ fileURL: URL, className: String, properties: [AnyObject]) -> RLMRealm {
- let schema = RLMSchema()
- let objectSchema = RLMObjectSchema(className: className, objectClass: MigrationObject.self, properties: properties)
- schema.objectSchema = [objectSchema]
- let config = RLMRealmConfiguration()
- config.fileURL = fileURL
- config.customSchema = schema
- return try! RLMRealm(configuration: config)
- }
- private func dynamicRealm(_ fileURL: URL) -> RLMRealm {
- let config = RLMRealmConfiguration()
- config.fileURL = fileURL
- config.dynamic = true
- return try! RLMRealm(configuration: config)
- }
- class MigrationTests: TestCase {
-
-
- private func createAndTestRealmAtURL(_ fileURL: URL) {
- autoreleasepool {
- _ = try! Realm(fileURL: fileURL)
- return
- }
- XCTAssertEqual(0, try! schemaVersionAtURL(fileURL), "Initial version should be 0")
- }
-
- private func migrateAndTestRealm(_ fileURL: URL, shouldRun: Bool = true, schemaVersion: UInt64 = 1,
- autoMigration: Bool = false, block: MigrationBlock? = nil) {
- var didRun = false
- let config = Realm.Configuration(fileURL: fileURL, schemaVersion: schemaVersion,
- migrationBlock: { migration, oldSchemaVersion in
- if let block = block {
- block(migration, oldSchemaVersion)
- }
- didRun = true
- return
- })
- if autoMigration {
- autoreleasepool {
- _ = try! Realm(configuration: config)
- }
- } else {
- try! Realm.performMigration(for: config)
- }
- XCTAssertEqual(didRun, shouldRun)
- }
- private func migrateAndTestDefaultRealm(_ schemaVersion: UInt64 = 1, block: @escaping MigrationBlock) {
- migrateAndTestRealm(defaultRealmURL(), schemaVersion: schemaVersion, block: block)
- let config = Realm.Configuration(fileURL: defaultRealmURL(),
- schemaVersion: schemaVersion)
- Realm.Configuration.defaultConfiguration = config
- }
-
- func testSetDefaultRealmSchemaVersion() {
- createAndTestRealmAtURL(defaultRealmURL())
- var didRun = false
- let config = Realm.Configuration(fileURL: defaultRealmURL(), schemaVersion: 1,
- migrationBlock: { _, _ in didRun = true })
- Realm.Configuration.defaultConfiguration = config
- try! Realm.performMigration()
- XCTAssertEqual(didRun, true)
- XCTAssertEqual(1, try! schemaVersionAtURL(defaultRealmURL()))
- }
- func testSetSchemaVersion() {
- createAndTestRealmAtURL(testRealmURL())
- migrateAndTestRealm(testRealmURL())
- XCTAssertEqual(1, try! schemaVersionAtURL(testRealmURL()))
- }
- func testSchemaVersionAtURL() {
- assertFails(.fail) {
-
- try schemaVersionAtURL(defaultRealmURL())
- }
- _ = try! Realm()
- XCTAssertEqual(0, try! schemaVersionAtURL(defaultRealmURL()),
- "Initial version should be 0")
- do {
- _ = try schemaVersionAtURL(URL(fileURLWithPath: "/dev/null"))
- XCTFail("Expected .filePermissionDenied or .fileAccess, but no error was raised")
- } catch Realm.Error.filePermissionDenied {
-
- } catch Realm.Error.fileAccess {
-
- } catch {
- XCTFail("Expected .filePermissionDenied or .fileAccess, got \(error)")
- }
- }
- func testMigrateRealm() {
- createAndTestRealmAtURL(testRealmURL())
-
- migrateAndTestRealm(testRealmURL(), shouldRun: true, autoMigration: false)
-
- migrateAndTestRealm(testRealmURL(), shouldRun: false, autoMigration: false)
-
- migrateAndTestRealm(testRealmURL(), shouldRun: true, schemaVersion: 2, autoMigration: true)
- }
- func testMigrationProperties() {
- let prop = RLMProperty(name: "stringCol", type: RLMPropertyType.int, objectClassName: nil,
- linkOriginPropertyName: nil, indexed: false, optional: false)
- _ = autoreleasepool {
- realmWithSingleClassProperties(defaultRealmURL(), className: "SwiftStringObject", properties: [prop])
- }
- migrateAndTestDefaultRealm { migration, _ in
- XCTAssertEqual(migration.oldSchema.objectSchema.count, 1)
- XCTAssertGreaterThan(migration.newSchema.objectSchema.count, 1)
- XCTAssertEqual(migration.oldSchema.objectSchema[0].properties.count, 1)
- XCTAssertEqual(migration.newSchema["SwiftStringObject"]!.properties.count, 1)
- XCTAssertEqual(migration.oldSchema["SwiftStringObject"]!.properties[0].type, PropertyType.int)
- XCTAssertEqual(migration.newSchema["SwiftStringObject"]!["stringCol"]!.type, PropertyType.string)
- }
- }
- func testEnumerate() {
- autoreleasepool {
- _ = try! Realm()
- }
- migrateAndTestDefaultRealm { migration, _ in
- migration.enumerateObjects(ofType: "SwiftStringObject", { _, _ in
- XCTFail("No objects to enumerate")
- })
- migration.enumerateObjects(ofType: "NoSuchClass", { _, _ in })
- }
- autoreleasepool {
-
- try! Realm().write {
- try! Realm().create(SwiftStringObject.self, value: ["string"])
- return
- }
- }
- migrateAndTestDefaultRealm(2) { migration, _ in
- var count = 0
- migration.enumerateObjects(ofType: "SwiftStringObject", { oldObj, newObj in
- XCTAssertEqual(newObj!.objectSchema.className, "SwiftStringObject")
- XCTAssertEqual(oldObj!.objectSchema.className, "SwiftStringObject")
- XCTAssertEqual((newObj!["stringCol"] as! String), "string")
- XCTAssertEqual((oldObj!["stringCol"] as! String), "string")
- self.assertThrows(oldObj!["noSuchCol"] as! String)
- self.assertThrows(newObj!["noSuchCol"] as! String)
- count += 1
- })
- XCTAssertEqual(count, 1)
- }
- _ = autoreleasepool {
- try! Realm().write {
- try! Realm().create(SwiftArrayPropertyObject.self, value: ["string", [["array"]], [[2]]])
- }
- }
- migrateAndTestDefaultRealm(3) { migration, _ in
- migration.enumerateObjects(ofType: "SwiftArrayPropertyObject") { oldObject, newObject in
- XCTAssertTrue(oldObject! as AnyObject is MigrationObject)
- XCTAssertTrue(newObject! as AnyObject is MigrationObject)
- XCTAssertTrue(oldObject!["array"]! is List<MigrationObject>)
- XCTAssertTrue(newObject!["array"]! is List<MigrationObject>)
- }
- }
- autoreleasepool {
- try! Realm().write {
- let soo = SwiftOptionalObject()
- soo.optNSStringCol = "NSString"
- soo.optStringCol = "String"
- soo.optBinaryCol = Data()
- soo.optDateCol = Date()
- soo.optIntCol.value = 1
- soo.optInt8Col.value = 2
- soo.optInt16Col.value = 3
- soo.optInt32Col.value = 4
- soo.optInt64Col.value = 5
- soo.optFloatCol.value = 6.1
- soo.optDoubleCol.value = 7.2
- soo.optBoolCol.value = true
- try! Realm().add(soo)
- }
- }
- migrateAndTestDefaultRealm(4) { migration, _ in
- migration.enumerateObjects(ofType: "SwiftOptionalObject") { oldObject, newObject in
- XCTAssertTrue(oldObject! as AnyObject is MigrationObject)
- XCTAssertTrue(newObject! as AnyObject is MigrationObject)
- XCTAssertTrue(oldObject!["optNSStringCol"]! is NSString)
- XCTAssertTrue(newObject!["optNSStringCol"]! is NSString)
- XCTAssertTrue(oldObject!["optStringCol"]! is String)
- XCTAssertTrue(newObject!["optStringCol"]! is String)
- XCTAssertTrue(oldObject!["optBinaryCol"]! is Data)
- XCTAssertTrue(newObject!["optBinaryCol"]! is Data)
- XCTAssertTrue(oldObject!["optDateCol"]! is Date)
- XCTAssertTrue(newObject!["optDateCol"]! is Date)
- XCTAssertTrue(oldObject!["optIntCol"]! is Int)
- XCTAssertTrue(newObject!["optIntCol"]! is Int)
- XCTAssertTrue(oldObject!["optInt8Col"]! is Int)
- XCTAssertTrue(newObject!["optInt8Col"]! is Int)
- XCTAssertTrue(oldObject!["optInt16Col"]! is Int)
- XCTAssertTrue(newObject!["optInt16Col"]! is Int)
- XCTAssertTrue(oldObject!["optInt32Col"]! is Int)
- XCTAssertTrue(newObject!["optInt32Col"]! is Int)
- XCTAssertTrue(oldObject!["optInt64Col"]! is Int)
- XCTAssertTrue(newObject!["optInt64Col"]! is Int)
- XCTAssertTrue(oldObject!["optFloatCol"]! is Float)
- XCTAssertTrue(newObject!["optFloatCol"]! is Float)
- XCTAssertTrue(oldObject!["optDoubleCol"]! is Double)
- XCTAssertTrue(newObject!["optDoubleCol"]! is Double)
- XCTAssertTrue(oldObject!["optBoolCol"]! is Bool)
- XCTAssertTrue(newObject!["optBoolCol"]! is Bool)
- }
- }
- }
- func testEnumerateObjectsAfterDeleteObjects() {
- autoreleasepool {
-
- try! Realm().write {
- try! Realm().create(SwiftStringObject.self, value: ["1"])
- try! Realm().create(SwiftStringObject.self, value: ["2"])
- try! Realm().create(SwiftStringObject.self, value: ["3"])
- try! Realm().create(SwiftIntObject.self, value: [1])
- try! Realm().create(SwiftIntObject.self, value: [2])
- try! Realm().create(SwiftIntObject.self, value: [3])
- try! Realm().create(SwiftBoolObject.self, value: [true])
- try! Realm().create(SwiftBoolObject.self, value: [false])
- try! Realm().create(SwiftBoolObject.self, value: [true])
- }
- }
- migrateAndTestDefaultRealm(1) { migration, _ in
- var count = 0
- migration.enumerateObjects(ofType: "SwiftStringObject") { oldObj, newObj in
- XCTAssertEqual(newObj!["stringCol"] as! String, oldObj!["stringCol"] as! String)
- if oldObj!["stringCol"] as! String == "2" {
- migration.delete(newObj!)
- }
- }
- migration.enumerateObjects(ofType: "SwiftStringObject") { oldObj, newObj in
- XCTAssertEqual(newObj!["stringCol"] as! String, oldObj!["stringCol"] as! String)
- count += 1
- }
- XCTAssertEqual(count, 2)
- count = 0
- migration.enumerateObjects(ofType: "SwiftIntObject") { oldObj, newObj in
- XCTAssertEqual(newObj!["intCol"] as! Int, oldObj!["intCol"] as! Int)
- if oldObj!["intCol"] as! Int == 1 {
- migration.delete(newObj!)
- }
- }
- migration.enumerateObjects(ofType: "SwiftIntObject") { oldObj, newObj in
- XCTAssertEqual(newObj!["intCol"] as! Int, oldObj!["intCol"] as! Int)
- count += 1
- }
- XCTAssertEqual(count, 2)
- migration.enumerateObjects(ofType: "SwiftBoolObject") { oldObj, newObj in
- XCTAssertEqual(newObj!["boolCol"] as! Bool, oldObj!["boolCol"] as! Bool)
- migration.delete(newObj!)
- }
- migration.enumerateObjects(ofType: "SwiftBoolObject") { _, _ in
- XCTFail("This line should not executed since all objects have been deleted.")
- }
- }
- }
- func testEnumerateObjectsAfterDeleteInsertObjects() {
- autoreleasepool {
-
- try! Realm().write {
- try! Realm().create(SwiftStringObject.self, value: ["1"])
- try! Realm().create(SwiftStringObject.self, value: ["2"])
- try! Realm().create(SwiftStringObject.self, value: ["3"])
- try! Realm().create(SwiftIntObject.self, value: [1])
- try! Realm().create(SwiftIntObject.self, value: [2])
- try! Realm().create(SwiftIntObject.self, value: [3])
- try! Realm().create(SwiftBoolObject.self, value: [true])
- try! Realm().create(SwiftBoolObject.self, value: [false])
- try! Realm().create(SwiftBoolObject.self, value: [true])
- }
- }
- migrateAndTestDefaultRealm(1) { migration, _ in
- var count = 0
- migration.enumerateObjects(ofType: "SwiftStringObject") { oldObj, newObj in
- XCTAssertEqual(newObj!["stringCol"] as! String, oldObj!["stringCol"] as! String)
- if oldObj!["stringCol"] as! String == "2" {
- migration.delete(newObj!)
- migration.create("SwiftStringObject", value: ["A"])
- }
- }
- migration.enumerateObjects(ofType: "SwiftStringObject") { oldObj, newObj in
- XCTAssertEqual(newObj!["stringCol"] as! String, oldObj!["stringCol"] as! String)
- count += 1
- }
- XCTAssertEqual(count, 2)
- count = 0
- migration.enumerateObjects(ofType: "SwiftIntObject") { oldObj, newObj in
- XCTAssertEqual(newObj!["intCol"] as! Int, oldObj!["intCol"] as! Int)
- if oldObj!["intCol"] as! Int == 1 {
- migration.delete(newObj!)
- migration.create("SwiftIntObject", value: [0])
- }
- }
- migration.enumerateObjects(ofType: "SwiftIntObject") { oldObj, newObj in
- XCTAssertEqual(newObj!["intCol"] as! Int, oldObj!["intCol"] as! Int)
- count += 1
- }
- XCTAssertEqual(count, 2)
- migration.enumerateObjects(ofType: "SwiftBoolObject") { oldObj, newObj in
- XCTAssertEqual(newObj!["boolCol"] as! Bool, oldObj!["boolCol"] as! Bool)
- migration.delete(newObj!)
- migration.create("SwiftBoolObject", value: [false])
- }
- migration.enumerateObjects(ofType: "SwiftBoolObject") { _, _ in
- XCTFail("This line should not executed since all objects have been deleted.")
- }
- }
- }
- func testEnumerateObjectsAfterDeleteData() {
- autoreleasepool {
-
- try! Realm().write {
- try! Realm().create(SwiftStringObject.self, value: ["1"])
- try! Realm().create(SwiftStringObject.self, value: ["2"])
- try! Realm().create(SwiftStringObject.self, value: ["3"])
- }
- }
- migrateAndTestDefaultRealm(1) { migration, _ in
- var count = 0
- migration.enumerateObjects(ofType: "SwiftStringObject") { _, _ in
- count += 1
- }
- XCTAssertEqual(count, 3)
- migration.deleteData(forType: "SwiftStringObject")
- migration.create("SwiftStringObject", value: ["A"])
- count = 0
- migration.enumerateObjects(ofType: "SwiftStringObject") { _, _ in
- count += 1
- }
- XCTAssertEqual(count, 0)
- }
- }
- func testCreate() {
- autoreleasepool {
- _ = try! Realm()
- }
- migrateAndTestDefaultRealm { migration, _ in
- migration.create("SwiftStringObject", value: ["string"])
- migration.create("SwiftStringObject", value: ["stringCol": "string"])
- migration.create("SwiftStringObject")
- self.assertThrows(migration.create("NoSuchObject", value: []))
- }
- let objects = try! Realm().objects(SwiftStringObject.self)
- XCTAssertEqual(objects.count, 3)
- XCTAssertEqual(objects[0].stringCol, "string")
- XCTAssertEqual(objects[1].stringCol, "string")
- XCTAssertEqual(objects[2].stringCol, "")
- }
- func testDelete() {
- autoreleasepool {
- try! Realm().write {
- try! Realm().create(SwiftStringObject.self, value: ["string1"])
- try! Realm().create(SwiftStringObject.self, value: ["string2"])
- return
- }
- }
- migrateAndTestDefaultRealm { migration, _ in
- var deleted = false
- migration.enumerateObjects(ofType: "SwiftStringObject", { _, newObj in
- if deleted == false {
- migration.delete(newObj!)
- deleted = true
- }
- })
- }
- XCTAssertEqual(try! Realm().objects(SwiftStringObject.self).count, 1)
- }
- func testDeleteData() {
- autoreleasepool {
- let prop = RLMProperty(name: "id", type: .int, objectClassName: nil,
- linkOriginPropertyName: nil, indexed: false, optional: false)
- let realm = realmWithSingleClassProperties(defaultRealmURL(),
- className: "DeletedClass", properties: [prop])
- try! realm.transaction {
- realm.createObject("DeletedClass", withValue: [0])
- }
- }
- migrateAndTestDefaultRealm { migration, oldSchemaVersion in
- XCTAssertEqual(oldSchemaVersion, 0, "Initial schema version should be 0")
- XCTAssertTrue(migration.deleteData(forType: "DeletedClass"))
- XCTAssertFalse(migration.deleteData(forType: "NoSuchClass"))
- migration.create(SwiftStringObject.className(), value: ["migration"])
- XCTAssertTrue(migration.deleteData(forType: SwiftStringObject.className()))
- }
- let realm = dynamicRealm(defaultRealmURL())
- XCTAssertNil(realm.schema.schema(forClassName: "DeletedClass"))
- XCTAssertEqual(0, realm.allObjects("SwiftStringObject").count)
- }
- func testRenameProperty() {
- autoreleasepool {
- let prop = RLMProperty(name: "before_stringCol", type: .string, objectClassName: nil,
- linkOriginPropertyName: nil, indexed: false, optional: false)
- autoreleasepool {
- let realm = realmWithSingleClassProperties(defaultRealmURL(), className: "SwiftStringObject",
- properties: [prop])
- try! realm.transaction {
- realm.createObject("SwiftStringObject", withValue: ["a"])
- }
- }
- migrateAndTestDefaultRealm { migration, _ in
- XCTAssertEqual(migration.oldSchema.objectSchema[0].properties.count, 1)
- migration.renameProperty(onType: "SwiftStringObject", from: "before_stringCol",
- to: "stringCol")
- }
- let realm = dynamicRealm(defaultRealmURL())
- XCTAssertEqual(realm.schema.schema(forClassName: "SwiftStringObject")!.properties.count, 1)
- XCTAssertEqual(1, realm.allObjects("SwiftStringObject").count)
- XCTAssertEqual("a", realm.allObjects("SwiftStringObject").firstObject()?["stringCol"] as? String)
- }
- }
-
- func testMigrationObject() {
- autoreleasepool {
- try! Realm().write {
- let object = SwiftObject()
- object.boolCol = true
- object.objectCol = SwiftBoolObject(value: [true])
- object.arrayCol.append(SwiftBoolObject(value: [false]))
- try! Realm().add(object)
- return
- }
- }
- migrateAndTestDefaultRealm { migration, _ in
- var enumerated = false
- migration.enumerateObjects(ofType: "SwiftObject", { oldObj, newObj in
- XCTAssertEqual((oldObj!["boolCol"] as! Bool), true)
- XCTAssertEqual((newObj!["boolCol"] as! Bool), true)
- XCTAssertEqual((oldObj!["intCol"] as! Int), 123)
- XCTAssertEqual((newObj!["intCol"] as! Int), 123)
- XCTAssertEqual((oldObj!["intEnumCol"] as! Int), 1)
- XCTAssertEqual((newObj!["intEnumCol"] as! Int), 1)
- XCTAssertEqual((oldObj!["floatCol"] as! Float), 1.23 as Float)
- XCTAssertEqual((newObj!["floatCol"] as! Float), 1.23 as Float)
- XCTAssertEqual((oldObj!["doubleCol"] as! Double), 12.3 as Double)
- XCTAssertEqual((newObj!["doubleCol"] as! Double), 12.3 as Double)
- let binaryCol = "a".data(using: String.Encoding.utf8)!
- XCTAssertEqual((oldObj!["binaryCol"] as! Data), binaryCol)
- XCTAssertEqual((newObj!["binaryCol"] as! Data), binaryCol)
- let dateCol = Date(timeIntervalSince1970: 1)
- XCTAssertEqual((oldObj!["dateCol"] as! Date), dateCol)
- XCTAssertEqual((newObj!["dateCol"] as! Date), dateCol)
-
- XCTAssertEqual(((oldObj!["objectCol"] as! MigrationObject)["boolCol"] as! Bool), true)
- XCTAssertEqual(((newObj!["objectCol"] as! MigrationObject)["boolCol"] as! Bool), true)
- XCTAssertEqual((oldObj!["arrayCol"] as! List<MigrationObject>).count, 1)
- XCTAssertEqual(((oldObj!["arrayCol"] as! List<MigrationObject>)[0]["boolCol"] as! Bool), false)
- XCTAssertEqual((newObj!["arrayCol"] as! List<MigrationObject>).count, 1)
- XCTAssertEqual(((newObj!["arrayCol"] as! List<MigrationObject>)[0]["boolCol"] as! Bool), false)
-
- newObj!["boolCol"] = false
- newObj!["intCol"] = 1
- newObj!["intEnumCol"] = IntEnum.value2.rawValue
- newObj!["floatCol"] = 1.0
- newObj!["doubleCol"] = 10.0
- newObj!["binaryCol"] = Data(bytes: "b", count: 1)
- newObj!["dateCol"] = Date(timeIntervalSince1970: 2)
- let falseObj = SwiftBoolObject(value: [false])
- newObj!["objectCol"] = falseObj
- var list = newObj!["arrayCol"] as! List<MigrationObject>
- list[0]["boolCol"] = true
- list.append(newObj!["objectCol"] as! MigrationObject)
- let trueObj = migration.create(SwiftBoolObject.className(), value: [true])
- list.append(trueObj)
-
- list = newObj!["arrayCol"] as! List<MigrationObject>
- XCTAssertEqual(list.count, 3)
- XCTAssertEqual((list[0]["boolCol"] as! Bool), true)
- XCTAssertEqual((list[1]["boolCol"] as! Bool), false)
- XCTAssertEqual((list[2]["boolCol"] as! Bool), true)
- list = newObj!.dynamicList("arrayCol")
- XCTAssertEqual(list.count, 3)
- XCTAssertEqual((list[0]["boolCol"] as! Bool), true)
- XCTAssertEqual((list[1]["boolCol"] as! Bool), false)
- XCTAssertEqual((list[2]["boolCol"] as! Bool), true)
- self.assertThrows(newObj!.value(forKey: "noSuchKey"))
- self.assertThrows(newObj!.setValue(1, forKey: "noSuchKey"))
-
- newObj!["arrayCol"] = [falseObj, trueObj]
- XCTAssertEqual(list.count, 2)
- newObj!["arrayCol"] = [SwiftBoolObject(value: [false])]
- XCTAssertEqual(list.count, 1)
- XCTAssertEqual((list[0]["boolCol"] as! Bool), false)
- self.assertMatches(newObj!.description, "SwiftObject \\{\n\tboolCol = 0;\n\tintCol = 1;\n\tintEnumCol = 3;\n\tfloatCol = 1;\n\tdoubleCol = 10;\n\tstringCol = a;\n\tbinaryCol = <.*62.*>;\n\tdateCol = 1970-01-01 00:00:02 \\+0000;\n\tobjectCol = SwiftBoolObject \\{\n\t\tboolCol = 0;\n\t\\};\n\tarrayCol = List<SwiftBoolObject> <0x[0-9a-f]+> \\(\n\t\t\\[0\\] SwiftBoolObject \\{\n\t\t\tboolCol = 0;\n\t\t\\}\n\t\\);\n\\}")
- enumerated = true
- })
- XCTAssertEqual(enumerated, true)
- let newObj = migration.create(SwiftObject.className())
-
- self.assertMatches(newObj.description, "SwiftObject \\{\n\tboolCol = 0;\n\tintCol = 123;\n\tintEnumCol = 1;\n\tfloatCol = 1\\.23;\n\tdoubleCol = 12\\.3;\n\tstringCol = a;\n\tbinaryCol = <.*61.*>;\n\tdateCol = 1970-01-01 00:00:01 \\+0000;\n\tobjectCol = SwiftBoolObject \\{\n\t\tboolCol = 0;\n\t\\};\n\tarrayCol = List<SwiftBoolObject> <0x[0-9a-f]+> \\(\n\t\n\t\\);\n\\}")
- }
-
- try! Realm().refresh()
-
- let object = try! Realm().objects(SwiftObject.self).first!
- XCTAssertEqual(object.boolCol, false)
- XCTAssertEqual(object.intCol, 1)
- XCTAssertEqual(object.floatCol, 1.0 as Float)
- XCTAssertEqual(object.doubleCol, 10.0)
- XCTAssertEqual(object.binaryCol, Data(bytes: "b", count: 1))
- XCTAssertEqual(object.dateCol, Date(timeIntervalSince1970: 2))
- XCTAssertEqual(object.objectCol!.boolCol, false)
- XCTAssertEqual(object.arrayCol.count, 1)
- XCTAssertEqual(object.arrayCol[0].boolCol, false)
-
- XCTAssertEqual(try! Realm().objects(SwiftBoolObject.self).count, 6)
- }
- func testFailOnSchemaMismatch() {
- let prop = RLMProperty(name: "name", type: RLMPropertyType.string, objectClassName: nil,
- linkOriginPropertyName: nil, indexed: false, optional: false)
- _ = autoreleasepool {
- realmWithSingleClassProperties(defaultRealmURL(), className: "SwiftEmployeeObject", properties: [prop])
- }
- let config = Realm.Configuration(fileURL: defaultRealmURL(), objectTypes: [SwiftEmployeeObject.self])
- autoreleasepool {
- assertFails(.schemaMismatch) {
- try Realm(configuration: config)
- }
- }
- }
- func testDeleteRealmIfMigrationNeededWithSetCustomSchema() {
- let prop = RLMProperty(name: "name", type: RLMPropertyType.string, objectClassName: nil,
- linkOriginPropertyName: nil, indexed: false, optional: false)
- _ = autoreleasepool {
- realmWithSingleClassProperties(defaultRealmURL(), className: "SwiftEmployeeObject", properties: [prop])
- }
- var config = Realm.Configuration(fileURL: defaultRealmURL(), objectTypes: [SwiftEmployeeObject.self])
- config.migrationBlock = { _, _ in
- XCTFail("Migration block should not be called")
- }
- config.deleteRealmIfMigrationNeeded = true
- autoreleasepool {
- assertSucceeds {
- _ = try Realm(configuration: config)
- }
- }
- }
- func testDeleteRealmIfMigrationNeeded() {
- autoreleasepool { _ = try! Realm(configuration: Realm.Configuration(fileURL: defaultRealmURL())) }
- let objectSchema = RLMObjectSchema(forObjectClass: SwiftEmployeeObject.self)
- objectSchema.properties = Array(objectSchema.properties[0..<1])
- let metaClass: AnyClass = objc_getMetaClass("RLMSchema") as! AnyClass
- let imp = imp_implementationWithBlock(unsafeBitCast({ () -> RLMSchema in
- let schema = RLMSchema()
- schema.objectSchema = [objectSchema]
- return schema
- } as @convention(block)() -> (RLMSchema), to: AnyObject.self))
- let originalImp = class_getMethodImplementation(metaClass, #selector(RLMObjectBase.sharedSchema))
- class_replaceMethod(metaClass, #selector(RLMObjectBase.sharedSchema), imp, "@@:")
- autoreleasepool {
- assertFails(.schemaMismatch) {
- try Realm()
- }
- }
- let migrationBlock: MigrationBlock = { _, _ in
- XCTFail("Migration block should not be called")
- }
- let config = Realm.Configuration(fileURL: defaultRealmURL(),
- migrationBlock: migrationBlock,
- deleteRealmIfMigrationNeeded: true)
- assertSucceeds {
- _ = try Realm(configuration: config)
- }
- class_replaceMethod(metaClass, #selector(RLMObjectBase.sharedSchema), originalImp!, "@@:")
- }
- }
|