ListTests.swift 27 KB

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