diff --git a/CoreStore/Migrating/MigrationChain.swift b/CoreStore/Migrating/MigrationChain.swift index 2fb501c..424d6ae 100644 --- a/CoreStore/Migrating/MigrationChain.swift +++ b/CoreStore/Migrating/MigrationChain.swift @@ -115,6 +115,8 @@ public struct MigrationChain: NilLiteralConvertible, StringLiteralConvertible, D if let _ = versionTree.updateValue(tuple.1, forKey: tuple.0) { + CoreStore.assert(false, "\(typeName(MigrationChain))'s migration chain could not be created due to ambiguous version paths.") + valid = false } return versionTree @@ -133,7 +135,9 @@ public struct MigrationChain: NilLiteralConvertible, StringLiteralConvertible, D var version = start while let nextVersion = versionTree[version] where nextVersion != version { - if checklist.contains(version) { + if checklist.contains(nextVersion) { + + CoreStore.assert(false, "\(typeName(MigrationChain))'s migration chain could not be created due to looping version paths.") return true } diff --git a/CoreStoreTests/CoreStoreTests.swift b/CoreStoreTests/CoreStoreTests.swift index 6520018..3b9623c 100644 --- a/CoreStoreTests/CoreStoreTests.swift +++ b/CoreStoreTests/CoreStoreTests.swift @@ -25,6 +25,8 @@ import UIKit import XCTest + +@testable import CoreStore class CoreStoreTests: XCTestCase { @@ -41,6 +43,42 @@ class CoreStoreTests: XCTestCase { super.tearDown() } + func testMigrationChains() { + + let emptyChain: MigrationChain = nil + XCTAssertTrue(emptyChain.valid, "emptyChain.valid") + XCTAssertTrue(emptyChain.empty, "emptyChain.empty") + + let normalChain: MigrationChain = "version1" + XCTAssertTrue(normalChain.valid, "normalChain.valid") + XCTAssertTrue(normalChain.empty, "normalChain.empty") + + let linearChain: MigrationChain = ["version1", "version2", "version3", "version4"] + XCTAssertTrue(linearChain.valid, "linearChain.valid") + XCTAssertFalse(linearChain.empty, "linearChain.empty") + + let treeChain: MigrationChain = [ + "version1": "version4", + "version2": "version3", + "version3": "version4" + ] + XCTAssertTrue(treeChain.valid, "treeChain.valid") + XCTAssertFalse(treeChain.empty, "treeChain.empty") + + // The cases below will trigger assertion failures internally + +// let linearLoopChain: MigrationChain = ["version1", "version2", "version1", "version3", "version4"] +// XCTAssertFalse(linearLoopChain.valid, "linearLoopChain.valid") +// +// let treeAmbiguousChain: MigrationChain = [ +// "version1": "version4", +// "version2": "version3", +// "version1": "version2", +// "version3": "version4" +// ] +// XCTAssertFalse(treeAmbiguousChain.valid, "treeAmbiguousChain.valid") + } + func testExample() { let stack = DataStack(modelName: "Model", bundle: NSBundle(forClass: self.dynamicType))