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()
}
}