From 0aa2d9c50ca83e4a1484be95f1e799ff3e4d2a9d Mon Sep 17 00:00:00 2001 From: AleksandraCyp <73715885+AleksandraCyp@users.noreply.github.com> Date: Sat, 6 Feb 2021 14:36:24 +0100 Subject: [PATCH 1/3] Add GameHandler class --- src/gameHandlerClass.ts | 42 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/gameHandlerClass.ts diff --git a/src/gameHandlerClass.ts b/src/gameHandlerClass.ts new file mode 100644 index 0000000..9ccb22b --- /dev/null +++ b/src/gameHandlerClass.ts @@ -0,0 +1,42 @@ +import { Player } from "./playerClass"; +import { Pokemon } from "./pokemonClass"; + +export class GameHandler { + constructor(private _playerOne: Player, private _playerTwo: Player) {} + + _currentPlayer: Player = this._playerOne; + + getCurrentPlayer(): Player { + return this._currentPlayer; + } + + getOpponentPlayer(): Player { + if (this._currentPlayer === this._playerOne) return this._playerTwo; + return this._playerOne; + } + + isGameFinished(): boolean { + const firstPlayerPokemons: Pokemon[] = this._playerOne.pokemons; + const secondPlayerPokemons: Pokemon[] = this._playerTwo.pokemons; + const allPokemons = firstPlayerPokemons.concat(secondPlayerPokemons); + const allHPs = allPokemons.map((pokemon) => pokemon._currentHP); + if (!allHPs.includes(0)) { + return false; + } else { + return true; + } + } + + getWinner(): Player | Error { + if (!this.isGameFinished()) + return new Error("You cannot get the winner. The game is not over."); + const getallHPs = (player: Player): number[] => + player.pokemons.map((pokemon) => pokemon._currentHP); + const firstPlayerPokemonsHP: number[] = getallHPs(this._playerOne); + if (firstPlayerPokemonsHP.includes(0)) { + return this._playerOne; + } else { + return this._playerTwo; + } + } +} From e6fec66ab97208f6a1007e8f911b99d85b772fb8 Mon Sep 17 00:00:00 2001 From: AleksandraCyp <73715885+AleksandraCyp@users.noreply.github.com> Date: Sun, 7 Feb 2021 18:47:32 +0100 Subject: [PATCH 2/3] Fix GameHandler class and add tests --- src/__tests__/gameHandlerClass.spec.ts | 129 +++++++++++++++++++++++++ src/gameHandlerClass.ts | 36 +++---- src/pokemonClass.ts | 4 + 3 files changed, 149 insertions(+), 20 deletions(-) create mode 100644 src/__tests__/gameHandlerClass.spec.ts diff --git a/src/__tests__/gameHandlerClass.spec.ts b/src/__tests__/gameHandlerClass.spec.ts new file mode 100644 index 0000000..c88efb3 --- /dev/null +++ b/src/__tests__/gameHandlerClass.spec.ts @@ -0,0 +1,129 @@ +import { GameHandler } from "../gameHandlerClass"; +import { Player } from "../playerClass"; +import { PokemonFactory } from "../pokemonFactory"; +import { PokemonType } from "../pokemonClass"; +import * as data from "../../assets/poke_data.json"; + +describe("Test Game Handler class", () => { + const pokeData = data.pokemons; + + it("GameHandler.isGameFinished should return false if every player has at least one pokemon", () => { + // Given + const factory_0 = new PokemonFactory(pokeData); + const playerOne_0 = new Player("Wojtek", [ + factory_0.getPokemonByName("bulbasaur"), + factory_0.getPokemonByName("charmander"), + factory_0.getPokemonByName("pikachu"), + ]); + const playerTwo_0 = new Player("Ania", [ + factory_0.getPokemonByName("squirtle"), + factory_0.getPokemonByName("weedle"), + factory_0.getPokemonByName("pidgey"), + ]); + + // When + const isGameFinished_0 = new GameHandler( + playerOne_0, + playerTwo_0 + ).isGameFinished(); + + // Then + expect(isGameFinished_0).toBe(false); + }); + + it("GameHandler.isGameFinished should return true if all pokemons of one player are dead", () => { + // Given + const factory_1 = new PokemonFactory(pokeData); + const playerOne_1 = new Player("Wojtek", [ + factory_1.getPokemonByName("bulbasaur"), + factory_1.getPokemonByName("charmander"), + factory_1.getPokemonByName("pikachu"), + ]); + playerOne_1.pokemons.forEach((pokemon) => + pokemon.subtractHP(pokemon.maxHP) + ); + const playerTwo_1 = new Player("Ania", [ + factory_1.getPokemonByName("squirtle"), + factory_1.getPokemonByName("weedle"), + factory_1.getPokemonByName("pidgey"), + ]); + + // When + const isGameFinished_1 = new GameHandler( + playerOne_1, + playerTwo_1 + ).isGameFinished(); + + // Then + expect(isGameFinished_1).toBe(true); + }); + it("GameHandler.isGameFinished should return false if only some pokemons of a player are dead", () => { + // Given + const factory_2 = new PokemonFactory(pokeData); + const playerOne_2 = new Player("Wojtek", [ + factory_2.getPokemonByName("bulbasaur"), + factory_2.getPokemonByName("charmander"), + factory_2.getPokemonByName("pikachu"), + ]); + const playerTwo_2 = new Player("Ania", [ + factory_2.getPokemonByName("squirtle"), + factory_2.getPokemonByName("weedle"), + factory_2.getPokemonByName("pidgey"), + ]); + + // When + const isGameFinished_2 = new GameHandler( + playerOne_2, + playerTwo_2 + ).isGameFinished(); + + // Then + expect(isGameFinished_2).toBe(false); + }); + it("GameHandler.getWinner should return an error if the game is not finished", () => { + // Given + const factory_3 = new PokemonFactory(pokeData); + const playerOne_3 = new Player("Wojtek", [ + factory_3.getPokemonByName("bulbasaur"), + factory_3.getPokemonByName("charmander"), + factory_3.getPokemonByName("pikachu"), + ]); + const playerTwo_3 = new Player("Ania", [ + factory_3.getPokemonByName("squirtle"), + factory_3.getPokemonByName("weedle"), + factory_3.getPokemonByName("pidgey"), + ]); + + // When + const winner_3 = () => + new GameHandler(playerOne_3, playerTwo_3).getWinner(); + + // Then + expect(winner_3).toThrowError( + "You cannot get the winner. The game is not over." + ); + }); + it("GameHandler.getWinner should return the winner if the game is finished", () => { + // Given + const factory_4 = new PokemonFactory(pokeData); + const playerOne_4 = new Player("Wojtek", [ + factory_4.getPokemonByName("bulbasaur"), + factory_4.getPokemonByName("charmander"), + factory_4.getPokemonByName("pikachu"), + ]); + const playerTwo_4 = new Player("Ania", [ + factory_4.getPokemonByName("squirtle"), + factory_4.getPokemonByName("weedle"), + factory_4.getPokemonByName("pidgey"), + ]); + playerTwo_4.pokemons.forEach((pokemon) => + pokemon.subtractHP(pokemon.maxHP) + ); + + // When + const winner_3 = new GameHandler(playerOne_4, playerTwo_4).getWinner(); + + // Then + expect(winner_3).toBe(playerOne_4); + }); +}); diff --git a/src/gameHandlerClass.ts b/src/gameHandlerClass.ts index 9ccb22b..90da8ea 100644 --- a/src/gameHandlerClass.ts +++ b/src/gameHandlerClass.ts @@ -1,8 +1,10 @@ import { Player } from "./playerClass"; -import { Pokemon } from "./pokemonClass"; export class GameHandler { - constructor(private _playerOne: Player, private _playerTwo: Player) {} + constructor( + private readonly _playerOne: Player, + private readonly _playerTwo: Player + ) {} _currentPlayer: Player = this._playerOne; @@ -15,28 +17,22 @@ export class GameHandler { return this._playerOne; } + private didPlayerLoose(player: Player): boolean { + return player.alivePokemons.length < 1; + } + isGameFinished(): boolean { - const firstPlayerPokemons: Pokemon[] = this._playerOne.pokemons; - const secondPlayerPokemons: Pokemon[] = this._playerTwo.pokemons; - const allPokemons = firstPlayerPokemons.concat(secondPlayerPokemons); - const allHPs = allPokemons.map((pokemon) => pokemon._currentHP); - if (!allHPs.includes(0)) { - return false; - } else { - return true; - } + return ( + this.didPlayerLoose(this._playerOne) || + this.didPlayerLoose(this._playerTwo) + ); } getWinner(): Player | Error { if (!this.isGameFinished()) - return new Error("You cannot get the winner. The game is not over."); - const getallHPs = (player: Player): number[] => - player.pokemons.map((pokemon) => pokemon._currentHP); - const firstPlayerPokemonsHP: number[] = getallHPs(this._playerOne); - if (firstPlayerPokemonsHP.includes(0)) { - return this._playerOne; - } else { - return this._playerTwo; - } + throw new Error("You cannot get the winner. The game is not over."); + return this.didPlayerLoose(this._playerOne) === true + ? this._playerTwo + : this._playerOne; } } diff --git a/src/pokemonClass.ts b/src/pokemonClass.ts index a3ed3dc..85da8cb 100644 --- a/src/pokemonClass.ts +++ b/src/pokemonClass.ts @@ -50,6 +50,10 @@ export class Pokemon { return this._currentHP; } + get maxHP() { + return this._maxHP; + } + subtractHP(pointsToSubtract: number): void { const newHP = this._currentHP - pointsToSubtract; if (newHP < 0) { From 45ba47ad19551fed63843463ff1ac6dc97c9d6d2 Mon Sep 17 00:00:00 2001 From: AleksandraCyp <73715885+AleksandraCyp@users.noreply.github.com> Date: Sun, 7 Feb 2021 23:05:42 +0100 Subject: [PATCH 3/3] Fix tests --- src/__tests__/gameHandlerClass.spec.ts | 135 ++++++++++--------------- src/gameHandlerClass.ts | 2 +- 2 files changed, 55 insertions(+), 82 deletions(-) diff --git a/src/__tests__/gameHandlerClass.spec.ts b/src/__tests__/gameHandlerClass.spec.ts index c88efb3..05ab052 100644 --- a/src/__tests__/gameHandlerClass.spec.ts +++ b/src/__tests__/gameHandlerClass.spec.ts @@ -5,125 +5,98 @@ import { PokemonType } from "../pokemonClass"; import * as data from "../../assets/poke_data.json"; describe("Test Game Handler class", () => { + const pokeData = data.pokemons; + const getPlayerOne = (factory: PokemonFactory) => { + return new Player("Wojtek", [ + factory.getPokemonByName("bulbasaur"), + factory.getPokemonByName("charmander"), + factory.getPokemonByName("pikachu"), + ]); + } + + const getPlayerTwo = (factory: PokemonFactory) => { + return new Player("Wojtek", [ + factory.getPokemonByName("bulbasaur"), + factory.getPokemonByName("charmander"), + factory.getPokemonByName("pikachu"), + ]); + } it("GameHandler.isGameFinished should return false if every player has at least one pokemon", () => { // Given - const factory_0 = new PokemonFactory(pokeData); - const playerOne_0 = new Player("Wojtek", [ - factory_0.getPokemonByName("bulbasaur"), - factory_0.getPokemonByName("charmander"), - factory_0.getPokemonByName("pikachu"), - ]); - const playerTwo_0 = new Player("Ania", [ - factory_0.getPokemonByName("squirtle"), - factory_0.getPokemonByName("weedle"), - factory_0.getPokemonByName("pidgey"), - ]); + const factory = new PokemonFactory(pokeData); + const playerOne = getPlayerOne(factory); + const playerTwo = getPlayerTwo(factory); + const gameHandler = new GameHandler(playerOne, playerTwo); // When - const isGameFinished_0 = new GameHandler( - playerOne_0, - playerTwo_0 - ).isGameFinished(); + const isGameFinished = gameHandler.isGameFinished(); // Then - expect(isGameFinished_0).toBe(false); + expect(isGameFinished).toBe(false); }); it("GameHandler.isGameFinished should return true if all pokemons of one player are dead", () => { // Given - const factory_1 = new PokemonFactory(pokeData); - const playerOne_1 = new Player("Wojtek", [ - factory_1.getPokemonByName("bulbasaur"), - factory_1.getPokemonByName("charmander"), - factory_1.getPokemonByName("pikachu"), - ]); - playerOne_1.pokemons.forEach((pokemon) => - pokemon.subtractHP(pokemon.maxHP) - ); - const playerTwo_1 = new Player("Ania", [ - factory_1.getPokemonByName("squirtle"), - factory_1.getPokemonByName("weedle"), - factory_1.getPokemonByName("pidgey"), - ]); + const factory = new PokemonFactory(pokeData); + const playerOne = getPlayerOne(factory); + const playerTwo = getPlayerTwo(factory) + const gameHandler = new GameHandler(playerOne, playerTwo); // When - const isGameFinished_1 = new GameHandler( - playerOne_1, - playerTwo_1 - ).isGameFinished(); + playerOne.pokemons.forEach((pokemon) => + pokemon.subtractHP(pokemon.maxHP)); + const isGameFinished = gameHandler.isGameFinished(); // Then - expect(isGameFinished_1).toBe(true); + expect(isGameFinished).toBe(true); }); it("GameHandler.isGameFinished should return false if only some pokemons of a player are dead", () => { // Given - const factory_2 = new PokemonFactory(pokeData); - const playerOne_2 = new Player("Wojtek", [ - factory_2.getPokemonByName("bulbasaur"), - factory_2.getPokemonByName("charmander"), - factory_2.getPokemonByName("pikachu"), - ]); - const playerTwo_2 = new Player("Ania", [ - factory_2.getPokemonByName("squirtle"), - factory_2.getPokemonByName("weedle"), - factory_2.getPokemonByName("pidgey"), - ]); + const factory = new PokemonFactory(pokeData); + const playerOne = getPlayerOne(factory); + const playerTwo = getPlayerTwo(factory) + const gameHandler = new GameHandler(playerOne, playerTwo); // When - const isGameFinished_2 = new GameHandler( - playerOne_2, - playerTwo_2 - ).isGameFinished(); + playerTwo.pokemons[1].subtractHP(playerTwo.pokemons[1].maxHP) + const isGameFinished = gameHandler.isGameFinished(); // Then - expect(isGameFinished_2).toBe(false); + expect(isGameFinished).toBe(false); }); it("GameHandler.getWinner should return an error if the game is not finished", () => { // Given - const factory_3 = new PokemonFactory(pokeData); - const playerOne_3 = new Player("Wojtek", [ - factory_3.getPokemonByName("bulbasaur"), - factory_3.getPokemonByName("charmander"), - factory_3.getPokemonByName("pikachu"), - ]); - const playerTwo_3 = new Player("Ania", [ - factory_3.getPokemonByName("squirtle"), - factory_3.getPokemonByName("weedle"), - factory_3.getPokemonByName("pidgey"), - ]); + const factory = new PokemonFactory(pokeData); + const playerOne = getPlayerOne(factory); + const playerTwo = getPlayerTwo(factory) + const gameHandler = new GameHandler(playerOne, playerTwo); // When - const winner_3 = () => - new GameHandler(playerOne_3, playerTwo_3).getWinner(); + const winner = () => + gameHandler.getWinner(); // Then - expect(winner_3).toThrowError( + expect(winner).toThrowError( "You cannot get the winner. The game is not over." ); }); it("GameHandler.getWinner should return the winner if the game is finished", () => { // Given - const factory_4 = new PokemonFactory(pokeData); - const playerOne_4 = new Player("Wojtek", [ - factory_4.getPokemonByName("bulbasaur"), - factory_4.getPokemonByName("charmander"), - factory_4.getPokemonByName("pikachu"), - ]); - const playerTwo_4 = new Player("Ania", [ - factory_4.getPokemonByName("squirtle"), - factory_4.getPokemonByName("weedle"), - factory_4.getPokemonByName("pidgey"), - ]); - playerTwo_4.pokemons.forEach((pokemon) => - pokemon.subtractHP(pokemon.maxHP) - ); + const factory = new PokemonFactory(pokeData); + const playerOne = getPlayerOne(factory); + const playerTwo = getPlayerTwo(factory) + const gameHandler = new GameHandler(playerOne, playerTwo); + // When - const winner_3 = new GameHandler(playerOne_4, playerTwo_4).getWinner(); + playerTwo.pokemons.forEach((pokemon) => + pokemon.subtractHP(pokemon.maxHP)); + const winner = gameHandler.getWinner(); // Then - expect(winner_3).toBe(playerOne_4); + expect(winner).toStrictEqual(playerOne); }); }); + diff --git a/src/gameHandlerClass.ts b/src/gameHandlerClass.ts index 90da8ea..28bacda 100644 --- a/src/gameHandlerClass.ts +++ b/src/gameHandlerClass.ts @@ -18,7 +18,7 @@ export class GameHandler { } private didPlayerLoose(player: Player): boolean { - return player.alivePokemons.length < 1; + return player.alivePokemons.length === 0; } isGameFinished(): boolean {