ListTests.swift 27 KB

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