From c7138038fa75a1e8c7ffe0f326547ec14f786469 Mon Sep 17 00:00:00 2001 From: Mikayla Dobson Date: Fri, 5 Aug 2022 18:55:07 -0500 Subject: [PATCH] to do: rendering problem after buy card, remove purchased card from gameboard --- src/components/Card/Card.tsx | 1 + .../Player/ActionMethods/buyCard.test.ts | 141 ----------------- .../Player/ActionMethods/buyCard.test.tsx | 75 +++++++++ .../Player/ActionMethods/buyCardActions.ts | 144 ++++++++++-------- src/util/initializeBoard.ts | 1 - 5 files changed, 157 insertions(+), 205 deletions(-) delete mode 100644 src/components/Player/ActionMethods/buyCard.test.ts create mode 100644 src/components/Player/ActionMethods/buyCard.test.tsx diff --git a/src/components/Card/Card.tsx b/src/components/Card/Card.tsx index 9f40bf1..e6a37c4 100644 --- a/src/components/Card/Card.tsx +++ b/src/components/Card/Card.tsx @@ -1,3 +1,4 @@ +import { useEffect } from 'react'; import { v4 } from 'uuid'; import { CardProps } from '../../util/propTypes'; import { ResourceCost } from '../../util/types'; diff --git a/src/components/Player/ActionMethods/buyCard.test.ts b/src/components/Player/ActionMethods/buyCard.test.ts deleted file mode 100644 index 1ae9381..0000000 --- a/src/components/Player/ActionMethods/buyCard.test.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { expensiveCard, midGameCardOne, midGameCardTwo, midGameState, mockPlayerOne, mockPlayerTwo, mockState, playerTwoMidGame } from '../../../util/testUtils'; -import { buyCard, tooExpensive } from './buyCardActions'; -import getTotalBuyingPower from '../../../util/getTotalBuyingPower'; -import { useCurrentPlayer } from '../../../util/useCurrentPlayer'; -import { AppState, PlayerData } from '../../../util/types'; -import { test, expect, describe } from 'vitest'; -import { renderHook } from "@testing-library/react"; -import { useState } from 'react'; -import { initialState } from '../../../util/stateSetters'; - -describe('buy cards', () => { - test('detects unaffordable cards', () => { - const result = tooExpensive(expensiveCard, mockState); - expect(result).toBeTruthy(); - }) - - test('calculates total buying power', () => { - let modifiedState = { - ...mockState, - players: [ - { - ...mockPlayerOne, - inventory: { - ruby: 3, - sapphire: 3, - emerald: 3, - onyx: 3, - diamond: 3, - gold: 3 - }, - cards: [expensiveCard] - }, - mockPlayerTwo - ] - } - - const totalBuyingPower = getTotalBuyingPower(modifiedState); - - const expectedValue = { - ruby: 3, - sapphire: 3, - emerald: 3, - onyx: 3, - diamond: 4, - gold: 3 - } - - expect(totalBuyingPower).toStrictEqual(expectedValue); - }) - - test('buyCard and updateResources', () => { - const { result } = renderHook(() => { - const [state, setState] = useState(midGameState); - - return { state, setState } - }) - - const { state, setState } = result.current; - - const currentPlayer = useCurrentPlayer(state); - if (!currentPlayer) return; - - /** - * actions in test: - * midGameState :: playerOneMidGame, playerTwoMidGame - * playerOneMidGame => buy midGameCardTwo - * playerTwoMidGame => buy midGameCardOne - */ - - let P1UPDATED = state.players.filter((p: PlayerData) => p.name === "Player One")[0]; - let P2UPDATED = state.players.filter((p: PlayerData) => p.name === "Player Two")[0]; - - // playerOne receives midGameCardTwo and pays three diamonds back to resource pool - P1UPDATED = { - ...P1UPDATED, - cards: [...P1UPDATED.cards, midGameCardTwo], - turnActive: false, - inventory: { - ...P1UPDATED.inventory, - diamond: 0 - } - } - - P2UPDATED = { ...P2UPDATED, turnActive: true } - - const moveOneExpectedState: AppState = { - ...state, - players: [P1UPDATED, P2UPDATED], - gameboard: { - ...state.gameboard, - tradingResources: { - ...state.gameboard.tradingResources, - diamond: 4 - } - } - } - - // first player action - // @ts-ignore - const newState = buyCard(state, setState, midGameCardTwo); - expect(newState).toStrictEqual(moveOneExpectedState); - - // playerTwo receives midGameCardOne and pays four rubies back to resource pool - P2UPDATED = { - ...P2UPDATED, - cards: [...P2UPDATED.cards, midGameCardOne], - turnActive: false, - inventory: { - ...P2UPDATED.inventory, - ruby: 0 - } - } - - P1UPDATED = { ...P1UPDATED, turnActive: true } - - const moveTwoExpectedState: AppState = { - ...moveOneExpectedState, - players: [P1UPDATED, P2UPDATED], - gameboard: { - ...moveOneExpectedState.gameboard, - tradingResources: { - ...moveOneExpectedState.gameboard.tradingResources, - ruby: 4 - } - } - } - - expect(() => { - if (!newState) throw Error(); - }).not.toThrowError(); - - if (newState) { - // @ts-ignore - const finalState = buyCard(newState, setState, midGameCardOne); - expect(finalState).toStrictEqual(moveTwoExpectedState); - } - }) -}) - -// describe('get chips', () => {}) -// describe('reserve card', () => {}) \ No newline at end of file diff --git a/src/components/Player/ActionMethods/buyCard.test.tsx b/src/components/Player/ActionMethods/buyCard.test.tsx new file mode 100644 index 0000000..ff8ef30 --- /dev/null +++ b/src/components/Player/ActionMethods/buyCard.test.tsx @@ -0,0 +1,75 @@ +import { expensiveCard, midGameCardOne, midGameCardTwo, midGameState, mockPlayerOne, mockPlayerTwo, mockState } from '../../../util/testUtils'; +import { buyCard, tooExpensive } from './buyCardActions'; +import getTotalBuyingPower from '../../../util/getTotalBuyingPower'; +import { useCurrentPlayer } from '../../../util/useCurrentPlayer'; +import { AppState, PlayerData } from '../../../util/types'; +import { test, expect, describe, vi, afterEach } from 'vitest'; +import { renderHook } from "@testing-library/react"; +import React, { useState } from 'react'; + +afterEach(() => { + vi.restoreAllMocks(); +}) + +describe('buy cards', () => { + test('detects unaffordable cards', () => { + const result = tooExpensive(expensiveCard, mockState); + expect(result).toBeTruthy(); + }) + + test('calculates total buying power', () => { + let modifiedState = { + ...mockState, + players: [ + { + ...mockPlayerOne, + inventory: { + ruby: 3, + sapphire: 3, + emerald: 3, + onyx: 3, + diamond: 3, + gold: 3 + }, + cards: [expensiveCard] + }, + mockPlayerTwo + ] + } + + const totalBuyingPower = getTotalBuyingPower(modifiedState); + + const expectedValue = { + ruby: 3, + sapphire: 3, + emerald: 3, + onyx: 3, + diamond: 4, + gold: 3 + } + + expect(totalBuyingPower).toStrictEqual(expectedValue); + }) + + test('use state', () => { + const { result } = renderHook(() => { + const [state, setState] = useState('me'); + setState('you'); + return state; + }) + + expect(result.current).toBe('you'); + }) + + test('buyCard and updateResources', () => { + /** + * actions in test: + * player triggers "buy card" action + * corresponding chips come out of player's hand + * + */ + }) +}) + +// describe('get chips', () => {}) +// describe('reserve card', () => {}) \ No newline at end of file diff --git a/src/components/Player/ActionMethods/buyCardActions.ts b/src/components/Player/ActionMethods/buyCardActions.ts index 260cdb8..42b4d77 100644 --- a/src/components/Player/ActionMethods/buyCardActions.ts +++ b/src/components/Player/ActionMethods/buyCardActions.ts @@ -4,31 +4,6 @@ import { AppState, CardData, ResourceCost, setStateType } from "../../../util/ty import { useCurrentPlayer } from "../../../util/useCurrentPlayer"; import getTotalBuyingPower from "../../../util/getTotalBuyingPower"; -// export const _getTotalBuyingPower = (state: AppState) => { -// const currentPlayer = useCurrentPlayer(state); - -// let totalBuyingPower = { -// ruby: 0, -// sapphire: 0, -// emerald: 0, -// diamond: 0, -// onyx: 0, -// gold: 0, -// } - -// if (!currentPlayer) return totalBuyingPower; - -// for (let [key,quantity] of Object.entries(currentPlayer.inventory)) { -// totalBuyingPower[key as keyof ResourceCost] += quantity; -// } - -// for (let each of currentPlayer.cards) { -// totalBuyingPower[each.gemValue as keyof ResourceCost] += 1; -// } - -// return totalBuyingPower; -// } - export const tooExpensive = (card: CardData, state: AppState): boolean => { const currentPlayer = useCurrentPlayer(state); if (!currentPlayer) return true; @@ -44,51 +19,94 @@ export const tooExpensive = (card: CardData, state: AppState): boolean => { return false; } -export const updateResources = (state: AppState, card: CardData) => { - console.log('updateResources called'); - let currentPlayer = useCurrentPlayer(state); - let newTradingResources = state.gameboard.tradingResources; - let updatedPlayer = currentPlayer; - const totalBuyingPower = getTotalBuyingPower(state); +export const buyCard = (state: AppState, setState: setStateType, card: CardData) => { + const currentPlayer = useCurrentPlayer(state); + if (!currentPlayer) return; - let difference = 0; - for (let [key, value] of Object.entries(card.resourceCost)) { - if (value < 1) continue; - if (value !== totalBuyingPower[key as keyof ResourceCost]) { - difference += Math.abs(totalBuyingPower[key as keyof ResourceCost] - value); + setState(() => { + const { newPlayers, roundIncrement } = turnOrderUtil(state, currentPlayer); + const idx = newPlayers.indexOf(currentPlayer); + const updatedPlayer = newPlayers[idx]; + + const cardCost = card.resourceCost; + const newPlayerInventory = updatedPlayer.inventory; + const newResourcePool = state.gameboard.tradingResources; + + for (let key of Object.keys(cardCost)) { + const typedKey = key as keyof ResourceCost; + + let adjustedCost = cardCost[typedKey]; + let adjustedInventoryValue = newPlayerInventory[typedKey]; + let adjustedResourcePoolValue = newResourcePool[typedKey]; + + if (!adjustedCost || !adjustedInventoryValue || !adjustedResourcePoolValue) continue; + + while (adjustedCost > 0) { + adjustedCost--; + adjustedInventoryValue--; + adjustedResourcePoolValue++; + } + + newPlayerInventory[typedKey] = adjustedInventoryValue; + newResourcePool[typedKey] = adjustedResourcePoolValue; } - } - return { newTradingResources, updatedPlayer } + updatedPlayer.inventory = newPlayerInventory; + newPlayers[idx] = updatedPlayer; + + state.gameboard.tradingResources = newResourcePool; + roundIncrement && (state.round = state.round + 1); + state.players = newPlayers; + + return state; + }) } -export const buyCard = (state: AppState, setState: setStateType, card: CardData) => { - let currentPlayer = useCurrentPlayer(state); - if (!currentPlayer) return; - const { newPlayers, roundIncrement } = turnOrderUtil(state, currentPlayer); +// export const updateResources = (state: AppState, card: CardData) => { +// console.log('updateResources called'); +// let currentPlayer = useCurrentPlayer(state); +// let newTradingResources = state.gameboard.tradingResources; +// let updatedPlayer = currentPlayer; +// const totalBuyingPower = getTotalBuyingPower(state); - console.log('cleared to setstate'); +// let difference = 0; +// for (let [key, value] of Object.entries(card.resourceCost)) { +// if (value < 1) continue; +// if (value !== totalBuyingPower[key as keyof ResourceCost]) { +// difference += Math.abs(totalBuyingPower[key as keyof ResourceCost] - value); +// } +// } + +// return { newTradingResources, updatedPlayer } +// } + +// export const buyCard = (state: AppState, setState: setStateType, card: CardData) => { +// let currentPlayer = useCurrentPlayer(state); +// if (!currentPlayer) return; +// const { newPlayers, roundIncrement } = turnOrderUtil(state, currentPlayer); + +// console.log('cleared to setstate'); - setState((prev: AppState) => { - if (!currentPlayer) return prev; +// setState((prev: AppState) => { +// if (!currentPlayer) return prev; - const { newTradingResources, updatedPlayer } = updateResources(state, card); - const idx = newPlayers.indexOf(currentPlayer); - updatedPlayer && (newPlayers[idx] = updatedPlayer); +// const { newTradingResources, updatedPlayer } = updateResources(state, card); +// const idx = newPlayers.indexOf(currentPlayer); +// updatedPlayer && (newPlayers[idx] = updatedPlayer); - return { - ...prev, - gameboard: { - ...prev.gameboard, - cardRows: prev.gameboard.cardRows, - tradingResources: newTradingResources - }, - round: (roundIncrement ? prev.round + 1 : prev.round), - players: newPlayers, - actions: initialActions - } - }) +// return { +// ...prev, +// gameboard: { +// ...prev.gameboard, +// cardRows: prev.gameboard.cardRows, +// tradingResources: newTradingResources +// }, +// round: (roundIncrement ? prev.round + 1 : prev.round), +// players: newPlayers, +// actions: initialActions +// } +// }) - // for testing? - return state; -} \ No newline at end of file +// // for testing? +// return state; +// } \ No newline at end of file diff --git a/src/util/initializeBoard.ts b/src/util/initializeBoard.ts index 21327f0..43323dd 100644 --- a/src/util/initializeBoard.ts +++ b/src/util/initializeBoard.ts @@ -33,7 +33,6 @@ const setNobles = (state: AppState, setState: setStateType) => { const setResources = (state: AppState) => { let newResources = state.gameboard.tradingResources; - console.log(state.players.length); switch (state.players.length) { case 2: for (let [key, value] of Object.entries(newResources)) {