Connect three-deck Nexus Kull and Ixian Semuta
Verify and publish checkpoint container / container (push) Successful in 10m42s
Verify and publish checkpoint container / container (push) Successful in 10m42s
This commit is contained in:
1 parent
e697d7f558
commit
a1b09c5b02
14 files changed
+643
-25
No files matched your search
@@ -0,0 +1,49 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
import { kullDefaultProfile, type KullDefaultProfile } from '../game/kull-default-profile';
|
||||
|
||||
const lobby: KullDefaultProfile = {
|
||||
status: 'lobby', advanced: false, expansions: ['ix', 'choam', 'ecaz'],
|
||||
players: [{faction:'choam'}, {faction:'richese'}, {faction:'atreides'}],
|
||||
nexusCards: {cards:null, phase:null},
|
||||
};
|
||||
|
||||
void test('Basic three-deck Nexus Kull quote accepts selected and unused native families', () => {
|
||||
for (const extra of [[], ['ecaz'], ['moritani'], ['ecaz','moritani'], ['ixians','ecaz','moritani']]) {
|
||||
const input = {...lobby, players:[...lobby.players, ...extra.map(faction => ({faction}))]};
|
||||
const original = structuredClone(input);
|
||||
assert.deepEqual(kullDefaultProfile(input), {eligible:true, reason:null});
|
||||
assert.deepEqual(input, original);
|
||||
assert.equal(kullDefaultProfile({...input, nexusCards:undefined,
|
||||
lobbyModules:{nexusCards:true}}).eligible, true);
|
||||
}
|
||||
// Eligibility describes the available option; the caller owns host opt-out.
|
||||
const options = {leaderSkills:false, kullOptOut:true};
|
||||
assert.equal(kullDefaultProfile({...lobby, lobbyOptions:options}).eligible, true);
|
||||
});
|
||||
|
||||
void test('Three-deck Nexus Kull quote preserves public roster and module restrictions', () => {
|
||||
const invalid: Partial<KullDefaultProfile>[] = [
|
||||
{advanced:true}, {status:'playing'},
|
||||
{expansions:['ix','choam','choam']}, {expansions:['ix','choam','unknown']},
|
||||
{expansions:['ix','choam'], players:[{faction:'choam'}, {faction:'ecaz'}]},
|
||||
{players:[{faction:'choam'}, {faction:'ecaz'}, {faction:'ecaz'}]},
|
||||
{players:[{faction:'ecaz'}, {faction:'richese'}]},
|
||||
{lobbyOptions:{ecazTreachery:true}}, {lobbyOptions:{leaderSkills:true}},
|
||||
{lobbyModules:{nexusCards:true, ecazTreachery:true}},
|
||||
{lobbyModules:{nexusCards:true, discoveries:true}},
|
||||
{homeworlds:{}}, {techTokens:{}}, {strongholdCards:{}}, {discoveryEnabled:true},
|
||||
{discoveries:{}}, {discoveryStash:{}}, {greatMaker:{}}, {sandtrout:{}},
|
||||
];
|
||||
for (const variant of invalid) {
|
||||
const result = kullDefaultProfile({...lobby, ...variant});
|
||||
assert.equal(result.eligible, false, JSON.stringify(variant));
|
||||
assert.ok(result.reason, 'Unavailable configurations need a readable reason');
|
||||
}
|
||||
});
|
||||
|
||||
void test('Three-deck Nexus Kull eligibility never reads private cards or funds', () => {
|
||||
const ecaz = {faction:'ecaz', get hand() {throw Error('private hand read');},
|
||||
get spice() {throw Error('private spice read');}};
|
||||
assert.equal(kullDefaultProfile({...lobby, players:[{faction:'choam'},ecaz]}).eligible, true);
|
||||
});
|
||||
Reference in new issue
Block a user