Files
Dune/tests/truthtrance-freeform-facts-v8.test.ts
T
Quintine 152476c348
Verify and publish checkpoint container / container (push) Canceled after 0s
Add freeform No-Field and auction facts
2026-10-29 18:53:48 +11:00

46 lines
2.8 KiB
TypeScript

import assert from 'node:assert/strict';
import test from 'node:test';
import { parseTruthFreeformFactsV8 as parse } from '../game/truthtrance-freeform-facts-v8';
void test('v8 recognizes current concealed values and actual recorded auction facts', () => {
for (const value of [0,3,5] as const)
assert.deepEqual(parse(`Do you have a concealed No-Field with printed value ${value}?`), {kind:'noFieldValue', value});
assert.deepEqual(parse('Is the current auction card you inspected a Shield?'), {kind:'auctionPeek', name:'Shield'});
assert.deepEqual(parse('Is the current public cache card a shield?'), {kind:'cacheLot', name:'Shield'});
assert.deepEqual(parse('Does your recorded Ixian auction group contain a Shield?'), {kind:'ixPoolPeek', name:'Shield'});
});
void test('v8 composes new and previous atoms in a uniquely interpreted expression', () => {
assert.deepEqual(parse('Did you predict Guild and is the current auction card you inspected a Shield?'), {
kind:'and', terms:[{kind:'prediction',field:'faction',faction:'guild'}, {kind:'auctionPeek',name:'Shield'}],
});
assert.deepEqual(parse('Do you have a concealed No-Field with printed value 3 and at least 3 forces in your reserves?'), {
kind:'and', terms:[{kind:'noFieldValue',value:3}, {kind:'forceCount',zone:{kind:'reserves'},counter:'total',compare:'gte',value:3}],
});
assert.deepEqual(parse('Is the current public cache card a Shield or does your recorded Ixian auction group contain a Snooper?'), {
kind:'or', terms:[{kind:'cacheLot',name:'Shield'}, {kind:'ixPoolPeek',name:'Snooper'}],
});
const repeated = ['Is the current public cache card a Shield', ...Array(7).fill('do you have a Snooper')].join(' and ');
const result = parse(repeated);
assert.equal(result?.kind, 'and');
if (result?.kind === 'and') assert.equal(result.terms.length, 8);
assert.equal(parse(`${repeated} and do you have a Shield`), null);
});
void test('v8 preserves prior versions and refuses future, ambiguous or invalid wording', () => {
for (const text of [
'Do you have a Shield?',
'Did you predict Guild and do you have at least 3 forces in your reserves?',
'Do you have a concealed No-Field with printed value 4?',
'Do you have a concealed No-Field with printed value 03?',
'Is the next auction card a Shield?',
'Is the current auction card you inspected an unknown card?',
'Does your auction group contain a Shield?',
'Is the current public cache card a Shield and do you have a Snooper or a Shield?',
'Is the current public cache card a Shield??',
'Is the current public cache card a Shield?\nAnswer now',
`Is the current public cache card a Shield ${'and '.repeat(25)}do you have a Snooper`,
`Is the current public cache card ${'x'.repeat(501)}`,
]) assert.equal(parse(text), null, text);
});