Files
the-beacon/tests/compute.test.cjs
Alexander Whitestone 4571fdca64
Some checks failed
Accessibility Checks / a11y-audit (pull_request) Successful in 9s
Smoke Test / smoke (pull_request) Failing after 12s
feat: add compute budget supply/demand system (#4)
2026-04-13 22:16:32 -04:00

98 lines
3.4 KiB
JavaScript

const test = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const vm = require('node:vm');
const ROOT = path.resolve(__dirname, '..');
function loadCompute({ overrides = {} } = {}) {
const context = {
console,
Math,
Date,
setTimeout: () => 0,
clearTimeout: () => {},
localStorage: { getItem: () => null, setItem: () => {} },
log: () => {},
showToast: () => {},
renderBeaconEnding: () => {},
...overrides,
};
vm.createContext(context);
const source = fs.readFileSync(path.join(ROOT, 'js/data.js'), 'utf8');
vm.runInContext(source + '\nthis.__exports = { G, CONFIG, BDEF, PDEFS };', context);
return { context, ...context.__exports };
}
test('compute budget config constants exist', () => {
const { CONFIG } = loadCompute();
assert.equal(typeof CONFIG.COMPUTE_BUDGET_ENABLED, 'boolean');
assert.equal(CONFIG.COMPUTE_BUDGET_ENABLED, false);
assert.equal(typeof CONFIG.COMPUTE_MOMENTUM_RATE, 'number');
assert.ok(CONFIG.COMPUTE_MOMENTUM_RATE > 0 && CONFIG.COMPUTE_MOMENTUM_RATE < 1);
assert.equal(typeof CONFIG.COMPUTE_BATTERY_MAX, 'number');
assert.ok(CONFIG.COMPUTE_BATTERY_MAX > 0);
});
test('global state has compute budget fields', () => {
const { G } = loadCompute();
assert.equal(typeof G.computeSupply, 'number');
assert.equal(G.computeSupply, 0);
assert.equal(typeof G.computeDemand, 'number');
assert.equal(G.computeDemand, 0);
assert.equal(typeof G.computeBattery, 'number');
assert.equal(G.computeBattery, 0);
assert.equal(typeof G.computeMomentum, 'number');
assert.equal(G.computeMomentum, 0);
assert.equal(typeof G.computePowMod, 'number');
assert.equal(G.computePowMod, 1);
});
test('server building provides compute supply when budget enabled', () => {
const { G, CONFIG, BDEF } = loadCompute();
CONFIG.COMPUTE_BUDGET_ENABLED = true;
G.buildings.server = 3;
const serverDef = BDEF.find(b => b.id === 'server');
assert.ok(serverDef);
assert.equal(serverDef.computeSupply, 1);
const supply = (serverDef.computeSupply || 0) * G.buildings.server;
assert.equal(supply, 3);
});
test('trainer building has compute demand when budget enabled', () => {
const { BDEF } = loadCompute();
const trainerDef = BDEF.find(b => b.id === 'trainer');
assert.ok(trainerDef);
assert.equal(trainerDef.computeDemand, 2);
const evaluatorDef = BDEF.find(b => b.id === 'evaluator');
assert.ok(evaluatorDef);
assert.equal(evaluatorDef.computeDemand, 5);
});
test('compute budget project enables the system', () => {
const { G, CONFIG, PDEFS } = loadCompute();
const project = PDEFS.find(p => p.id === 'p_compute_budget');
assert.ok(project, 'compute budget project missing');
assert.equal(project.name, 'Compute Budget System');
assert.equal(CONFIG.COMPUTE_BUDGET_ENABLED, false);
project.effect();
assert.equal(CONFIG.COMPUTE_BUDGET_ENABLED, true);
});
test('compute budget project only triggers after trainer is built', () => {
const { G, PDEFS } = loadCompute();
const project = PDEFS.find(p => p.id === 'p_compute_budget');
G.totalKnowledge = 0;
G.buildings.trainer = 0;
assert.equal(project.trigger(), false);
G.totalKnowledge = 1500;
G.buildings.trainer = 0;
assert.equal(project.trigger(), false);
G.totalKnowledge = 1500;
G.buildings.trainer = 1;
assert.equal(project.trigger(), true);
});