import { TestCase } from "./framework/test_case.js"; import { CompletionWatcher, buildingLevelGained, cargoUnloaded, } from "../client/js/game_screen/completions.js"; const city = (id, civ, buildings = {}) => ({ id, civ, buildings }); const unit = (id, civ, cargo = []) => ({ id, civ, cargo }); const snapshot = ({ cities = [], units = [] } = {}) => ({ cities, units }); export class CompletionsTest extends TestCase { test_first_snapshot_only_primes_the_baseline() { const watcher = new CompletionWatcher(); const done = watcher.update( snapshot({ cities: [city(1, 0, { 0: 2 })], units: [unit(7, 0)] }), 0 ); this.assertTrue(done.first); this.assertFalse(done.building); this.assertFalse(done.unit); } test_detects_a_building_gaining_a_level() { const watcher = new CompletionWatcher(); watcher.update(snapshot({ cities: [city(1, 0, { 0: 1 })] }), 0); const done = watcher.update(snapshot({ cities: [city(1, 0, { 0: 2 })] }), 0); this.assertTrue(done.building); this.assertFalse(done.unit); } test_detects_a_freshly_trained_unit() { const watcher = new CompletionWatcher(); watcher.update(snapshot({ units: [unit(7, 0)] }), 0); const done = watcher.update(snapshot({ units: [unit(7, 0), unit(8, 0)] }), 0); this.assertTrue(done.unit); this.assertFalse(done.building); } test_a_second_snapshot_with_no_change_is_silent() { const watcher = new CompletionWatcher(); const state = snapshot({ cities: [city(1, 0, { 0: 1 })], units: [unit(7, 0)] }); watcher.update(state, 0); const done = watcher.update( snapshot({ cities: [city(1, 0, { 0: 1 })], units: [unit(7, 0)] }), 0 ); this.assertFalse(done.building); this.assertFalse(done.unit); } test_a_captured_city_does_not_count_as_a_completion() { const watcher = new CompletionWatcher(); watcher.update(snapshot({ cities: [city(1, 0, {})] }), 0); const done = watcher.update( snapshot({ cities: [city(1, 0, {}), city(2, 0, { 0: 3 })] }), 0 ); this.assertFalse(done.building); } test_only_the_local_player_is_watched() { const watcher = new CompletionWatcher(); watcher.update(snapshot({ cities: [city(1, 1, {}), city(2, 0, {})] }), 0); const done = watcher.update( snapshot({ cities: [city(1, 1, { 0: 4 }), city(2, 0, {})] }), 0 ); this.assertFalse(done.building); } test_landing_troops_is_not_a_trained_unit() { const watcher = new CompletionWatcher(); watcher.update(snapshot({ units: [unit(5, 0, [{}]), unit(6, 1)] }), 0); // The transport empties and a fresh infantry id appears on the shore. const done = watcher.update(snapshot({ units: [unit(5, 0, []), unit(9, 0)] }), 0); this.assertFalse(done.unit, "disembarking does not chime"); } test_reset_primes_the_baseline_again() { const watcher = new CompletionWatcher(); watcher.update(snapshot({ cities: [city(1, 0, {})] }), 0); watcher.update(snapshot({ cities: [city(1, 0, { 0: 1 })] }), 0); watcher.reset(); const done = watcher.update(snapshot({ cities: [city(1, 0, { 0: 1 })] }), 0); this.assertTrue(done.first); } test_helpers_compare_levels_and_cargo() { this.assertTrue(buildingLevelGained(new Map([[1, { 0: 1 }]]), new Map([[1, { 0: 2 }]]))); this.assertFalse( buildingLevelGained(new Map([[1, { 0: 1 }]]), new Map([[1, { 0: 1 }], [2, { 0: 5 }]])) ); this.assertTrue(cargoUnloaded(new Map([[5, 2]]), new Map([[5, 0]]))); this.assertFalse(cargoUnloaded(new Map([[5, 2]]), new Map([[5, 2]]))); } }