Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,12 @@ Carthage/Build
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
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
1 change: 1 addition & 0 deletions .idea/.name

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions .idea/mvvmc-demo.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions .idea/xcode.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

52 changes: 26 additions & 26 deletions MVVM-CTests/MVVMCAuthenticateViewModelTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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()
Expand All @@ -44,65 +44,65 @@ 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
}
}
}

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)
Expand All @@ -112,7 +112,7 @@ extension MVVMCAuthenticateViewModelTests: AuthenticateViewModelViewDelegate

extension MVVMCAuthenticateViewModelTests: AuthenticateViewModelCoordinatorDelegate
{
func authenticateViewModelDidLogin(viewModel viewModel: AuthenticateViewModel) {
func authenticateViewModelDidLogin(viewModel: AuthenticateViewModel) {
currentExpectaion?.fulfill()
}
}
64 changes: 32 additions & 32 deletions MVVM-CTests/MVVMCListViewModelTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ import XCTest

class MVVMCListViewModelTests: XCTestCase
{

var currentExpectaion: XCTestExpectation?

func testDefaults()
{
let vm = MVVMCListViewModel()
Expand All @@ -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
}
}
Expand All @@ -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()
Expand Down
32 changes: 16 additions & 16 deletions MVVM-CTests/MVVMDetailViewModelTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,60 +13,60 @@ class MVVMDetailViewModelTests: XCTestCase

var currentExpectaion: XCTestExpectation?
var expectedItem: DataItem?


func testInitialDefaults() {
let vm = MVVMCDetailViewModel()
XCTAssertNil(vm.detail)
XCTAssertNil(vm.viewDelegate)
XCTAssertNil(vm.model)
XCTAssertNil(vm.coordinatorDelegate)
}

func testDetail()
{
let vm = MVVMCDetailViewModel()
let item = MVVMCDataItem(name: "Test Name", role: "Test Role")
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
}
}
}

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)
Expand All @@ -76,7 +76,7 @@ extension MVVMDetailViewModelTests: DetailViewModelViewDelegate

extension MVVMDetailViewModelTests: DetailViewModelCoordinatorDelegate
{
func detailViewModelDidEnd(viewModel: DetailViewModel) {
func detailViewModelDidEnd(_ viewModel: DetailViewModel) {
currentExpectaion?.fulfill()
}
}