Files
mgt2-compendium-amiral-denisov/scripts/tests/allyEnemyGenerator.test.js
T
uberwald a53c7ace53
Release Creation / build (release) Successful in 43s
Ready for release
2026-06-12 20:53:44 +02:00

162 lines
7.0 KiB
JavaScript

import { strict as assert } from 'assert';
import {
RELATION_FORMULAS,
AFFINITY_INIMITY_MAP,
POWER_INFLUENCE_MAP,
AFFINITY_LABELS,
INIMITY_LABELS,
POWER_LABELS,
INFLUENCE_LABELS,
SPECIAL_CHARACTERISTICS_TABLE,
} from '../data/allyEnemyTables.js';
import { mapRollToValue, getLabel, clamp } from '../allyEnemyGenerator.js';
let passed = 0;
let failed = 0;
function test(name, fn) {
try {
fn();
passed++;
console.log(` PASS ${name}`);
} catch (e) {
failed++;
console.error(` FAIL ${name}\n ${e.message}`);
}
}
function assertEqual(actual, expected, msg) {
assert.strictEqual(actual, expected, msg || `expected ${expected}, got ${actual}`);
}
// ──────────────────────────────────────
console.log('\nmapRollToValue');
// ──────────────────────────────────────
test('maps 2→0', () => assertEqual(mapRollToValue(2, AFFINITY_INIMITY_MAP), 0));
test('maps 3→1', () => assertEqual(mapRollToValue(3, AFFINITY_INIMITY_MAP), 1));
test('maps 5→2', () => assertEqual(mapRollToValue(5, AFFINITY_INIMITY_MAP), 2));
test('maps 7→3', () => assertEqual(mapRollToValue(7, AFFINITY_INIMITY_MAP), 3));
test('maps 9→4', () => assertEqual(mapRollToValue(9, AFFINITY_INIMITY_MAP), 4));
test('maps 11→5', () => assertEqual(mapRollToValue(11, AFFINITY_INIMITY_MAP), 5));
test('maps 12→6', () => assertEqual(mapRollToValue(12, AFFINITY_INIMITY_MAP), 6));
test('unknown roll → 0', () => assertEqual(mapRollToValue(13, AFFINITY_INIMITY_MAP), 0));
test('power 2-5→0', () => { assertEqual(mapRollToValue(2, POWER_INFLUENCE_MAP), 0); assertEqual(mapRollToValue(5, POWER_INFLUENCE_MAP), 0); });
test('power 6-7→1', () => { assertEqual(mapRollToValue(6, POWER_INFLUENCE_MAP), 1); assertEqual(mapRollToValue(7, POWER_INFLUENCE_MAP), 1); });
test('power 8→2', () => assertEqual(mapRollToValue(8, POWER_INFLUENCE_MAP), 2));
test('power 9→3', () => assertEqual(mapRollToValue(9, POWER_INFLUENCE_MAP), 3));
test('power 10→4', () => assertEqual(mapRollToValue(10, POWER_INFLUENCE_MAP), 4));
test('power 11→5', () => assertEqual(mapRollToValue(11, POWER_INFLUENCE_MAP), 5));
test('power 12→6', () => assertEqual(mapRollToValue(12, POWER_INFLUENCE_MAP), 6));
// ──────────────────────────────────────
console.log('\ngetLabel');
// ──────────────────────────────────────
test('finds matching affinity label', () => {
assertEqual(getLabel(3, AFFINITY_LABELS).label, 'Très bienveillant');
});
test('returns first for out-of-range', () => {
assertEqual(getLabel(99, AFFINITY_LABELS).label, 'Aucune');
});
test('finds inimity label', () => {
assertEqual(getLabel(4, INIMITY_LABELS).label, 'Haine');
});
test('finds power label', () => {
assertEqual(getLabel(5, POWER_LABELS).label, 'Très puissant');
});
test('finds influence label', () => {
assertEqual(getLabel(2, INFLUENCE_LABELS).label, 'Influence modérée');
});
// ──────────────────────────────────────
console.log('\nclamp');
// ──────────────────────────────────────
test('within range', () => assertEqual(clamp(3, 0, 6), 3));
test('below min', () => assertEqual(clamp(-1, 0, 6), 0));
test('above max', () => assertEqual(clamp(7, 0, 6), 6));
test('edge min', () => assertEqual(clamp(0, 0, 6), 0));
test('edge max', () => assertEqual(clamp(6, 0, 6), 6));
// ──────────────────────────────────────
console.log('\nRELATION_FORMULAS');
// ──────────────────────────────────────
test('ally: 2d6 affinity, 0 inimity', () => {
assertEqual(RELATION_FORMULAS.ally.affinity, '2d6');
assertEqual(RELATION_FORMULAS.ally.inimity, '0');
});
test('contact: 1d6+1 affinity, 1d6-1 inimity', () => {
assertEqual(RELATION_FORMULAS.contact.affinity, '1d6+1');
assertEqual(RELATION_FORMULAS.contact.inimity, '1d6-1');
});
test('rival: 1d6-1 affinity, 1d6+1 inimity', () => {
assertEqual(RELATION_FORMULAS.rival.affinity, '1d6-1');
assertEqual(RELATION_FORMULAS.rival.inimity, '1d6+1');
});
test('enemy: 0 affinity, 2d6 inimity', () => {
assertEqual(RELATION_FORMULAS.enemy.affinity, '0');
assertEqual(RELATION_FORMULAS.enemy.inimity, '2d6');
});
// ──────────────────────────────────────
console.log('\nLABELS — array lengths');
// ──────────────────────────────────────
test('AFFINITY_LABELS has 7 entries', () => assertEqual(AFFINITY_LABELS.length, 7));
test('INIMITY_LABELS has 7 entries', () => assertEqual(INIMITY_LABELS.length, 7));
test('POWER_LABELS has 7 entries', () => assertEqual(POWER_LABELS.length, 7));
test('INFLUENCE_LABELS has 7 entries', () => assertEqual(INFLUENCE_LABELS.length, 7));
// ──────────────────────────────────────
console.log('\nSPECIAL_CHARACTERISTICS_TABLE');
// ──────────────────────────────────────
test('has 36 D66 entries', () => assertEqual(SPECIAL_CHARACTERISTICS_TABLE.length, 36));
test('all entries have valid D66 range', () => {
for (const e of SPECIAL_CHARACTERISTICS_TABLE) {
if (e.d66 < 11 || e.d66 > 66) throw new Error(`entry d66=${e.d66} out of range`);
if (!e.text) throw new Error(`entry d66=${e.d66} missing text`);
if (!e.effects) throw new Error(`entry d66=${e.d66} missing effects`);
}
});
test('D66 65 is extraRolls 2', () => {
const e = SPECIAL_CHARACTERISTICS_TABLE.find(x => x.d66 === 65);
assertEqual(e.effects.action, 'extraRolls');
assertEqual(e.effects.actionValue, 2);
});
test('D66 66 is extraRolls 3', () => {
const e = SPECIAL_CHARACTERISTICS_TABLE.find(x => x.d66 === 66);
assertEqual(e.effects.action, 'extraRolls');
assertEqual(e.effects.actionValue, 3);
});
test('D66 11 has affinityMod 1', () => {
const e = SPECIAL_CHARACTERISTICS_TABLE.find(x => x.d66 === 11);
assertEqual(e.effects.affinityMod, 1);
});
test('D66 44 has setPowerToZero + inimityMod 1', () => {
const e = SPECIAL_CHARACTERISTICS_TABLE.find(x => x.d66 === 44);
assertEqual(e.effects.action, 'setPowerToZero');
assertEqual(e.effects.inimityMod, 1);
});
// ──────────────────────────────────────
console.log('\n');
// ──────────────────────────────────────
if (failed > 0) {
console.error(`\n ${failed} of ${passed + failed} tests FAILED\n`);
process.exit(1);
} else {
console.log(` All ${passed} tests passed\n`);
}