From 0342f6742d463bdd9c8f6d4103952ae595d57523 Mon Sep 17 00:00:00 2001 From: Adrian Wannenmacher Date: Tue, 10 Mar 2026 19:19:05 +0100 Subject: [PATCH] move game rule cloning to game constructor The rules not changing after a game has started is a invariant of the `Game` model, not the `Session` model. As such, it should enforce it itself, instead of relying on its users. --- models/game.js | 2 +- models/game.test.js | 12 ++++++++++++ models/session.js | 2 +- models/session.test.js | 11 ----------- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/models/game.js b/models/game.js index 14a4359..0e4ae28 100644 --- a/models/game.js +++ b/models/game.js @@ -59,7 +59,7 @@ export default class Game extends EventTarget { super(); if (value === undefined || value instanceof GameRules) { if (value instanceof GameRules) - this.#rules = value; + this.#rules = new GameRules(value); this.#currentRound = new Round( this.#rules.raisingLimit(0), this.#rules.raisingLimit(0)); diff --git a/models/game.test.js b/models/game.test.js index f85a4a3..b3ee4fd 100644 --- a/models/game.test.js +++ b/models/game.test.js @@ -53,6 +53,18 @@ export default function() { ); }); + QUnit.test("rules stay static after construction", function(assert) { + let rules = new GameRules(); + rules.goal = 15; + + let game = new Game(rules); + assert.strictEqual(game.rules.goal, 15, "correct goal"); + + rules.goal = 17; + assert.strictEqual(game.rules.goal, 15, "games rules didn't change"); + assert.notStrictEqual(game.rules.goal, rules.goal, "goals are different"); + }); + QUnit.test("single round played", function(assert) { let game = new Game(); game.currentRound.winner = Team.We; diff --git a/models/session.js b/models/session.js index f101a5a..1a250f5 100644 --- a/models/session.js +++ b/models/session.js @@ -130,7 +130,7 @@ export default class Session extends EventTarget { /** Add another round if there is no current one. */ anotherGame() { if (this.#currentGame === null) { - this.#currentGame = new Game(new GameRules(this.#rules)); + this.#currentGame = new Game(this.#rules); this.#currentGame.addEventListener( Game.EVENT_CHANGE, this.#boundHandleGameChange); this.#changed(); diff --git a/models/session.test.js b/models/session.test.js index b444e6f..b727450 100644 --- a/models/session.test.js +++ b/models/session.test.js @@ -60,17 +60,6 @@ export default function() { assert.notStrictEqual(session.currentGame, null, "game in progress"); }); - QUnit.test("session rule change doesn't affect games", function(assert) { - let session = new Session(); - session.anotherGame(); - session.rules.goal = 7; - assert.notStrictEqual( - session.currentGame.rules.goal, - session.rules.goal, - "game rules have been copied", - ); - }); - QUnit.test("single game finished", function(assert) { let session = new Session(); session.anotherGame();