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
241 lines • 11.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const Deck_1 = require("./Deck");
const Card_1 = require("./Card");
describe('Deck', () => {
describe('Constructor and Properties', () => {
it('should create a deck with cards', () => {
const cards = [new Card_1.Card(5), new Card_1.Card(10), new Card_1.Card(15)];
const deck = new Deck_1.Deck(cards, 'deck-123');
expect(deck.cards).toHaveLength(3);
expect(deck.size).toBe(3);
expect(deck.isEmpty).toBe(false);
expect(deck.id).toBe('deck-123');
});
it('should create an empty deck', () => {
const deck = new Deck_1.Deck([]);
expect(deck.cards).toHaveLength(0);
expect(deck.size).toBe(0);
expect(deck.isEmpty).toBe(true);
expect(deck.id).toBeUndefined();
});
it('should clone cards to avoid external mutation', () => {
const originalCards = [new Card_1.Card(5), new Card_1.Card(10)];
const deck = new Deck_1.Deck(originalCards);
originalCards.push(new Card_1.Card(15));
expect(deck.size).toBe(2);
expect(deck.cards).toHaveLength(2);
});
});
describe('Shuffle', () => {
it('should shuffle cards', () => {
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)];
const deck = new Deck_1.Deck(cards);
const originalOrder = deck.cards.map(card => card.value);
deck.shuffle();
const shuffledOrder = deck.cards.map(card => card.value);
const hasChanged = originalOrder.some((value, index) => value !== shuffledOrder[index]);
expect(hasChanged).toBe(true);
});
it('should maintain deck size after shuffle', () => {
const cards = [new Card_1.Card(1), new Card_1.Card(2), new Card_1.Card(3)];
const deck = new Deck_1.Deck(cards);
const originalSize = deck.size;
deck.shuffle();
expect(deck.size).toBe(originalSize);
});
});
describe('Draw Cards', () => {
it('should draw a single card', () => {
const cards = [new Card_1.Card(5), new Card_1.Card(10), new Card_1.Card(15)];
const deck = new Deck_1.Deck(cards);
const originalSize = deck.size;
const drawnCard = deck.drawCard();
expect(drawnCard).toBeDefined();
expect(drawnCard?.value).toBe(15);
expect(deck.size).toBe(originalSize - 1);
});
it('should draw multiple cards', () => {
const cards = [new Card_1.Card(5), new Card_1.Card(10), new Card_1.Card(15), new Card_1.Card(20)];
const deck = new Deck_1.Deck(cards);
const drawnCards = deck.drawCards(3);
expect(drawnCards).toHaveLength(3);
expect(drawnCards[0]?.value).toBe(20);
expect(drawnCards[1]?.value).toBe(15);
expect(drawnCards[2]?.value).toBe(10);
expect(deck.size).toBe(1);
});
it('should return undefined when drawing from empty deck', () => {
const deck = new Deck_1.Deck([]);
const drawnCard = deck.drawCard();
expect(drawnCard).toBeUndefined();
});
it('should draw fewer cards than requested if deck is smaller', () => {
const cards = [new Card_1.Card(5), new Card_1.Card(10)];
const deck = new Deck_1.Deck(cards);
const drawnCards = deck.drawCards(5);
expect(drawnCards).toHaveLength(2);
expect(deck.isEmpty).toBe(true);
});
});
describe('Add Cards', () => {
it('should add a single card', () => {
const deck = new Deck_1.Deck([]);
const card = new Card_1.Card(25);
deck.addCard(card);
expect(deck.size).toBe(1);
expect(deck.cards[0]?.value).toBe(25);
});
it('should add multiple cards', () => {
const deck = new Deck_1.Deck([]);
const cards = [new Card_1.Card(25), new Card_1.Card(30), new Card_1.Card(35)];
deck.addCards(cards);
expect(deck.size).toBe(3);
expect(deck.cards.map(c => c.value)).toEqual([25, 30, 35]);
});
});
describe('Contains', () => {
it('should return true when deck contains card', () => {
const cards = [new Card_1.Card(5), new Card_1.Card(10), new Card_1.Card(15)];
const deck = new Deck_1.Deck(cards);
const searchCard = new Card_1.Card(10);
const contains = deck.contains(searchCard);
expect(contains).toBe(true);
});
it('should return false when deck does not contain card', () => {
const cards = [new Card_1.Card(5), new Card_1.Card(10), new Card_1.Card(15)];
const deck = new Deck_1.Deck(cards);
const searchCard = new Card_1.Card(20);
const contains = deck.contains(searchCard);
expect(contains).toBe(false);
});
});
describe('Peek Cards', () => {
it('should peek at top card without removing it', () => {
const cards = [new Card_1.Card(5), new Card_1.Card(10), new Card_1.Card(15)];
const deck = new Deck_1.Deck(cards);
const originalSize = deck.size;
const peekedCards = deck.peekCards(1);
expect(peekedCards).toHaveLength(1);
expect(peekedCards[0]?.value).toBe(15);
expect(deck.size).toBe(originalSize);
});
it('should peek at multiple cards', () => {
const cards = [new Card_1.Card(5), new Card_1.Card(10), new Card_1.Card(15), new Card_1.Card(20)];
const deck = new Deck_1.Deck(cards);
const peekedCards = deck.peekCards(3);
expect(peekedCards).toHaveLength(3);
expect(peekedCards[0]?.value).toBe(10);
expect(peekedCards[1]?.value).toBe(15);
expect(peekedCards[2]?.value).toBe(20);
});
it('should return all cards when peeking more than deck size', () => {
const cards = [new Card_1.Card(5), new Card_1.Card(10)];
const deck = new Deck_1.Deck(cards);
const peekedCards = deck.peekCards(5);
expect(peekedCards).toHaveLength(2);
});
});
describe('Equals', () => {
it('should return true for identical decks', () => {
const cards1 = [new Card_1.Card(5), new Card_1.Card(10)];
const cards2 = [new Card_1.Card(5), new Card_1.Card(10)];
const deck1 = new Deck_1.Deck(cards1);
const deck2 = new Deck_1.Deck(cards2);
expect(deck1.equals(deck2)).toBe(true);
});
it('should return false for different decks', () => {
const cards1 = [new Card_1.Card(5), new Card_1.Card(10)];
const cards2 = [new Card_1.Card(5), new Card_1.Card(15)];
const deck1 = new Deck_1.Deck(cards1);
const deck2 = new Deck_1.Deck(cards2);
expect(deck1.equals(deck2)).toBe(false);
});
it('should return false for decks with different sizes', () => {
const cards1 = [new Card_1.Card(5), new Card_1.Card(10)];
const cards2 = [new Card_1.Card(5)];
const deck1 = new Deck_1.Deck(cards1);
const deck2 = new Deck_1.Deck(cards2);
expect(deck1.equals(deck2)).toBe(false);
});
});
describe('ToString', () => {
it('should return correct string representation', () => {
const cards = [new Card_1.Card(5), new Card_1.Card(10), new Card_1.Card(15)];
const deck = new Deck_1.Deck(cards);
const result = deck.toString();
expect(result).toBe('Deck(3 cards)');
});
});
describe('JSON Serialization', () => {
it('should serialize to JSON correctly', () => {
const cards = [new Card_1.Card(5, 'card-1'), new Card_1.Card(10, 'card-2')];
const deck = new Deck_1.Deck(cards, 'deck-123');
const json = deck.toJSON();
expect(json).toEqual({
cards: [
{ value: 5, id: 'card-1' },
{ value: 10, id: 'card-2' }
],
id: 'deck-123'
});
});
it('should deserialize from JSON correctly', () => {
const json = {
cards: [
{ value: 5, id: 'card-1' },
{ value: 10, id: 'card-2' }
],
id: 'deck-123'
};
const deck = Deck_1.Deck.fromJSON(json);
expect(deck.size).toBe(2);
expect(deck.id).toBe('deck-123');
expect(deck.cards[0]?.value).toBe(5);
expect(deck.cards[1]?.value).toBe(10);
});
it('should handle deck without ID', () => {
const json = {
cards: [{ value: 5 }]
};
const deck = Deck_1.Deck.fromJSON(json);
expect(deck.id).toBeUndefined();
});
});
describe('Static Methods', () => {
describe('createInitialDeck', () => {
it('should create deck with cards 2-99', () => {
const deck = Deck_1.Deck.createInitialDeck();
expect(deck.size).toBe(98);
expect(deck.cards[0]?.value).toBeGreaterThanOrEqual(2);
expect(deck.cards[deck.size - 1]?.value).toBeLessThanOrEqual(99);
});
it('should not contain cards 1 or 100', () => {
const deck = Deck_1.Deck.createInitialDeck();
const hasCard1 = deck.cards.some(card => card.value === 1);
const hasCard100 = deck.cards.some(card => card.value === 100);
expect(hasCard1).toBe(false);
expect(hasCard100).toBe(false);
});
it('should be shuffled', () => {
const deck1 = Deck_1.Deck.createInitialDeck();
const deck2 = Deck_1.Deck.createInitialDeck();
const order1 = deck1.cards.map(card => card.value);
const order2 = deck2.cards.map(card => card.value);
const isDifferent = order1.some((value, index) => value !== order2[index]);
expect(isDifferent).toBe(true);
});
});
describe('createWithCards', () => {
it('should create deck with specific cards', () => {
const cards = [new Card_1.Card(5), new Card_1.Card(10)];
const deck = Deck_1.Deck.createWithCards(cards, 'test-deck');
expect(deck.size).toBe(2);
expect(deck.id).toBe('test-deck');
expect(deck.cards[0]?.value).toBe(5);
expect(deck.cards[1]?.value).toBe(10);
});
});
});
});
//# sourceMappingURL=Deck.test.js.map