Files
Dune/tests/kull-independent-profile.test.ts
T
Quintine bc0db31134
Verify and publish checkpoint container / container (push) Canceled after 0s
Connect Kull and Semuta with independent cards
2026-10-29 03:28:30 +11:00

61 lines
3.1 KiB
TypeScript

import assert from 'node:assert/strict';
import test from 'node:test';
import { applyAction, createGame, joinGame, newPlayer, viewGame } from '../game/engine';
import { kullDefaultProfile, type KullDefaultProfile } from '../game/kull-default-profile';
const lobby: KullDefaultProfile = {
status: 'lobby', advanced: false, expansions: ['choam', 'ix', 'ecaz'],
players: [{faction:'choam'}, {faction:'ecaz'}, {faction:'richese'}],
};
void test('independent Ecaz cards do not disable the Basic native Kull lobby profile', () => {
for (const selection of [
{},
{lobbyOptions:{ecazTreachery:true}},
{lobbyModules:{ecazTreachery:true}},
{lobbyOptions:{ecazTreachery:true},lobbyModules:{ecazTreachery:true}},
]) assert.deepEqual(kullDefaultProfile({...lobby,...selection}), {eligible:true,reason:null});
assert.deepEqual(kullDefaultProfile({...lobby,expansions:['choam','ix'],
players:[{faction:'choam'},{faction:'atreides'}],lobbyOptions:{ecazTreachery:true}}),
{eligible:true,reason:null}, 'the independent cards do not require the Ecaz faction or deck');
});
void test('the actual public lobby retains the Kull default when independent cards are selected', () => {
let game = createGame('KULLINDEPENDENTPROFILE',newPlayer('c','CHOAM','choam'),false,['choam','ix','ecaz']);
joinGame(game,newPlayer('e','Ecaz','ecaz'));
let view = viewGame(game,'c');
assert.equal(view.lobbyModules?.ecazTreachery,false);
assert.equal(view.lobbyModules?.kullDefault,true);
assert.equal(view.lobbyModules?.kullPreview,true);
game = applyAction(game,'c',{type:'moduleOption',module:'ecazTreachery',enabled:true});
view = viewGame(game,'c');
assert.equal(view.lobbyModules?.ecazTreachery,true);
assert.equal(view.lobbyModules?.kullDefault,true);
assert.equal(view.lobbyModules?.kullPreview,true);
game = applyAction(game,'c',{type:'moduleOption',module:'kullPreview',enabled:false});
assert.equal(viewGame(game,'c').lobbyModules?.kullDefault,true);
assert.equal(viewGame(game,'c').lobbyModules?.kullPreview,false);
game = applyAction(game,'c',{type:'moduleOption',module:'kullPreview',enabled:true});
assert.equal(viewGame(game,'c').lobbyModules?.kullPreview,true);
assert.equal(viewGame(game,'c').lobbyModules?.ecazTreachery,true);
});
void test('all other modules and an already-initialized card marker remain excluded', () => {
const selected = {...lobby,lobbyOptions:{ecazTreachery:true}};
for (const other of [
{lobbyOptions:{ecazTreachery:true,leaderSkills:true}},
{lobbyModules:{ecazTreachery:true,leaderSkills:true}},
{lobbyModules:{ecazTreachery:true,nexusCards:true}},
{lobbyModules:{ecazTreachery:true,discoveries:true}},
{leaderSkills:{}},{ecazTreachery:true},{nexusCards:{}},{discoveryEnabled:true},
{discoveries:{}},{discoveryStash:{}},{greatMaker:{}},{homeworlds:{}},
{techTokens:{}},{strongholdCards:{}},
]) {
const result = kullDefaultProfile({...selected,...other});
assert.equal(result.eligible,false);
assert.ok(result.reason);
}
assert.equal(kullDefaultProfile({...selected,advanced:true}).eligible,false);
assert.equal(kullDefaultProfile({...selected,status:'setup'}).eligible,false);
});