diff --git a/.gitignore b/.gitignore index cab8c69..52d52b5 100644 --- a/.gitignore +++ b/.gitignore @@ -62,4 +62,12 @@ Carthage/Build fastlane/report.xml fastlane/Preview.html fastlane/screenshots -fastlane/test_output \ No newline at end of file +fastlane/test_output + +# JetBrains AppCode user-specific files +/.idea/atlassian-ide-plugin.xml +/.idea/codeStyles/ +/.idea/markdown-navigator.xml +/.idea/markdown-navigator/ +/.idea/misc.xml +/.idea/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..c769ae9 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +MVVM-C \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..e4716fa --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/mvvmc-demo.iml b/.idea/mvvmc-demo.iml new file mode 100644 index 0000000..74121dc --- /dev/null +++ b/.idea/mvvmc-demo.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/xcode.xml b/.idea/xcode.xml new file mode 100644 index 0000000..6f2ef05 --- /dev/null +++ b/.idea/xcode.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/MVVM-CTests/MVVMCAuthenticateViewModelTests.swift b/MVVM-CTests/MVVMCAuthenticateViewModelTests.swift index 71a3c37..9b8f90b 100644 --- a/MVVM-CTests/MVVMCAuthenticateViewModelTests.swift +++ b/MVVM-CTests/MVVMCAuthenticateViewModelTests.swift @@ -10,12 +10,12 @@ import XCTest class MVVMCAuthenticateViewModelTests: XCTestCase { - + var currentExpectaion: XCTestExpectation? var expectedCanSubmit: Bool = false var expectedErrorMessage: String = "" - - + + func testInitialDefaults() { let vm = MVVMCAuthenticateViewModel() XCTAssertEqual("", vm.email) @@ -26,14 +26,14 @@ class MVVMCAuthenticateViewModelTests: XCTestCase XCTAssertNil(vm.model) XCTAssertNil(vm.coordinatorDelegate) } - + func testEmail() { let vm = MVVMCAuthenticateViewModel() vm.email = "scotty@example.com" XCTAssertEqual("scotty@example.com", vm.email) } - + func testPassword() { let vm = MVVMCAuthenticateViewModel() @@ -44,50 +44,50 @@ class MVVMCAuthenticateViewModelTests: XCTestCase func testCanSubmit() { let vm = MVVMCAuthenticateViewModel() XCTAssertFalse(vm.canSubmit) - + vm.email = "scotty@example.com" vm.password = "" XCTAssertFalse(vm.canSubmit) - + vm.email = "" vm.password = "password" XCTAssertFalse(vm.canSubmit) - + vm.email = "scotty@example.com" vm.password = "password" XCTAssert(vm.canSubmit) } - + func testErrorMessageDidChange() { - + let vm = MVVMCAuthenticateViewModel() vm.viewDelegate = self - - currentExpectaion = expectationWithDescription("estErrorMessageDidChange") + + currentExpectaion = expectation(description: "estErrorMessageDidChange") expectedErrorMessage = "Incomplete or Invalid Data"; - + // Call submit with no model set on the viewModel should produce an error message vm.submit() - - waitForExpectationsWithTimeout(1) { error in + + waitForExpectations(timeout: 1) { error in vm.viewDelegate = nil } } - + func testCoordinatorDelegate() { let vm = MVVMCAuthenticateViewModel() vm.model = MVVMCAuthenticateModel() - + vm.coordinatorDelegate = self - currentExpectaion = expectationWithDescription("testCoordinatorDelegate") - + currentExpectaion = expectation(description: "testCoordinatorDelegate") + vm.email = "scotty@example.com" vm.password = "password" - + vm.submit() - - waitForExpectationsWithTimeout(1) { error in + + waitForExpectations(timeout: 1) { error in vm.coordinatorDelegate = nil } } @@ -95,14 +95,14 @@ class MVVMCAuthenticateViewModelTests: XCTestCase extension MVVMCAuthenticateViewModelTests: AuthenticateViewModelViewDelegate { - func canSubmitStatusDidChange(viewModel: AuthenticateViewModel, status: Bool) + func canSubmitStatusDidChange(_ viewModel: AuthenticateViewModel, status: Bool) { XCTAssertEqual(expectedCanSubmit, status) XCTAssertEqual(expectedCanSubmit, viewModel.canSubmit) currentExpectaion?.fulfill() } - - func errorMessageDidChange(viewModel: AuthenticateViewModel, message: String) + + func errorMessageDidChange(_ viewModel: AuthenticateViewModel, message: String) { XCTAssertEqual(expectedErrorMessage, message) XCTAssertEqual(expectedErrorMessage, viewModel.errorMessage) @@ -112,7 +112,7 @@ extension MVVMCAuthenticateViewModelTests: AuthenticateViewModelViewDelegate extension MVVMCAuthenticateViewModelTests: AuthenticateViewModelCoordinatorDelegate { - func authenticateViewModelDidLogin(viewModel viewModel: AuthenticateViewModel) { + func authenticateViewModelDidLogin(viewModel: AuthenticateViewModel) { currentExpectaion?.fulfill() } } diff --git a/MVVM-CTests/MVVMCListViewModelTests.swift b/MVVM-CTests/MVVMCListViewModelTests.swift index 00eaa53..3927ab0 100644 --- a/MVVM-CTests/MVVMCListViewModelTests.swift +++ b/MVVM-CTests/MVVMCListViewModelTests.swift @@ -10,9 +10,9 @@ import XCTest class MVVMCListViewModelTests: XCTestCase { - + var currentExpectaion: XCTestExpectation? - + func testDefaults() { let vm = MVVMCListViewModel() @@ -22,81 +22,81 @@ class MVVMCListViewModelTests: XCTestCase XCTAssertNil(vm.model) XCTAssertNil(vm.coordinatorDelegate) } - + func testNumberOfItems() { let vm = MVVMCListViewModel() - + // We can test with the actual app model as it produces hard coded data // In normal testing we would create a ListModel implementation with fix test data to use, vm.model = MVVMCListModel() XCTAssertEqual(7,vm.numberOfItems) } - + func testItemAtIndex() { - + let vm = MVVMCListViewModel() - + // We can test with the actual app model as it produces hard coded data // In normal testing we would create a ListModel implementation with fix test data to use, vm.model = MVVMCListModel() - - + + // Test a value from the start , end and middle of list - + var dataItem = vm.itemAtIndex(0) XCTAssertNotNil(dataItem) - + guard let item = dataItem else { return } - + XCTAssertEqual("James T Kirk", item.name) XCTAssertEqual("Captain", item.role) - - + + dataItem = vm.itemAtIndex(6) XCTAssertNotNil(dataItem) - + guard let item2 = dataItem else { return } - + XCTAssertEqual("Pavel Chekov", item2.name) XCTAssertEqual("Ensign", item2.role) - - + + dataItem = vm.itemAtIndex(3) XCTAssertNotNil(dataItem) - + guard let item3 = dataItem else { return } - + XCTAssertEqual("Montgomery Scott", item3.name) XCTAssertEqual("Lieutenant Commander", item3.role) - + } - + func testItemAtIndexWithInvalidIndex() { - + let vm = MVVMCListViewModel() - + // We can test with the actual app model as it produces hard coded data // In normal testing we would create a ListModel implementation with fixed test data to use, vm.model = MVVMCListModel() - + // Test a value from beyond the end of the list let dataItem = vm.itemAtIndex(vm.numberOfItems + 1) XCTAssertNil(dataItem) } - + func testUseItemAtIndex() { - + let vm = MVVMCListViewModel() - + // We can test with the actual app model as it produces hard coded data // In normal testing we would create a ListModel implementation with fixed test data to use, vm.model = MVVMCListModel() vm.coordinatorDelegate = self - currentExpectaion = expectationWithDescription("testUseItemAtIndex") + currentExpectaion = expectation(description: "testUseItemAtIndex") vm.useItemAtIndex(6) - - waitForExpectationsWithTimeout(1) { error in + + waitForExpectations(timeout: 1) { error in vm.coordinatorDelegate = nil } } @@ -105,7 +105,7 @@ class MVVMCListViewModelTests: XCTestCase extension MVVMCListViewModelTests: ListViewModelCoordinatorDelegate { - func listViewModelDidSelectData(viewModel: ListViewModel, data: DataItem) { + func listViewModelDidSelectData(_ viewModel: ListViewModel, data: DataItem) { XCTAssertEqual("Pavel Chekov", data.name) XCTAssertEqual("Ensign", data.role) currentExpectaion?.fulfill() diff --git a/MVVM-CTests/MVVMDetailViewModelTests.swift b/MVVM-CTests/MVVMDetailViewModelTests.swift index 1515df0..9d03f93 100644 --- a/MVVM-CTests/MVVMDetailViewModelTests.swift +++ b/MVVM-CTests/MVVMDetailViewModelTests.swift @@ -13,8 +13,8 @@ class MVVMDetailViewModelTests: XCTestCase var currentExpectaion: XCTestExpectation? var expectedItem: DataItem? - - + + func testInitialDefaults() { let vm = MVVMCDetailViewModel() XCTAssertNil(vm.detail) @@ -22,7 +22,7 @@ class MVVMDetailViewModelTests: XCTestCase XCTAssertNil(vm.model) XCTAssertNil(vm.coordinatorDelegate) } - + func testDetail() { let vm = MVVMCDetailViewModel() @@ -30,35 +30,35 @@ class MVVMDetailViewModelTests: XCTestCase let model = MVVMCDetailModel(detailItem: item) vm.model = model XCTAssertNotNil(vm.detail) - + guard let detail = vm.detail else { return } - + XCTAssertEqual("Test Name", detail.name) XCTAssertEqual("Test Role", detail.role) } - - + + func testDetailDidChange() { - + let vm = MVVMCDetailViewModel() expectedItem = MVVMCDataItem(name: "Test Name", role: "Test Role") let model = MVVMCDetailModel(detailItem: expectedItem!) vm.viewDelegate = self - currentExpectaion = expectationWithDescription("testDetailDidChange") + currentExpectaion = expectation(description: "testDetailDidChange") vm.model = model - - waitForExpectationsWithTimeout(1) { error in + + waitForExpectations(timeout: 1) { error in vm.viewDelegate = nil } } - + func testCoordinatorDelegate() { let vm = MVVMCDetailViewModel() vm.coordinatorDelegate = self - currentExpectaion = expectationWithDescription("testDetailDidChange") + currentExpectaion = expectation(description: "testDetailDidChange") vm.done() - waitForExpectationsWithTimeout(1) { error in + waitForExpectations(timeout: 1) { error in vm.viewDelegate = nil } } @@ -66,7 +66,7 @@ class MVVMDetailViewModelTests: XCTestCase extension MVVMDetailViewModelTests: DetailViewModelViewDelegate { - func detailDidChange(viewModel viewModel: DetailViewModel) { + func detailDidChange(viewModel: DetailViewModel) { XCTAssertNotNil(viewModel.detail) XCTAssertEqual(expectedItem?.name, viewModel.detail?.name) XCTAssertEqual(expectedItem?.role, viewModel.detail?.role) @@ -76,7 +76,7 @@ extension MVVMDetailViewModelTests: DetailViewModelViewDelegate extension MVVMDetailViewModelTests: DetailViewModelCoordinatorDelegate { - func detailViewModelDidEnd(viewModel: DetailViewModel) { + func detailViewModelDidEnd(_ viewModel: DetailViewModel) { currentExpectaion?.fulfill() } }