ListTests.swift 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  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 RealmSwift
  20. class ListTests: TestCase {
  21. var str1: SwiftStringObject?
  22. var str2: SwiftStringObject?
  23. var arrayObject: SwiftArrayPropertyObject!
  24. var array: List<SwiftStringObject>?
  25. func createArray() -> SwiftArrayPropertyObject {
  26. fatalError("abstract")
  27. }
  28. func createArrayWithLinks() -> SwiftListOfSwiftObject {
  29. fatalError("abstract")
  30. }
  31. override func setUp() {
  32. super.setUp()
  33. let str1 = SwiftStringObject()
  34. str1.stringCol = "1"
  35. self.str1 = str1
  36. let str2 = SwiftStringObject()
  37. str2.stringCol = "2"
  38. self.str2 = str2
  39. arrayObject = createArray()
  40. array = arrayObject.array
  41. let realm = realmWithTestPath()
  42. try! realm.write {
  43. realm.add(str1)
  44. realm.add(str2)
  45. }
  46. realm.beginWrite()
  47. }
  48. override func tearDown() {
  49. try! realmWithTestPath().commitWrite()
  50. str1 = nil
  51. str2 = nil
  52. arrayObject = nil
  53. array = nil
  54. super.tearDown()
  55. }
  56. override class var defaultTestSuite: XCTestSuite {
  57. // Don't run tests for the base class
  58. if isEqual(ListTests.self) {
  59. return XCTestSuite(name: "empty")
  60. }
  61. return super.defaultTestSuite
  62. }
  63. func testPrimitive() {
  64. let obj = SwiftListObject()
  65. obj.int.append(5)
  66. XCTAssertEqual(obj.int.first!, 5)
  67. XCTAssertEqual(obj.int.last!, 5)
  68. XCTAssertEqual(obj.int[0], 5)
  69. obj.int.append(objectsIn: [6, 7, 8] as [Int])
  70. XCTAssertEqual(obj.int.index(of: 6), 1)
  71. XCTAssertEqual(2, obj.int.index(matching: NSPredicate(format: "self == 7")))
  72. XCTAssertNil(obj.int.index(matching: NSPredicate(format: "self == 9")))
  73. XCTAssertEqual(obj.int.max(), 8)
  74. XCTAssertEqual(obj.int.sum(), 26)
  75. obj.string.append("str")
  76. XCTAssertEqual(obj.string.first!, "str")
  77. XCTAssertEqual(obj.string[0], "str")
  78. }
  79. func testPrimitiveIterationAcrossNil() {
  80. let obj = SwiftListObject()
  81. XCTAssertFalse(obj.int.contains(5))
  82. XCTAssertFalse(obj.int8.contains(5))
  83. XCTAssertFalse(obj.int16.contains(5))
  84. XCTAssertFalse(obj.int32.contains(5))
  85. XCTAssertFalse(obj.int64.contains(5))
  86. XCTAssertFalse(obj.float.contains(3.141592))
  87. XCTAssertFalse(obj.double.contains(3.141592))
  88. XCTAssertFalse(obj.string.contains("foobar"))
  89. XCTAssertFalse(obj.data.contains(Data()))
  90. XCTAssertFalse(obj.date.contains(Date()))
  91. XCTAssertFalse(obj.intOpt.contains { $0 == nil })
  92. XCTAssertFalse(obj.int8Opt.contains { $0 == nil })
  93. XCTAssertFalse(obj.int16Opt.contains { $0 == nil })
  94. XCTAssertFalse(obj.int32Opt.contains { $0 == nil })
  95. XCTAssertFalse(obj.int64Opt.contains { $0 == nil })
  96. XCTAssertFalse(obj.floatOpt.contains { $0 == nil })
  97. XCTAssertFalse(obj.doubleOpt.contains { $0 == nil })
  98. XCTAssertFalse(obj.stringOpt.contains { $0 == nil })
  99. XCTAssertFalse(obj.dataOpt.contains { $0 == nil })
  100. XCTAssertFalse(obj.dateOpt.contains { $0 == nil })
  101. }
  102. func testInvalidated() {
  103. guard let array = array else {
  104. fatalError("Test precondition failure")
  105. }
  106. XCTAssertFalse(array.isInvalidated)
  107. if let realm = arrayObject.realm {
  108. realm.delete(arrayObject)
  109. XCTAssertTrue(array.isInvalidated)
  110. }
  111. }
  112. func testFastEnumerationWithMutation() {
  113. guard let array = array, let str1 = str1, let str2 = str2 else {
  114. fatalError("Test precondition failure")
  115. }
  116. array.append(objectsIn: [str1, str2, str1, str2, str1, str2, str1, str2, str1,
  117. str2, str1, str2, str1, str2, str1, str2, str1, str2, str1, str2])
  118. var str = ""
  119. for obj in array {
  120. str += obj.stringCol
  121. array.append(objectsIn: [str1])
  122. }
  123. XCTAssertEqual(str, "12121212121212121212")
  124. }
  125. func testAppendObject() {
  126. guard let array = array, let str1 = str1, let str2 = str2 else {
  127. fatalError("Test precondition failure")
  128. }
  129. for str in [str1, str2, str1] {
  130. array.append(str)
  131. }
  132. XCTAssertEqual(Int(3), array.count)
  133. assertEqual(str1, array[0])
  134. assertEqual(str2, array[1])
  135. assertEqual(str1, array[2])
  136. }
  137. func testAppendArray() {
  138. guard let array = array, let str1 = str1, let str2 = str2 else {
  139. fatalError("Test precondition failure")
  140. }
  141. array.append(objectsIn: [str1, str2, str1])
  142. XCTAssertEqual(Int(3), array.count)
  143. assertEqual(str1, array[0])
  144. assertEqual(str2, array[1])
  145. assertEqual(str1, array[2])
  146. }
  147. func testAppendResults() {
  148. guard let array = array, let str1 = str1, let str2 = str2 else {
  149. fatalError("Test precondition failure")
  150. }
  151. array.append(objectsIn: realmWithTestPath().objects(SwiftStringObject.self))
  152. XCTAssertEqual(Int(2), array.count)
  153. assertEqual(str1, array[0])
  154. assertEqual(str2, array[1])
  155. }
  156. func testInsert() {
  157. guard let array = array, let str1 = str1, let str2 = str2 else {
  158. fatalError("Test precondition failure")
  159. }
  160. XCTAssertEqual(Int(0), array.count)
  161. array.insert(str1, at: 0)
  162. XCTAssertEqual(Int(1), array.count)
  163. assertEqual(str1, array[0])
  164. array.insert(str2, at: 0)
  165. XCTAssertEqual(Int(2), array.count)
  166. assertEqual(str2, array[0])
  167. assertEqual(str1, array[1])
  168. assertThrows(array.insert(str2, at: 200))
  169. assertThrows(array.insert(str2, at: -200))
  170. }
  171. func testRemoveAtIndex() {
  172. guard let array = array, let str1 = str1, let str2 = str2 else {
  173. fatalError("Test precondition failure")
  174. }
  175. array.append(objectsIn: [str1, str2, str1])
  176. array.remove(at: 1)
  177. assertEqual(str1, array[0])
  178. assertEqual(str1, array[1])
  179. assertThrows(array.remove(at: 2))
  180. assertThrows(array.remove(at: -2))
  181. }
  182. func testRemoveLast() {
  183. guard let array = array, let str1 = str1, let str2 = str2 else {
  184. fatalError("Test precondition failure")
  185. }
  186. array.append(objectsIn: [str1, str2])
  187. array.removeLast()
  188. XCTAssertEqual(Int(1), array.count)
  189. assertEqual(str1, array[0])
  190. array.removeLast()
  191. XCTAssertEqual(Int(0), array.count)
  192. assertThrows(array.removeLast()) // Should throw if already empty
  193. }
  194. func testRemoveAll() {
  195. guard let array = array, let str1 = str1, let str2 = str2 else {
  196. fatalError("Test precondition failure")
  197. }
  198. array.append(objectsIn: [str1, str2])
  199. array.removeAll()
  200. XCTAssertEqual(Int(0), array.count)
  201. array.removeAll() // should be a no-op
  202. XCTAssertEqual(Int(0), array.count)
  203. }
  204. func testReplace() {
  205. guard let array = array, let str1 = str1, let str2 = str2 else {
  206. fatalError("Test precondition failure")
  207. }
  208. array.append(objectsIn: [str1, str1])
  209. array.replace(index: 0, object: str2)
  210. XCTAssertEqual(Int(2), array.count)
  211. assertEqual(str2, array[0])
  212. assertEqual(str1, array[1])
  213. array.replace(index: 1, object: str2)
  214. XCTAssertEqual(Int(2), array.count)
  215. assertEqual(str2, array[0])
  216. assertEqual(str2, array[1])
  217. assertThrows(array.replace(index: 200, object: str2))
  218. assertThrows(array.replace(index: -200, object: str2))
  219. }
  220. func testMove() {
  221. guard let array = array, let str1 = str1, let str2 = str2 else {
  222. fatalError("Test precondition failure")
  223. }
  224. array.append(objectsIn: [str1, str2])
  225. array.move(from: 1, to: 0)
  226. XCTAssertEqual(array[0].stringCol, "2")
  227. XCTAssertEqual(array[1].stringCol, "1")
  228. array.move(from: 0, to: 1)
  229. XCTAssertEqual(array[0].stringCol, "1")
  230. XCTAssertEqual(array[1].stringCol, "2")
  231. array.move(from: 0, to: 0)
  232. XCTAssertEqual(array[0].stringCol, "1")
  233. XCTAssertEqual(array[1].stringCol, "2")
  234. assertThrows(array.move(from: 0, to: 2))
  235. assertThrows(array.move(from: 2, to: 0))
  236. }
  237. func testReplaceRange() {
  238. guard let array = array, let str1 = str1, let str2 = str2 else {
  239. fatalError("Test precondition failure")
  240. }
  241. array.append(objectsIn: [str1, str1])
  242. array.replaceSubrange(0..<1, with: [str2])
  243. XCTAssertEqual(Int(2), array.count)
  244. assertEqual(str2, array[0])
  245. assertEqual(str1, array[1])
  246. array.replaceSubrange(1..<2, with: [str2])
  247. XCTAssertEqual(Int(2), array.count)
  248. assertEqual(str2, array[0])
  249. assertEqual(str2, array[1])
  250. array.replaceSubrange(0..<0, with: [str2])
  251. XCTAssertEqual(Int(3), array.count)
  252. assertEqual(str2, array[0])
  253. assertEqual(str2, array[1])
  254. assertEqual(str2, array[2])
  255. array.replaceSubrange(0..<3, with: [])
  256. XCTAssertEqual(Int(0), array.count)
  257. assertThrows(array.replaceSubrange(200..<201, with: [str2]))
  258. assertThrows(array.replaceSubrange(-200..<200, with: [str2]))
  259. assertThrows(array.replaceSubrange(0..<200, with: [str2]))
  260. }
  261. func testSwapAt() {
  262. guard let array = array, let str1 = str1, let str2 = str2 else {
  263. fatalError("Test precondition failure")
  264. }
  265. array.append(objectsIn: [str1, str2])
  266. array.swapAt(0, 1)
  267. XCTAssertEqual(Int(2), array.count)
  268. assertEqual(str2, array[0])
  269. assertEqual(str1, array[1])
  270. array.swapAt(1, 1)
  271. XCTAssertEqual(Int(2), array.count)
  272. assertEqual(str2, array[0])
  273. assertEqual(str1, array[1])
  274. assertThrows(array.swapAt(-1, 0))
  275. assertThrows(array.swapAt(0, -1))
  276. assertThrows(array.swapAt(1000, 0))
  277. assertThrows(array.swapAt(0, 1000))
  278. }
  279. func testChangesArePersisted() {
  280. guard let array = array, let str1 = str1, let str2 = str2 else {
  281. fatalError("Test precondition failure")
  282. }
  283. if let realm = array.realm {
  284. array.append(objectsIn: [str1, str2])
  285. let otherArray = realm.objects(SwiftArrayPropertyObject.self).first!.array
  286. XCTAssertEqual(Int(2), otherArray.count)
  287. }
  288. }
  289. func testPopulateEmptyArray() {
  290. guard let array = array else {
  291. fatalError("Test precondition failure")
  292. }
  293. XCTAssertEqual(array.count, 0, "Should start with no array elements.")
  294. let obj = SwiftStringObject()
  295. obj.stringCol = "a"
  296. array.append(obj)
  297. array.append(realmWithTestPath().create(SwiftStringObject.self, value: ["b"]))
  298. array.append(obj)
  299. XCTAssertEqual(array.count, 3)
  300. XCTAssertEqual(array[0].stringCol, "a")
  301. XCTAssertEqual(array[1].stringCol, "b")
  302. XCTAssertEqual(array[2].stringCol, "a")
  303. // Make sure we can enumerate
  304. for obj in array {
  305. XCTAssertTrue(obj.description.utf16.count > 0, "Object should have description")
  306. }
  307. }
  308. func testEnumeratingListWithListProperties() {
  309. let arrayObject = createArrayWithLinks()
  310. arrayObject.realm?.beginWrite()
  311. for _ in 0..<10 {
  312. arrayObject.array.append(SwiftObject())
  313. }
  314. try! arrayObject.realm?.commitWrite()
  315. XCTAssertEqual(10, arrayObject.array.count)
  316. for object in arrayObject.array {
  317. XCTAssertEqual(123, object.intCol)
  318. XCTAssertEqual(false, object.objectCol!.boolCol)
  319. XCTAssertEqual(0, object.arrayCol.count)
  320. }
  321. }
  322. func testValueForKey() {
  323. do {
  324. let realm = try! Realm()
  325. try! realm.write {
  326. for value in [1, 2] {
  327. let listObject = SwiftListOfSwiftObject()
  328. let object = SwiftObject()
  329. object.intCol = value
  330. object.doubleCol = Double(value)
  331. object.stringCol = String(value)
  332. listObject.array.append(object)
  333. realm.add(listObject)
  334. }
  335. }
  336. do {
  337. let objects = realm.objects(SwiftListOfSwiftObject.self)
  338. let properties: [Int] = Array(objects.flatMap { $0.array.map { $0.intCol }})
  339. let listsOfObjects = objects.value(forKeyPath: "array") as! [List<SwiftObject>]
  340. let kvcProperties: [Int] = Array(listsOfObjects.flatMap { $0.map { $0.intCol }})
  341. XCTAssertEqual(properties, kvcProperties)
  342. }
  343. do {
  344. let objects = realm.objects(SwiftListOfSwiftObject.self)
  345. let properties = Array(objects.flatMap { $0.array.map { $0.doubleCol }})
  346. let listsOfObjects = objects.value(forKeyPath: "array") as! [List<SwiftObject>]
  347. let kvcProperties = Array(listsOfObjects.flatMap { $0.map { $0.doubleCol }})
  348. XCTAssertEqual(properties, kvcProperties)
  349. }
  350. do {
  351. let objects = realm.objects(SwiftListOfSwiftObject.self)
  352. let properties = Array(objects.flatMap { $0.array.map { $0.stringCol }})
  353. let listsOfObjects = objects.value(forKeyPath: "array") as! [List<SwiftObject>]
  354. let kvcProperties = Array(listsOfObjects.flatMap { $0.map { $0.stringCol }})
  355. XCTAssertEqual(properties, kvcProperties)
  356. }
  357. do {
  358. let realm = try! Realm()
  359. do {
  360. let objects = realm.objects(SwiftObject.self)
  361. let properties = Array(objects.compactMap { $0.intCol })
  362. let listsOfObjects = objects.value(forKeyPath: "intCol") as! [Int]
  363. let kvcProperties = Array(listsOfObjects.compactMap { $0 })
  364. XCTAssertEqual(properties, kvcProperties)
  365. }
  366. do {
  367. let objects = realm.objects(SwiftObject.self)
  368. let properties = Array(objects.compactMap { $0.doubleCol })
  369. let listsOfObjects = objects.value(forKeyPath: "doubleCol") as! [Double]
  370. let kvcProperties = Array(listsOfObjects.compactMap { $0 })
  371. XCTAssertEqual(properties, kvcProperties)
  372. }
  373. do {
  374. let objects = realm.objects(SwiftObject.self)
  375. let properties = Array(objects.compactMap { $0.stringCol })
  376. let listsOfObjects = objects.value(forKeyPath: "stringCol") as! [String]
  377. let kvcProperties = Array(listsOfObjects.compactMap { $0 })
  378. XCTAssertEqual(properties, kvcProperties)
  379. }
  380. }
  381. }
  382. do {
  383. let realm = try! Realm()
  384. try! realm.write {
  385. for value in [1, 2] {
  386. let listObject = SwiftListOfSwiftOptionalObject()
  387. let object = SwiftOptionalObject()
  388. object.optIntCol.value = value
  389. object.optInt8Col.value = Int8(value)
  390. object.optDoubleCol.value = Double(value)
  391. object.optStringCol = String(value)
  392. object.optNSStringCol = NSString(format: "%d", value)
  393. listObject.array.append(object)
  394. realm.add(listObject)
  395. }
  396. }
  397. do {
  398. let objects = realm.objects(SwiftListOfSwiftOptionalObject.self)
  399. let properties = Array(objects.flatMap { $0.array.compactMap { $0.optIntCol.value }})
  400. let listsOfObjects = objects.value(forKeyPath: "array") as! [List<SwiftOptionalObject>]
  401. let kvcProperties = Array(listsOfObjects.flatMap { $0.compactMap { $0.optIntCol.value }})
  402. XCTAssertEqual(properties, kvcProperties)
  403. }
  404. do {
  405. let objects = realm.objects(SwiftListOfSwiftOptionalObject.self)
  406. let properties = Array(objects.flatMap { $0.array.compactMap { $0.optInt8Col.value }})
  407. let listsOfObjects = objects.value(forKeyPath: "array") as! [List<SwiftOptionalObject>]
  408. let kvcProperties = Array(listsOfObjects.flatMap { $0.compactMap { $0.optInt8Col.value }})
  409. XCTAssertEqual(properties, kvcProperties)
  410. }
  411. do {
  412. let objects = realm.objects(SwiftListOfSwiftOptionalObject.self)
  413. let properties = Array(objects.flatMap { $0.array.compactMap { $0.optDoubleCol.value }})
  414. let listsOfObjects = objects.value(forKeyPath: "array") as! [List<SwiftOptionalObject>]
  415. let kvcProperties = Array(listsOfObjects.flatMap { $0.compactMap { $0.optDoubleCol.value }})
  416. XCTAssertEqual(properties, kvcProperties)
  417. }
  418. do {
  419. let objects = realm.objects(SwiftListOfSwiftOptionalObject.self)
  420. let properties = Array(objects.flatMap { $0.array.compactMap { $0.optStringCol }})
  421. let listsOfObjects = objects.value(forKeyPath: "array") as! [List<SwiftOptionalObject>]
  422. let kvcProperties = Array(listsOfObjects.flatMap { $0.compactMap { $0.optStringCol }})
  423. XCTAssertEqual(properties, kvcProperties)
  424. }
  425. do {
  426. let objects = realm.objects(SwiftListOfSwiftOptionalObject.self)
  427. let properties = Array(objects.flatMap { $0.array.compactMap { $0.optNSStringCol }})
  428. let listsOfObjects = objects.value(forKeyPath: "array") as! [List<SwiftOptionalObject>]
  429. let kvcProperties = Array(listsOfObjects.flatMap { $0.compactMap { $0.optNSStringCol }})
  430. XCTAssertEqual(properties, kvcProperties)
  431. }
  432. do {
  433. let objects = realm.objects(SwiftOptionalObject.self)
  434. let properties = Array(objects.compactMap { $0.optIntCol.value })
  435. let listsOfObjects = objects.value(forKeyPath: "optIntCol") as! [Int]
  436. let kvcProperties = Array(listsOfObjects.compactMap { $0 })
  437. XCTAssertEqual(properties, kvcProperties)
  438. }
  439. do {
  440. let objects = realm.objects(SwiftOptionalObject.self)
  441. let properties = Array(objects.compactMap { $0.optInt8Col.value })
  442. let listsOfObjects = objects.value(forKeyPath: "optInt8Col") as! [Int8]
  443. let kvcProperties = Array(listsOfObjects.compactMap { $0 })
  444. XCTAssertEqual(properties, kvcProperties)
  445. }
  446. do {
  447. let objects = realm.objects(SwiftOptionalObject.self)
  448. let properties = Array(objects.compactMap { $0.optDoubleCol.value })
  449. let listsOfObjects = objects.value(forKeyPath: "optDoubleCol") as! [Double]
  450. let kvcProperties = Array(listsOfObjects.compactMap { $0 })
  451. XCTAssertEqual(properties, kvcProperties)
  452. }
  453. do {
  454. let objects = realm.objects(SwiftOptionalObject.self)
  455. let properties = Array(objects.compactMap { $0.optStringCol })
  456. let listsOfObjects = objects.value(forKeyPath: "optStringCol") as! [String]
  457. let kvcProperties = Array(listsOfObjects.compactMap { $0 })
  458. XCTAssertEqual(properties, kvcProperties)
  459. }
  460. do {
  461. let objects = realm.objects(SwiftOptionalObject.self)
  462. let properties = Array(objects.compactMap { $0.optNSStringCol })
  463. let listsOfObjects = objects.value(forKeyPath: "optNSStringCol") as! [NSString?]
  464. let kvcProperties = Array(listsOfObjects.compactMap { $0 })
  465. XCTAssertEqual(properties, kvcProperties)
  466. }
  467. }
  468. }
  469. }
  470. class ListStandaloneTests: ListTests {
  471. override func createArray() -> SwiftArrayPropertyObject {
  472. let array = SwiftArrayPropertyObject()
  473. XCTAssertNil(array.realm)
  474. return array
  475. }
  476. override func createArrayWithLinks() -> SwiftListOfSwiftObject {
  477. let array = SwiftListOfSwiftObject()
  478. XCTAssertNil(array.realm)
  479. return array
  480. }
  481. }
  482. class ListNewlyAddedTests: ListTests {
  483. override func createArray() -> SwiftArrayPropertyObject {
  484. let array = SwiftArrayPropertyObject()
  485. array.name = "name"
  486. let realm = realmWithTestPath()
  487. try! realm.write { realm.add(array) }
  488. XCTAssertNotNil(array.realm)
  489. return array
  490. }
  491. override func createArrayWithLinks() -> SwiftListOfSwiftObject {
  492. let array = SwiftListOfSwiftObject()
  493. let realm = try! Realm()
  494. try! realm.write { realm.add(array) }
  495. XCTAssertNotNil(array.realm)
  496. return array
  497. }
  498. }
  499. class ListNewlyCreatedTests: ListTests {
  500. override func createArray() -> SwiftArrayPropertyObject {
  501. let realm = realmWithTestPath()
  502. realm.beginWrite()
  503. let array = realm.create(SwiftArrayPropertyObject.self, value: ["name", [], []])
  504. try! realm.commitWrite()
  505. XCTAssertNotNil(array.realm)
  506. return array
  507. }
  508. override func createArrayWithLinks() -> SwiftListOfSwiftObject {
  509. let realm = try! Realm()
  510. realm.beginWrite()
  511. let array = realm.create(SwiftListOfSwiftObject.self)
  512. try! realm.commitWrite()
  513. XCTAssertNotNil(array.realm)
  514. return array
  515. }
  516. }
  517. class ListRetrievedTests: ListTests {
  518. override func createArray() -> SwiftArrayPropertyObject {
  519. let realm = realmWithTestPath()
  520. realm.beginWrite()
  521. realm.create(SwiftArrayPropertyObject.self, value: ["name", [], []])
  522. try! realm.commitWrite()
  523. let array = realm.objects(SwiftArrayPropertyObject.self).first!
  524. XCTAssertNotNil(array.realm)
  525. return array
  526. }
  527. override func createArrayWithLinks() -> SwiftListOfSwiftObject {
  528. let realm = try! Realm()
  529. realm.beginWrite()
  530. realm.create(SwiftListOfSwiftObject.self)
  531. try! realm.commitWrite()
  532. let array = realm.objects(SwiftListOfSwiftObject.self).first!
  533. XCTAssertNotNil(array.realm)
  534. return array
  535. }
  536. }
  537. /// Ensure the range replaceable collection methods behave correctly when emulated for Swift 4 and later.
  538. class ListRRCMethodsTests: TestCase {
  539. private func compare(array: [Int], with list: List<SwiftIntObject>) {
  540. guard array.count == list.count else {
  541. XCTFail("Array and list have different sizes (\(array.count) and \(list.count), respectively).")
  542. return
  543. }
  544. for i in 0..<array.count {
  545. XCTAssertEqual(array[i], list[i].intCol,
  546. "Mistmatched array value (\(array[i])) and list value (\(list[i].intCol)) at index \(i)")
  547. }
  548. }
  549. private func makeArray(from list: List<SwiftIntObject>) -> [Int] {
  550. return list.map { $0.intCol }
  551. }
  552. private func makeSwiftIntObjects(from array: [Int]) -> [SwiftIntObject] {
  553. return array.map { SwiftIntObject(value: [$0]) }
  554. }
  555. private func createListObject(_ values: [Int] = [0, 1, 2, 3, 4, 5, 6]) -> SwiftArrayPropertyObject {
  556. let object = SwiftArrayPropertyObject()
  557. XCTAssertNil(object.realm)
  558. object.intArray.append(objectsIn: makeSwiftIntObjects(from: values))
  559. return object
  560. }
  561. private var array: [Int]!
  562. private var list: List<SwiftIntObject>!
  563. override func setUp() {
  564. super.setUp()
  565. list = createListObject().intArray
  566. array = makeArray(from: list)
  567. }
  568. func testSubscript() {
  569. list[0] = SwiftIntObject(value: [5])
  570. list[1..<4] = createListObject([10, 11, 12]).intArray[0..<2]
  571. array[0] = 5
  572. array[1..<4] = [10, 11]
  573. compare(array: array, with: list)
  574. }
  575. func testReplaceWithCollectionIndices() {
  576. let newElements = [1, 2, 3]
  577. list.replaceSubrange(list.indices, with: makeSwiftIntObjects(from: newElements))
  578. array.replaceSubrange(array.indices, with: newElements)
  579. compare(array: array, with: list)
  580. }
  581. func testRemoveWithCollectionIndices() {
  582. list.removeSubrange(list.indices)
  583. XCTAssertTrue(list.isEmpty)
  584. }
  585. func testRemoveFirst() {
  586. list.removeFirst()
  587. array.removeFirst()
  588. compare(array: array, with: list)
  589. }
  590. func testRemoveFirstFew() {
  591. list.removeFirst(3)
  592. array.removeFirst(3)
  593. compare(array: array, with: list)
  594. }
  595. func testRemoveFirstInvalid() {
  596. assertThrows(list.removeFirst(-1))
  597. assertThrows(list.removeFirst(100))
  598. }
  599. func testRemoveLastFew() {
  600. list.removeLast(3)
  601. array.removeLast(3)
  602. compare(array: array, with: list)
  603. }
  604. func testInsert() {
  605. let newElements = [10, 11, 12, 13]
  606. list.insert(contentsOf: makeSwiftIntObjects(from: newElements), at: 2)
  607. array.insert(contentsOf: newElements, at: 2)
  608. compare(array: array, with: list)
  609. }
  610. func testRemoveClosedSubrange() {
  611. let subrange: ClosedRange<Int> = 1...3
  612. list.removeSubrange(subrange)
  613. array.removeSubrange(subrange)
  614. compare(array: array, with: list)
  615. }
  616. func testRemoveOpenSubrange() {
  617. let subrange: Range<Int> = 1..<3
  618. list.removeSubrange(subrange)
  619. array.removeSubrange(subrange)
  620. compare(array: array, with: list)
  621. }
  622. func testReplaceClosedSubrange() {
  623. let subrange: ClosedRange<Int> = 2...5
  624. let newElements = [10, 11, 12, 13, 14, 15, 16]
  625. list.replaceSubrange(subrange, with: makeSwiftIntObjects(from: newElements))
  626. array.replaceSubrange(subrange, with: newElements)
  627. compare(array: array, with: list)
  628. }
  629. func testReplaceOpenSubrange() {
  630. let subrange: Range<Int> = 2..<5
  631. let newElements = [10, 11, 12, 13, 14, 15, 16]
  632. list.replaceSubrange(subrange, with: makeSwiftIntObjects(from: newElements))
  633. array.replaceSubrange(subrange, with: newElements)
  634. compare(array: array, with: list)
  635. }
  636. }