UNPKG

the-game-domain

Version:

Complete domain layer for 'The Game' card game with rich business entities, automatic persistence, action tracking, and advanced game mechanics. Features Game, Player, Card, Deck, Pile entities with repository pattern, turn management, victory/defeat dete

198 lines 9.75 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const Player_1 = require("./Player"); const Card_1 = require("./Card"); const Deck_1 = require("./Deck"); describe('Player', () => { beforeEach(() => { Player_1.Player.resetCounter(); }); describe('Constructor and Properties', () => { it('should create player with default name', () => { const player = new Player_1.Player(); expect(player.id).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/); expect(player.name).toBe('Player 1'); expect(player.cards).toHaveLength(0); expect(player.isCurrentTurn).toBe(false); }); it('should create player with custom name', () => { const player = new Player_1.Player('John Doe'); expect(player.id).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/); expect(player.name).toBe('John Doe'); expect(player.cards).toHaveLength(0); expect(player.isCurrentTurn).toBe(false); }); it('should create multiple players with sequential default names', () => { const player1 = new Player_1.Player(); const player2 = new Player_1.Player(); const player3 = new Player_1.Player(); expect(player1.name).toBe('Player 1'); expect(player2.name).toBe('Player 2'); expect(player3.name).toBe('Player 3'); }); it('should trim whitespace from custom name', () => { const player = new Player_1.Player(' John Doe '); expect(player.name).toBe('John Doe'); }); }); describe('Card Management', () => { it('should add card to player hand', () => { const player = new Player_1.Player(); const card = new Card_1.Card(5); player.addCard(card); expect(player.cards).toHaveLength(1); expect(player.cards[0]?.value).toBe(5); }); it('should add multiple cards to player hand', () => { const player = new Player_1.Player(); const cards = [new Card_1.Card(5), new Card_1.Card(10), new Card_1.Card(15)]; player.addCards(cards); expect(player.cards).toHaveLength(3); expect(player.cards[0]?.value).toBe(5); expect(player.cards[1]?.value).toBe(10); expect(player.cards[2]?.value).toBe(15); }); it('should prevent adding card when hand is full', () => { const player = new Player_1.Player(); const cards = [new Card_1.Card(1), new Card_1.Card(2), new Card_1.Card(3), new Card_1.Card(4), new Card_1.Card(5), new Card_1.Card(6)]; player.addCards(cards); expect(() => player.addCard(new Card_1.Card(7))).toThrow('Cannot add card: player hand is full (maximum 6 cards)'); }); it('should prevent adding cards that would exceed limit', () => { const player = new Player_1.Player(); const existingCards = [new Card_1.Card(1), new Card_1.Card(2), new Card_1.Card(3)]; const newCards = [new Card_1.Card(4), new Card_1.Card(5), new Card_1.Card(6), new Card_1.Card(7)]; player.addCards(existingCards); expect(() => player.addCards(newCards)).toThrow('Cannot add cards: would exceed maximum limit of 6 cards'); }); it('should remove card from player hand', () => { const player = new Player_1.Player(); const card = new Card_1.Card(5); player.addCard(card); const removedCard = player.removeCard(5); expect(removedCard?.value).toBe(5); expect(player.cards).toHaveLength(0); }); it('should return undefined when removing non-existent card', () => { const player = new Player_1.Player(); const card = new Card_1.Card(5); player.addCard(card); const removedCard = player.removeCard(10); expect(removedCard).toBeUndefined(); expect(player.cards).toHaveLength(1); }); it('should check if player has specific card', () => { const player = new Player_1.Player(); const card = new Card_1.Card(5); player.addCard(card); expect(player.hasCard(5)).toBe(true); expect(player.hasCard(10)).toBe(false); }); }); describe('Deck Interaction', () => { it('should draw card from deck', () => { const player = new Player_1.Player(); const deck = new Deck_1.Deck([new Card_1.Card(5), new Card_1.Card(10), new Card_1.Card(15)]); const drawnCard = player.drawCardFromDeck(deck); expect(drawnCard?.value).toBe(15); expect(player.cards).toHaveLength(1); expect(deck.size).toBe(2); }); it('should return undefined when deck is empty', () => { const player = new Player_1.Player(); const deck = new Deck_1.Deck([]); const drawnCard = player.drawCardFromDeck(deck); expect(drawnCard).toBeUndefined(); expect(player.cards).toHaveLength(0); }); it('should not draw card when hand is full', () => { const player = new Player_1.Player(); const cards = [new Card_1.Card(1), new Card_1.Card(2), new Card_1.Card(3), new Card_1.Card(4), new Card_1.Card(5), new Card_1.Card(6)]; const deck = new Deck_1.Deck([new Card_1.Card(10)]); player.addCards(cards); expect(() => player.drawCardFromDeck(deck)).toThrow('Cannot draw card: player hand is full (maximum 6 cards)'); expect(player.cards).toHaveLength(6); expect(deck.size).toBe(1); }); }); describe('Turn Management', () => { it('should set current turn', () => { const player = new Player_1.Player(); player.setCurrentTurn(true); expect(player.isCurrentTurn).toBe(true); }); it('should end turn and return next player id', () => { const player1 = new Player_1.Player('Player 1'); const player2 = new Player_1.Player('Player 2'); const player3 = new Player_1.Player('Player 3'); player1.setCurrentTurn(true); const nextPlayerId = player1.endTurn([player1, player2, player3]); expect(nextPlayerId).toBe(player2.id); expect(player1.isCurrentTurn).toBe(false); expect(player2.isCurrentTurn).toBe(true); }); it('should cycle back to first player', () => { const player1 = new Player_1.Player('Player 1'); const player2 = new Player_1.Player('Player 2'); player2.setCurrentTurn(true); const nextPlayerId = player2.endTurn([player1, player2]); expect(nextPlayerId).toBe(player1.id); expect(player2.isCurrentTurn).toBe(false); expect(player1.isCurrentTurn).toBe(true); }); }); describe('Name Management', () => { it('should change player name', () => { const player = new Player_1.Player('Old Name'); player.changeName('New Name'); expect(player.name).toBe('New Name'); }); it('should prevent empty name', () => { const player = new Player_1.Player('Valid Name'); expect(() => player.changeName('')).toThrow('Player name cannot be empty'); expect(() => player.changeName(' ')).toThrow('Player name cannot be empty'); }); }); describe('Computed Properties', () => { it('should return correct card count', () => { const player = new Player_1.Player(); expect(player.cardCount).toBe(0); player.addCard(new Card_1.Card(5)); expect(player.cardCount).toBe(1); player.addCard(new Card_1.Card(10)); expect(player.cardCount).toBe(2); }); it('should return correct hand full status', () => { const player = new Player_1.Player(); expect(player.isHandFull).toBe(false); const cards = [new Card_1.Card(1), new Card_1.Card(2), new Card_1.Card(3), new Card_1.Card(4), new Card_1.Card(5), new Card_1.Card(6)]; player.addCards(cards); expect(player.isHandFull).toBe(true); }); }); describe('Comparison and Serialization', () => { it('should compare players correctly', () => { const player1 = new Player_1.Player('Player 1'); const player2 = new Player_1.Player('Player 2'); expect(player1.equals(player1)).toBe(true); expect(player1.equals(player2)).toBe(false); }); it('should return correct string representation', () => { const player = new Player_1.Player('John Doe'); const result = player.toString(); expect(result).toMatch(/^Player\([0-9a-f-]+, John Doe, 0 cards\)$/); }); it('should serialize and deserialize correctly', () => { const player = new Player_1.Player('John Doe'); const card = new Card_1.Card(5); player.addCard(card); const json = player.toJSON(); const reconstructed = Player_1.Player.fromJSON(json); expect(reconstructed.id).toBe(player.id); expect(reconstructed.name).toBe(player.name); expect(reconstructed.cards).toHaveLength(player.cards.length); expect(reconstructed.isCurrentTurn).toBe(player.isCurrentTurn); }); }); }); //# sourceMappingURL=Player.test.js.map