SwiftDynamicTests.swift 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. ////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright 2014 Realm Inc.
  4. //
  5. // Licensed under the Apache License, Version 2.0 (the "License");
  6. // you may not use this file except in compliance with the License.
  7. // You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. //
  17. ////////////////////////////////////////////////////////////////////////////
  18. import XCTest
  19. import Foundation
  20. import Realm.Private
  21. import Realm.Dynamic
  22. import RealmTestSupport
  23. class SwiftRLMDynamicTests: RLMTestCase {
  24. // Swift models
  25. func testDynamicRealmExists() {
  26. autoreleasepool {
  27. // open realm in autoreleasepool to create tables and then dispose
  28. let realm = RLMRealm(url: RLMTestRealmURL())
  29. realm.beginWriteTransaction()
  30. _ = SwiftRLMDynamicObject.create(in: realm, withValue: ["column1", 1])
  31. _ = SwiftRLMDynamicObject.create(in: realm, withValue: ["column2", 2])
  32. try! realm.commitWriteTransaction()
  33. }
  34. let dyrealm = realm(withTestPathAndSchema: nil)
  35. XCTAssertNotNil(dyrealm, "realm should not be nil")
  36. // verify schema
  37. let dynSchema = dyrealm.schema[SwiftRLMDynamicObject.className()]
  38. XCTAssertNotNil(dynSchema, "Should be able to get object schema dynamically")
  39. XCTAssertEqual(dynSchema.properties.count, Int(2))
  40. XCTAssertEqual(dynSchema.properties[0].name, "stringCol")
  41. XCTAssertEqual(dynSchema.properties[1].type, RLMPropertyType.int)
  42. // verify object type
  43. let array = SwiftRLMDynamicObject.allObjects(in: dyrealm)
  44. XCTAssertEqual(array.count, UInt(2))
  45. XCTAssertEqual(array.objectClassName, SwiftRLMDynamicObject.className())
  46. }
  47. func testDynamicProperties() {
  48. autoreleasepool {
  49. // open realm in autoreleasepool to create tables and then dispose
  50. let realm = RLMRealm(url: RLMTestRealmURL())
  51. realm.beginWriteTransaction()
  52. _ = SwiftRLMDynamicObject.create(in: realm, withValue: ["column1", 1])
  53. _ = SwiftRLMDynamicObject.create(in: realm, withValue: ["column2", 2])
  54. try! realm.commitWriteTransaction()
  55. }
  56. // verify properties
  57. let dyrealm = realm(withTestPathAndSchema: nil)
  58. let array = dyrealm.allObjects("SwiftRLMDynamicObject")
  59. XCTAssertTrue(array[0]["intCol"] as! NSNumber == 1)
  60. XCTAssertTrue(array[1]["stringCol"] as! String == "column2")
  61. }
  62. // Objective-C models
  63. func testDynamicRealmExists_objc() {
  64. autoreleasepool {
  65. // open realm in autoreleasepool to create tables and then dispose
  66. let realm = RLMRealm(url: RLMTestRealmURL())
  67. realm.beginWriteTransaction()
  68. _ = DynamicTestObject.create(in: realm, withValue: ["column1", 1])
  69. _ = DynamicTestObject.create(in: realm, withValue: ["column2", 2])
  70. try! realm.commitWriteTransaction()
  71. }
  72. let dyrealm = realm(withTestPathAndSchema: nil)
  73. XCTAssertNotNil(dyrealm, "realm should not be nil")
  74. // verify schema
  75. let dynSchema = dyrealm.schema[DynamicTestObject.className()]
  76. XCTAssertNotNil(dynSchema, "Should be able to get object schema dynamically")
  77. XCTAssertTrue(dynSchema.properties.count == 2)
  78. XCTAssertTrue(dynSchema.properties[0].name == "stringCol")
  79. XCTAssertTrue(dynSchema.properties[1].type == RLMPropertyType.int)
  80. // verify object type
  81. let array = DynamicTestObject.allObjects(in: dyrealm)
  82. XCTAssertEqual(array.count, UInt(2))
  83. XCTAssertEqual(array.objectClassName, DynamicTestObject.className())
  84. }
  85. func testDynamicProperties_objc() {
  86. autoreleasepool {
  87. // open realm in autoreleasepool to create tables and then dispose
  88. let realm = RLMRealm(url: RLMTestRealmURL())
  89. realm.beginWriteTransaction()
  90. _ = DynamicTestObject.create(in: realm, withValue: ["column1", 1])
  91. _ = DynamicTestObject.create(in: realm, withValue: ["column2", 2])
  92. try! realm.commitWriteTransaction()
  93. }
  94. // verify properties
  95. let dyrealm = realm(withTestPathAndSchema: nil)
  96. let array = dyrealm.allObjects("DynamicTestObject")
  97. XCTAssertTrue(array[0]["intCol"] as! NSNumber == 1)
  98. XCTAssertTrue(array[1]["stringCol"] as! String == "column2")
  99. }
  100. func testDynamicTypes_objc() {
  101. let date = Date(timeIntervalSince1970: 100000)
  102. let data = "a".data(using: String.Encoding.utf8)!
  103. let obj1: [Any] = [true, 1, 1.1 as Float, 1.11, "string",
  104. data, date, true, 11, NSNull()]
  105. let obj = StringObject()
  106. obj.stringCol = "string"
  107. let data2 = "b".data(using: String.Encoding.utf8)!
  108. let obj2: [Any] = [false, 2, 2.2 as Float, 2.22, "string2",
  109. data2, date, false, 22, obj]
  110. autoreleasepool {
  111. // open realm in autoreleasepool to create tables and then dispose
  112. let realm = self.realmWithTestPath()
  113. realm.beginWriteTransaction()
  114. _ = AllTypesObject.create(in: realm, withValue: obj1)
  115. _ = AllTypesObject.create(in: realm, withValue: obj2)
  116. try! realm.commitWriteTransaction()
  117. }
  118. // verify properties
  119. let dyrealm = realm(withTestPathAndSchema: nil)
  120. let results = dyrealm.allObjects(AllTypesObject.className())
  121. XCTAssertEqual(results.count, UInt(2))
  122. let robj1 = results[0]
  123. let robj2 = results[1]
  124. let schema = dyrealm.schema[AllTypesObject.className()]
  125. for idx in 0..<obj1.count - 1 {
  126. let prop = schema.properties[idx]
  127. XCTAssertTrue((obj1[idx] as AnyObject).isEqual(robj1[prop.name]))
  128. XCTAssertTrue((obj2[idx] as AnyObject).isEqual(robj2[prop.name]))
  129. }
  130. // check sub object type
  131. XCTAssertTrue(schema.properties[9].objectClassName! == "StringObject")
  132. // check object equality
  133. XCTAssertNil(robj1["objectCol"], "object should be nil")
  134. XCTAssertTrue((robj2["objectCol"] as! RLMObject)["stringCol"] as! String == "string")
  135. }
  136. }