Skip to content

Commit

Permalink
Close #33 Update the level on memory when pet level up
Browse files Browse the repository at this point in the history
  • Loading branch information
Javier Galera committed Aug 14, 2022
1 parent 89bf00b commit cbd45b2
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 9 deletions.
90 changes: 88 additions & 2 deletions petWalk/petWalkWatchKitAppTests/Design/PetDataViewModelTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ import XCTest

class PetDataViewModelTest: XCTestCase {
private var sut: PetDataViewModel!
private var petMock: Pets!
private var petMock: PetsMock!
private var trackingManagerMock: TrackingManagerMock!
private var saveAccumulateDailyStepsUseCaseMock: SaveAccumulatedDailyStepsUseCaseMock!
private var saveTotalStepsUseCaseMock : SaveTotalStepsUseCaseMock!
private var savePreviousAnimationProgressUseCaseMock: SavePreviousAnimationProgressUseCaseMock!
private var savePetLevelUseCaseMock: SavePetLevelUseCaseMock!
private var getStepsUseCaseMock: GetStepsUseCaseMock!
private var getAccumulatedDailyStepsUseCaseMock: GetAccumulatedDailyStepsUseCaseMock!
private var getPreviousAnimationProgressUseCaseMock: GetPreviousAnimationProgressUseCaseMock!
Expand All @@ -23,11 +24,16 @@ class PetDataViewModelTest: XCTestCase {
@MainActor override func setUpWithError() throws {
try super.setUpWithError()

petMock = Swordman(name: "petMock", level: Level())
petMock = PetsMock()
petMock.level = Level()
petMock.stats = Stats(currentLevel: 1)
petMock.name = "PetMock"

trackingManagerMock = TrackingManagerMock()
saveAccumulateDailyStepsUseCaseMock = SaveAccumulatedDailyStepsUseCaseMock()
saveTotalStepsUseCaseMock = SaveTotalStepsUseCaseMock()
savePreviousAnimationProgressUseCaseMock = SavePreviousAnimationProgressUseCaseMock()
savePetLevelUseCaseMock = SavePetLevelUseCaseMock()
getStepsUseCaseMock = GetStepsUseCaseMock()
getAccumulatedDailyStepsUseCaseMock = GetAccumulatedDailyStepsUseCaseMock()
getPreviousAnimationProgressUseCaseMock = GetPreviousAnimationProgressUseCaseMock()
Expand All @@ -38,6 +44,7 @@ class PetDataViewModelTest: XCTestCase {
saveAccumulatedDailyStepsUseCase: saveAccumulateDailyStepsUseCaseMock,
saveTotalStepsUseCase: saveTotalStepsUseCaseMock,
savePreviousAnimationProgressUseCase: savePreviousAnimationProgressUseCaseMock,
savePetLevelUseCase: savePetLevelUseCaseMock,
getStepsUseCase: getStepsUseCaseMock,
getAccumulatedDailyStepsUseCase: getAccumulatedDailyStepsUseCaseMock,
getPreviousAnimationProgressUseCase: getPreviousAnimationProgressUseCaseMock)
Expand Down Expand Up @@ -71,6 +78,85 @@ class PetDataViewModelTest: XCTestCase {
XCTAssertEqual(10, sut.currentSteps)
}

func testThatAccumulatedDailyStepsAreSaved_When_GetStepsIsCalled() async throws {
let stepsMock = 10
trackingManagerMock.isTrackingDailyStepsEnabledReturnValue = true
getStepsUseCaseMock.executeReturnValue = stepsMock
getAccumulatedDailyStepsUseCaseMock.executeReturnValue = 0

await sut.getSteps()

XCTAssertEqual(1, saveAccumulateDailyStepsUseCaseMock.executeCallsCount)
XCTAssertEqual(stepsMock, saveAccumulateDailyStepsUseCaseMock.executeReceivedSteps)
}

func testThatTotalStepsAreSaved_When_GetStepsIsCalled() async throws {
let stepsMock = 10
trackingManagerMock.isTrackingDailyStepsEnabledReturnValue = true
getStepsUseCaseMock.executeReturnValue = stepsMock
getAccumulatedDailyStepsUseCaseMock.executeReturnValue = 0

await sut.getSteps()

XCTAssertEqual(1, saveTotalStepsUseCaseMock.executeCallsCount)
XCTAssertEqual(stepsMock, saveTotalStepsUseCaseMock.executeReceivedSteps)
}

@MainActor func testThatAnimationIsDisplayed_When_PetHasRaisedANewLevel() async throws {
let stepsMock = 1000
trackingManagerMock.isTrackingDailyStepsEnabledReturnValue = true
getStepsUseCaseMock.executeReturnValue = stepsMock
getAccumulatedDailyStepsUseCaseMock.executeReturnValue = 0

await sut.getSteps()

XCTAssertTrue(sut.hasPetRaisedANewLevel)
}

@MainActor func testThatPetLevelUpIsCalled_When_PetHasRaisedNewLevel() async throws {
let stepsMock = 1000
trackingManagerMock.isTrackingDailyStepsEnabledReturnValue = true
getStepsUseCaseMock.executeReturnValue = stepsMock
getAccumulatedDailyStepsUseCaseMock.executeReturnValue = 0

await sut.getSteps()

XCTAssertTrue(petMock.levelUpCalled)
}

@MainActor func testThatPetLevelIsSaved_When_PetHasRaisedANewLevel() async throws {
let stepsMock = 301
trackingManagerMock.isTrackingDailyStepsEnabledReturnValue = true
getStepsUseCaseMock.executeReturnValue = stepsMock
getAccumulatedDailyStepsUseCaseMock.executeReturnValue = 0

await sut.getSteps()

XCTAssertEqual(1, savePetLevelUseCaseMock.executeCallsCount)
}

@MainActor func testThatPetLevelUpIsCalledAsManyTimesAsLevelsAreRaisedByPet() async throws {
let stepsMock = 1000
trackingManagerMock.isTrackingDailyStepsEnabledReturnValue = true
getStepsUseCaseMock.executeReturnValue = stepsMock
getAccumulatedDailyStepsUseCaseMock.executeReturnValue = 0

await sut.getSteps()

XCTAssertEqual(3, petMock.levelUpCallsCount)
}

@MainActor func testThatAnimationIsNotDisplayed_When_PetHasNoRaisedANewLevel() async throws {
let stepsMock = 10
trackingManagerMock.isTrackingDailyStepsEnabledReturnValue = true
getStepsUseCaseMock.executeReturnValue = stepsMock
getAccumulatedDailyStepsUseCaseMock.executeReturnValue = 0

await sut.getSteps()

XCTAssertFalse(sut.hasPetRaisedANewLevel)
}

@MainActor func testThatAnimationDailyStepsAreCalculated_When_TrackingDailyStepsIsGranted() async throws {
trackingManagerMock.isTrackingDailyStepsEnabledReturnValue = true
getStepsUseCaseMock.executeReturnValue = 50
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ struct PetDataView: View {
var body: some View {
ZStack {
VStack {
Text("Lvl: \(petDataViewModel.pet.level.currentLevel)")
Text("Lvl: \(petDataViewModel.pet.getCurrentLevel())")
.accessibilityIdentifier("Lvl")
Text("Exp: \(petDataViewModel.currentSteps)")
.accessibilityIdentifier("Exp")
Expand Down Expand Up @@ -87,6 +87,7 @@ struct Animation: View {
let newPercentage = Double(newExp) / Double(levelUpExp)
progressUntilNextLevel = newPercentage * endCircleShape
petDataViewModel.savePreviousProgressAnimation(progressUntilNextLevel + previousExpAnimated)
petDataViewModel.hasPetRaisedANewLevel = false
} else {
let oldPercentage = Double(petDataViewModel.currentSteps) / Double(levelUpExp)
progressUntilNextLevel = oldPercentage * endCircleShape
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,18 @@ class PetDataViewModel: ObservableObject {
private var saveAccumulatedDailyStepsUseCase: SaveAccumulatedDailyStepsUseCase
private var saveTotalStepsUseCase: SaveTotalStepsUseCase
private var savePreviousAnimationProgressUseCase: SavePreviousAnimationProgressUseCase
private var savePetLevelUseCase: SavePetLevelUseCase
private var getStepsUseCase: GetStepsUseCase
private var getAccumulatedDailyStepsUseCase: GetAccumulatedDailyStepsUseCase
private var getPreviousAnimationProgressUseCase: GetPreviousAnimationProgressUseCase

init(pet: Pets, trackingManager: TrackingManager, saveAccumulatedDailyStepsUseCase: SaveAccumulatedDailyStepsUseCase, saveTotalStepsUseCase: SaveTotalStepsUseCase, savePreviousAnimationProgressUseCase: SavePreviousAnimationProgressUseCase, getStepsUseCase: GetStepsUseCase, getAccumulatedDailyStepsUseCase: GetAccumulatedDailyStepsUseCase, getPreviousAnimationProgressUseCase: GetPreviousAnimationProgressUseCase) {
init(pet: Pets, trackingManager: TrackingManager, saveAccumulatedDailyStepsUseCase: SaveAccumulatedDailyStepsUseCase, saveTotalStepsUseCase: SaveTotalStepsUseCase, savePreviousAnimationProgressUseCase: SavePreviousAnimationProgressUseCase, savePetLevelUseCase: SavePetLevelUseCase, getStepsUseCase: GetStepsUseCase, getAccumulatedDailyStepsUseCase: GetAccumulatedDailyStepsUseCase, getPreviousAnimationProgressUseCase: GetPreviousAnimationProgressUseCase) {
self.pet = pet
self.trackingManager = trackingManager
self.saveAccumulatedDailyStepsUseCase = saveAccumulatedDailyStepsUseCase
self.saveTotalStepsUseCase = saveTotalStepsUseCase
self.savePreviousAnimationProgressUseCase = savePreviousAnimationProgressUseCase
self.savePetLevelUseCase = savePetLevelUseCase
self.getStepsUseCase = getStepsUseCase
self.getAccumulatedDailyStepsUseCase = getAccumulatedDailyStepsUseCase
self.getPreviousAnimationProgressUseCase = getPreviousAnimationProgressUseCase
Expand All @@ -51,14 +53,14 @@ class PetDataViewModel: ObservableObject {

}

func feedingPet(_ steps: Int) {
if steps >= pet.level.expToLevelUp {
let leftoverSteps = steps - pet.level.expToLevelUp
private func feedingPet(_ steps: Int) {
if steps >= pet.getExpToRaiseNextLevel() {
let leftoverSteps = steps - pet.getExpToRaiseNextLevel()
pet.levelUp()
savePetLevelUseCase.execute(pet.getCurrentLevel())
hasPetRaisedANewLevel = true
feedingPet(leftoverSteps)
} else {
hasPetRaisedANewLevel = false
calculateAnimationDailySteps(steps)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ private class PetDataViewModelFactory {
let saveAccumulatedDailyStepsUseCase = SaveAccumulatedDailyStepsUseCaseImplementation(repository: userDefaultRepository)
let saveTotalStepsUseCase = SaveTotalStepsUseCaseImplementation(repository: userDefaultRepository)
let savePreviousAnimationProgressUseCase = SavePreviousAnimationProgressUseCaseImplementation(repository: userDefaultRepository)
let savePetLevelUseCase = SavePetLevelUseCaseImplementation(repository: userDefaultRepository)
let getAccumulatedDailyStepsUseCase = GetAccumulatedDailyStepsUseCaseImplementation(repository: userDefaultRepository)
let getPreviousAnimationProgressUseCase = GetPreviousAnimationProgressUseCaseImplementation(repository: userDefaultRepository)

Expand All @@ -34,6 +35,7 @@ private class PetDataViewModelFactory {
saveAccumulatedDailyStepsUseCase: saveAccumulatedDailyStepsUseCase,
saveTotalStepsUseCase: saveTotalStepsUseCase,
savePreviousAnimationProgressUseCase: savePreviousAnimationProgressUseCase,
savePetLevelUseCase: savePetLevelUseCase,
getStepsUseCase: getStepsUseCase,
getAccumulatedDailyStepsUseCase: getAccumulatedDailyStepsUseCase,
getPreviousAnimationProgressUseCase: getPreviousAnimationProgressUseCase)
Expand Down
7 changes: 6 additions & 1 deletion petWalk/petWalkWatchKitExtension/Domain/BO/Pets.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import Foundation

protocol Pets {
protocol Pets: AutoMockable {
var name: String { get }
var images: [String] { get }
var stats: Stats { get }
Expand All @@ -16,6 +16,7 @@ protocol Pets {
mutating func levelUp()
func getStrength() -> Int
func getLife() -> Int
func getCurrentLevel() -> Int
func getExpToRaiseNextLevel() -> Int
}

Expand Down Expand Up @@ -52,6 +53,10 @@ struct Swordman: Pets, Equatable {
return stats.life
}

func getCurrentLevel() -> Int {
return level.currentLevel
}

func getExpToRaiseNextLevel() -> Int {
return level.expToLevelUp
}
Expand Down

0 comments on commit cbd45b2

Please sign in to comment.