98 lines
3.4 KiB
JavaScript
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);
|
|
});
|