SwiftLinkTests.swift 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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. class SwiftLinkTests: RLMTestCase {
  21. // Swift models
  22. func testBasicLink() {
  23. let realm = realmWithTestPath()
  24. let owner = SwiftOwnerObject()
  25. owner.name = "Tim"
  26. owner.dog = SwiftDogObject()
  27. owner.dog!.dogName = "Harvie"
  28. realm.beginWriteTransaction()
  29. realm.add(owner)
  30. try! realm.commitWriteTransaction()
  31. let owners = SwiftOwnerObject.allObjects(in: realm)
  32. let dogs = SwiftDogObject.allObjects(in: realm)
  33. XCTAssertEqual(owners.count, UInt(1), "Expecting 1 owner")
  34. XCTAssertEqual(dogs.count, UInt(1), "Expecting 1 dog")
  35. XCTAssertEqual((owners[0] as! SwiftOwnerObject).name, "Tim", "Tim is named Tim")
  36. XCTAssertEqual((dogs[0] as! SwiftDogObject).dogName, "Harvie", "Harvie is named Harvie")
  37. let tim = owners[0] as! SwiftOwnerObject
  38. XCTAssertEqual(tim.dog!.dogName, "Harvie", "Tim's dog should be Harvie")
  39. }
  40. func testMultipleOwnerLink() {
  41. let realm = realmWithTestPath()
  42. let owner = SwiftOwnerObject()
  43. owner.name = "Tim"
  44. owner.dog = SwiftDogObject()
  45. owner.dog!.dogName = "Harvie"
  46. realm.beginWriteTransaction()
  47. realm.add(owner)
  48. try! realm.commitWriteTransaction()
  49. XCTAssertEqual(SwiftOwnerObject.allObjects(in: realm).count, UInt(1), "Expecting 1 owner")
  50. XCTAssertEqual(SwiftDogObject.allObjects(in: realm).count, UInt(1), "Expecting 1 dog")
  51. realm.beginWriteTransaction()
  52. let fiel = SwiftOwnerObject.create(in: realm, withValue: ["Fiel", NSNull()])
  53. fiel.dog = owner.dog
  54. try! realm.commitWriteTransaction()
  55. XCTAssertEqual(SwiftOwnerObject.allObjects(in: realm).count, UInt(2), "Expecting 2 owners")
  56. XCTAssertEqual(SwiftDogObject.allObjects(in: realm).count, UInt(1), "Expecting 1 dog")
  57. }
  58. func testLinkRemoval() {
  59. let realm = realmWithTestPath()
  60. let owner = SwiftOwnerObject()
  61. owner.name = "Tim"
  62. owner.dog = SwiftDogObject()
  63. owner.dog!.dogName = "Harvie"
  64. realm.beginWriteTransaction()
  65. realm.add(owner)
  66. try! realm.commitWriteTransaction()
  67. XCTAssertEqual(SwiftOwnerObject.allObjects(in: realm).count, UInt(1), "Expecting 1 owner")
  68. XCTAssertEqual(SwiftDogObject.allObjects(in: realm).count, UInt(1), "Expecting 1 dog")
  69. realm.beginWriteTransaction()
  70. realm.delete(owner.dog!)
  71. try! realm.commitWriteTransaction()
  72. XCTAssertNil(owner.dog, "Dog should be nullified when deleted")
  73. // refresh owner and check
  74. let owner2 = SwiftOwnerObject.allObjects(in: realm).firstObject() as! SwiftOwnerObject
  75. XCTAssertNotNil(owner2, "Should have 1 owner")
  76. XCTAssertNil(owner2.dog, "Dog should be nullified when deleted")
  77. XCTAssertEqual(SwiftDogObject.allObjects(in: realm).count, UInt(0), "Expecting 0 dogs")
  78. }
  79. func testLinkingObjects() {
  80. let realm = realmWithTestPath()
  81. let target = SwiftLinkTargetObject()
  82. target.id = 0
  83. let source = SwiftLinkSourceObject()
  84. source.id = 1234
  85. source.link = target
  86. XCTAssertEqual(0, target.backlinks!.count)
  87. realm.beginWriteTransaction()
  88. realm.add(source)
  89. try! realm.commitWriteTransaction()
  90. XCTAssertNotNil(target.realm)
  91. XCTAssertEqual(1, target.backlinks!.count)
  92. XCTAssertEqual(1234, (target.backlinks!.firstObject() as! SwiftLinkSourceObject).id)
  93. }
  94. // FIXME - disabled until we fix commit log issue which break transacions when leaking realm objects
  95. // func testCircularLinks() {
  96. // let realm = realmWithTestPath()
  97. //
  98. // let obj = SwiftCircleObject()
  99. // obj.data = "a"
  100. // obj.next = obj
  101. //
  102. // realm.beginWriteTransaction()
  103. // realm.addObject(obj)
  104. // obj.next.data = "b"
  105. // try! realm.commitWriteTransaction()
  106. //
  107. // let obj2 = SwiftCircleObject.allObjectsInRealm(realm).firstObject() as SwiftCircleObject
  108. // XCTAssertEqual(obj2.data, "b", "data should be 'b'")
  109. // XCTAssertEqual(obj2.data, obj2.next.data, "objects should be equal")
  110. // }
  111. // Objective-C models
  112. func testBasicLink_objc() {
  113. let realm = realmWithTestPath()
  114. let owner = OwnerObject()
  115. owner.name = "Tim"
  116. owner.dog = DogObject()
  117. owner.dog.dogName = "Harvie"
  118. realm.beginWriteTransaction()
  119. realm.add(owner)
  120. try! realm.commitWriteTransaction()
  121. let owners = OwnerObject.allObjects(in: realm)
  122. let dogs = DogObject.allObjects(in: realm)
  123. XCTAssertEqual(owners.count, UInt(1), "Expecting 1 owner")
  124. XCTAssertEqual(dogs.count, UInt(1), "Expecting 1 dog")
  125. XCTAssertEqual((owners[0] as! OwnerObject).name!, "Tim", "Tim is named Tim")
  126. XCTAssertEqual((dogs[0] as! DogObject).dogName!, "Harvie", "Harvie is named Harvie")
  127. let tim = owners[0] as! OwnerObject
  128. XCTAssertEqual(tim.dog.dogName!, "Harvie", "Tim's dog should be Harvie")
  129. }
  130. func testMultipleOwnerLink_objc() {
  131. let realm = realmWithTestPath()
  132. let owner = OwnerObject()
  133. owner.name = "Tim"
  134. owner.dog = DogObject()
  135. owner.dog.dogName = "Harvie"
  136. realm.beginWriteTransaction()
  137. realm.add(owner)
  138. try! realm.commitWriteTransaction()
  139. XCTAssertEqual(OwnerObject.allObjects(in: realm).count, UInt(1), "Expecting 1 owner")
  140. XCTAssertEqual(DogObject.allObjects(in: realm).count, UInt(1), "Expecting 1 dog")
  141. realm.beginWriteTransaction()
  142. let fiel = OwnerObject.create(in: realm, withValue: ["Fiel", NSNull()])
  143. fiel.dog = owner.dog
  144. try! realm.commitWriteTransaction()
  145. XCTAssertEqual(OwnerObject.allObjects(in: realm).count, UInt(2), "Expecting 2 owners")
  146. XCTAssertEqual(DogObject.allObjects(in: realm).count, UInt(1), "Expecting 1 dog")
  147. }
  148. func testLinkRemoval_objc() {
  149. let realm = realmWithTestPath()
  150. let owner = OwnerObject()
  151. owner.name = "Tim"
  152. owner.dog = DogObject()
  153. owner.dog.dogName = "Harvie"
  154. realm.beginWriteTransaction()
  155. realm.add(owner)
  156. try! realm.commitWriteTransaction()
  157. XCTAssertEqual(OwnerObject.allObjects(in: realm).count, UInt(1), "Expecting 1 owner")
  158. XCTAssertEqual(DogObject.allObjects(in: realm).count, UInt(1), "Expecting 1 dog")
  159. realm.beginWriteTransaction()
  160. realm.delete(owner.dog)
  161. try! realm.commitWriteTransaction()
  162. XCTAssertNil(owner.dog, "Dog should be nullified when deleted")
  163. // refresh owner and check
  164. let owner2 = OwnerObject.allObjects(in: realm).firstObject() as! OwnerObject
  165. XCTAssertNotNil(owner2, "Should have 1 owner")
  166. XCTAssertNil(owner2.dog, "Dog should be nullified when deleted")
  167. XCTAssertEqual(DogObject.allObjects(in: realm).count, UInt(0), "Expecting 0 dogs")
  168. }
  169. // FIXME - disabled until we fix commit log issue which break transacions when leaking realm objects
  170. // func testCircularLinks_objc() {
  171. // let realm = realmWithTestPath()
  172. //
  173. // let obj = CircleObject()
  174. // obj.data = "a"
  175. // obj.next = obj
  176. //
  177. // realm.beginWriteTransaction()
  178. // realm.addObject(obj)
  179. // obj.next.data = "b"
  180. // try! realm.commitWriteTransaction()
  181. //
  182. // let obj2 = CircleObject.allObjectsInRealm(realm).firstObject() as CircleObject
  183. // XCTAssertEqual(obj2.data, "b", "data should be 'b'")
  184. // XCTAssertEqual(obj2.data, obj2.next.data, "objects should be equal")
  185. // }
  186. }