SwiftArrayPropertyTests.swift 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  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 Realm
  20. import RealmTestSupport
  21. class SwiftRLMArrayPropertyTests: RLMTestCase {
  22. // Swift models
  23. func testBasicArray() {
  24. let string = SwiftRLMStringObject()
  25. string.stringCol = "string"
  26. let realm = realmWithTestPath()
  27. realm.beginWriteTransaction()
  28. realm.add(string)
  29. try! realm.commitWriteTransaction()
  30. XCTAssertEqual(SwiftRLMStringObject.allObjects(in: realm).count, UInt(1), "There should be a single SwiftRLMStringObject in the realm")
  31. let array = SwiftRLMArrayPropertyObject()
  32. array.name = "arrayObject"
  33. array.array.add(string)
  34. XCTAssertEqual(array.array.count, UInt(1))
  35. XCTAssertEqual(array.array.firstObject()!.stringCol, "string")
  36. realm.beginWriteTransaction()
  37. realm.add(array)
  38. array.array.add(string)
  39. try! realm.commitWriteTransaction()
  40. let arrayObjects = SwiftRLMArrayPropertyObject.allObjects(in: realm) as! RLMResults<SwiftRLMArrayPropertyObject>
  41. XCTAssertEqual(arrayObjects.count, UInt(1), "There should be a single SwiftRLMStringObject in the realm")
  42. let cmp = arrayObjects.firstObject()!.array.firstObject()!
  43. XCTAssertTrue(string.isEqual(to: cmp), "First array object should be the string object we added")
  44. }
  45. func testPopulateEmptyArray() {
  46. let realm = realmWithTestPath()
  47. realm.beginWriteTransaction()
  48. let array = SwiftRLMArrayPropertyObject.create(in: realm, withValue: ["arrayObject", [], []])
  49. XCTAssertNotNil(array.array, "Should be able to get an empty array")
  50. XCTAssertEqual(array.array.count, UInt(0), "Should start with no array elements")
  51. let obj = SwiftRLMStringObject()
  52. obj.stringCol = "a"
  53. array.array.add(obj)
  54. array.array.add(SwiftRLMStringObject.create(in: realm, withValue: ["b"]))
  55. array.array.add(obj)
  56. try! realm.commitWriteTransaction()
  57. XCTAssertEqual(array.array.count, UInt(3), "Should have three elements in array")
  58. XCTAssertEqual(array.array[0].stringCol, "a", "First element should have property value 'a'")
  59. XCTAssertEqual(array.array[1].stringCol, "b", "Second element should have property value 'b'")
  60. XCTAssertEqual(array.array[2].stringCol, "a", "Third element should have property value 'a'")
  61. for obj in array.array {
  62. XCTAssertFalse(obj.description.isEmpty, "Object should have description")
  63. }
  64. }
  65. func testModifyDetatchedArray() {
  66. let realm = realmWithTestPath()
  67. realm.beginWriteTransaction()
  68. let arObj = SwiftRLMArrayPropertyObject.create(in: realm, withValue: ["arrayObject", [], []])
  69. XCTAssertNotNil(arObj.array, "Should be able to get an empty array")
  70. XCTAssertEqual(arObj.array.count, UInt(0), "Should start with no array elements")
  71. let obj = SwiftRLMStringObject()
  72. obj.stringCol = "a"
  73. let array = arObj.array
  74. array.add(obj)
  75. array.add(SwiftRLMStringObject.create(in: realm, withValue: ["b"]))
  76. try! realm.commitWriteTransaction()
  77. XCTAssertEqual(array.count, UInt(2), "Should have two elements in array")
  78. XCTAssertEqual(array[0].stringCol, "a", "First element should have property value 'a'")
  79. XCTAssertEqual(array[1].stringCol, "b", "Second element should have property value 'b'")
  80. }
  81. func testInsertMultiple() {
  82. let realm = realmWithTestPath()
  83. realm.beginWriteTransaction()
  84. let obj = SwiftRLMArrayPropertyObject.create(in: realm, withValue: ["arrayObject", [], []])
  85. let child1 = SwiftRLMStringObject.create(in: realm, withValue: ["a"])
  86. let child2 = SwiftRLMStringObject()
  87. child2.stringCol = "b"
  88. obj.array.addObjects([child2, child1] as NSArray)
  89. try! realm.commitWriteTransaction()
  90. let children = SwiftRLMStringObject.allObjects(in: realm)
  91. XCTAssertEqual((children[0] as! SwiftRLMStringObject).stringCol, "a", "First child should be 'a'")
  92. XCTAssertEqual((children[1] as! SwiftRLMStringObject).stringCol, "b", "Second child should be 'b'")
  93. }
  94. // FIXME: Support unmanaged RLMArray's in Swift-defined models
  95. // func testUnmanaged() {
  96. // let realm = realmWithTestPath()
  97. //
  98. // let array = SwiftRLMArrayPropertyObject()
  99. // array.name = "name"
  100. // XCTAssertNotNil(array.array, "RLMArray property should get created on access")
  101. //
  102. // let obj = SwiftRLMStringObject()
  103. // obj.stringCol = "a"
  104. // array.array.addObject(obj)
  105. // array.array.addObject(obj)
  106. //
  107. // realm.beginWriteTransaction()
  108. // realm.addObject(array)
  109. // try! realm.commitWriteTransaction()
  110. //
  111. // XCTAssertEqual(array.array.count, UInt(2), "Should have two elements in array")
  112. // XCTAssertEqual((array.array[0] as SwiftRLMStringObject).stringCol, "a", "First element should have property value 'a'")
  113. // XCTAssertEqual((array.array[1] as SwiftRLMStringObject).stringCol, "a", "Second element should have property value 'a'")
  114. // }
  115. // Objective-C models
  116. func testBasicArray_objc() {
  117. let string = StringObject()
  118. string.stringCol = "string"
  119. let realm = realmWithTestPath()
  120. realm.beginWriteTransaction()
  121. realm.add(string)
  122. try! realm.commitWriteTransaction()
  123. XCTAssertEqual(StringObject.allObjects(in: realm).count, UInt(1), "There should be a single StringObject in the realm")
  124. let array = ArrayPropertyObject()
  125. array.name = "arrayObject"
  126. array.array.add(string)
  127. realm.beginWriteTransaction()
  128. realm.add(array)
  129. try! realm.commitWriteTransaction()
  130. let arrayObjects = ArrayPropertyObject.allObjects(in: realm)
  131. XCTAssertEqual(arrayObjects.count, UInt(1), "There should be a single StringObject in the realm")
  132. let cmp = (arrayObjects.firstObject() as! ArrayPropertyObject).array.firstObject()!
  133. XCTAssertTrue(string.isEqual(to: cmp), "First array object should be the string object we added")
  134. }
  135. func testPopulateEmptyArray_objc() {
  136. let realm = realmWithTestPath()
  137. realm.beginWriteTransaction()
  138. let array = ArrayPropertyObject.create(in: realm, withValue: ["arrayObject", [], []])
  139. XCTAssertNotNil(array.array, "Should be able to get an empty array")
  140. XCTAssertEqual(array.array.count, UInt(0), "Should start with no array elements")
  141. let obj = StringObject()
  142. obj.stringCol = "a"
  143. array.array.add(obj)
  144. array.array.add(StringObject.create(in: realm, withValue: ["b"]))
  145. array.array.add(obj)
  146. try! realm.commitWriteTransaction()
  147. XCTAssertEqual(array.array.count, UInt(3), "Should have three elements in array")
  148. XCTAssertEqual((array.array[0]).stringCol!, "a", "First element should have property value 'a'")
  149. XCTAssertEqual((array.array[1]).stringCol!, "b", "Second element should have property value 'b'")
  150. XCTAssertEqual((array.array[2]).stringCol!, "a", "Third element should have property value 'a'")
  151. for idx in 0..<array.array.count {
  152. XCTAssertFalse(array.array[idx].description.isEmpty, "Object should have description")
  153. }
  154. }
  155. func testModifyDetatchedArray_objc() {
  156. let realm = realmWithTestPath()
  157. realm.beginWriteTransaction()
  158. let arObj = ArrayPropertyObject.create(in: realm, withValue: ["arrayObject", [], []])
  159. XCTAssertNotNil(arObj.array, "Should be able to get an empty array")
  160. XCTAssertEqual(arObj.array.count, UInt(0), "Should start with no array elements")
  161. let obj = StringObject()
  162. obj.stringCol = "a"
  163. let array = arObj.array!
  164. array.add(obj)
  165. array.add(StringObject.create(in: realm, withValue: ["b"]))
  166. try! realm.commitWriteTransaction()
  167. XCTAssertEqual(array.count, UInt(2), "Should have two elements in array")
  168. XCTAssertEqual(array[0].stringCol!, "a", "First element should have property value 'a'")
  169. XCTAssertEqual(array[1].stringCol!, "b", "Second element should have property value 'b'")
  170. }
  171. func testInsertMultiple_objc() {
  172. let realm = realmWithTestPath()
  173. realm.beginWriteTransaction()
  174. let obj = ArrayPropertyObject.create(in: realm, withValue: ["arrayObject", [], []])
  175. let child1 = StringObject.create(in: realm, withValue: ["a"])
  176. let child2 = StringObject()
  177. child2.stringCol = "b"
  178. obj.array.addObjects([child2, child1] as NSArray)
  179. try! realm.commitWriteTransaction()
  180. let children = StringObject.allObjects(in: realm)
  181. XCTAssertEqual((children[0] as! StringObject).stringCol!, "a", "First child should be 'a'")
  182. XCTAssertEqual((children[1] as! StringObject).stringCol!, "b", "Second child should be 'b'")
  183. }
  184. func testUnmanaged_objc() {
  185. let realm = realmWithTestPath()
  186. let array = ArrayPropertyObject()
  187. array.name = "name"
  188. XCTAssertNotNil(array.array, "RLMArray property should get created on access")
  189. let obj = StringObject()
  190. obj.stringCol = "a"
  191. array.array.add(obj)
  192. array.array.add(obj)
  193. realm.beginWriteTransaction()
  194. realm.add(array)
  195. try! realm.commitWriteTransaction()
  196. XCTAssertEqual(array.array.count, UInt(2), "Should have two elements in array")
  197. XCTAssertEqual(array.array[0].stringCol!, "a", "First element should have property value 'a'")
  198. XCTAssertEqual(array.array[1].stringCol!, "a", "Second element should have property value 'a'")
  199. }
  200. }