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

96 lines 4.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const Pile_1 = require("./Pile"); const Card_1 = require("./Card"); describe('Pile', () => { describe('Constructor and Properties', () => { it('should create ascending pile correctly', () => { const pile = new Pile_1.Pile(1, 'asc', new Card_1.Card(1)); expect(pile.direction).toBe('asc'); expect(pile.lastCard.value).toBe(1); }); it('should create descending pile correctly', () => { const pile = new Pile_1.Pile(2, 'desc', new Card_1.Card(100)); expect(pile.direction).toBe('desc'); expect(pile.lastCard.value).toBe(100); }); it('should validate pile number', () => { expect(() => new Pile_1.Pile(0, 'asc', new Card_1.Card(1))).toThrow('Pile number must be between 1 and 4'); expect(() => new Pile_1.Pile(5, 'asc', new Card_1.Card(1))).toThrow('Pile number must be between 1 and 4'); }); }); describe('Ascending Pile Rules', () => { it('should validate ascending pile rules', () => { const pile = new Pile_1.Pile(1, 'asc', new Card_1.Card(5)); expect(pile.canAcceptCard(new Card_1.Card(7))).toBe(true); expect(pile.canAcceptCard(new Card_1.Card(10))).toBe(true); expect(pile.canAcceptCard(new Card_1.Card(15))).toBe(true); expect(pile.canAcceptCard(new Card_1.Card(3))).toBe(false); expect(pile.canAcceptCard(new Card_1.Card(4))).toBe(false); }); }); describe('Descending Pile Rules', () => { it('should validate descending pile rules', () => { const pile = new Pile_1.Pile(2, 'desc', new Card_1.Card(95)); expect(pile.canAcceptCard(new Card_1.Card(93))).toBe(true); expect(pile.canAcceptCard(new Card_1.Card(90))).toBe(true); expect(pile.canAcceptCard(new Card_1.Card(85))).toBe(true); expect(pile.canAcceptCard(new Card_1.Card(97))).toBe(false); expect(pile.canAcceptCard(new Card_1.Card(98))).toBe(false); }); }); describe('Add Cards', () => { it('should add cards correctly', () => { const pile = new Pile_1.Pile(1, 'asc', new Card_1.Card(1)); const card = new Card_1.Card(5); pile.addCard(card); expect(pile.lastCard.value).toBe(5); }); it('should reject invalid cards', () => { const pile = new Pile_1.Pile(1, 'asc', new Card_1.Card(5)); const invalidCard = new Card_1.Card(3); expect(() => pile.addCard(invalidCard)).toThrow('Card 3 cannot be added to asc pile 1'); }); }); describe('Equals', () => { it('should compare piles correctly', () => { const pile1 = new Pile_1.Pile(1, 'asc', new Card_1.Card(5)); const pile2 = new Pile_1.Pile(1, 'asc', new Card_1.Card(5)); const pile3 = new Pile_1.Pile(2, 'asc', new Card_1.Card(5)); expect(pile1.equals(pile2)).toBe(true); expect(pile1.equals(pile3)).toBe(false); }); }); describe('ToString', () => { it('should return correct string representation', () => { const pile = new Pile_1.Pile(1, 'asc', new Card_1.Card(5)); expect(pile.toString()).toBe('Pile(1, asc, 5)'); }); }); describe('JSON Serialization', () => { it('should serialize and deserialize correctly', () => { const pile = new Pile_1.Pile(1, 'asc', new Card_1.Card(5), 'pile-123'); const json = pile.toJSON(); const reconstructed = Pile_1.Pile.fromJSON(json); expect(reconstructed.number).toBe(1); expect(reconstructed.direction).toBe('asc'); expect(reconstructed.lastCard.value).toBe(5); expect(reconstructed.id).toBe('pile-123'); }); }); describe('Static Methods', () => { it('should create initial piles correctly', () => { const piles = Pile_1.Pile.createInitialPiles(); expect(piles).toHaveLength(4); expect(piles[0]?.direction).toBe('asc'); expect(piles[0]?.lastCard.value).toBe(1); expect(piles[1]?.direction).toBe('asc'); expect(piles[1]?.lastCard.value).toBe(1); expect(piles[2]?.direction).toBe('desc'); expect(piles[2]?.lastCard.value).toBe(100); expect(piles[3]?.direction).toBe('desc'); expect(piles[3]?.lastCard.value).toBe(100); }); }); }); //# sourceMappingURL=Pile.test.js.map