First commit, phased 1 and 2 created but untested
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
const test = require('node:test');
|
||||
const assert = require('node:assert/strict');
|
||||
const { computeEnergy, ENERGY_MAX, ENERGY_REGEN_SECONDS } = require('../../src/game/energy');
|
||||
|
||||
// No time passed
|
||||
test('computeEnergy no time passed', () => {
|
||||
const now = Date.now();
|
||||
const result = computeEnergy(50, now, now);
|
||||
assert.equal(result.energy, 50);
|
||||
assert.equal(result.updatedAtMs, now);
|
||||
});
|
||||
|
||||
// Clock going backwards
|
||||
test('computeEnergy clock going backwards', () => {
|
||||
const result = computeEnergy(50, Date.now(), Date.now() - 100000);
|
||||
assert.equal(result.energy, 50);
|
||||
});
|
||||
|
||||
// Less than one regen interval
|
||||
test('computeEnergy partial tick (less than 1 regen interval)', () => {
|
||||
const now = Date.now();
|
||||
const result = computeEnergy(50, now - 10000, now);
|
||||
// 10s < 180s → no regen
|
||||
assert.equal(result.energy, 50);
|
||||
});
|
||||
|
||||
// One full tick
|
||||
test('computeEnergy one full tick', () => {
|
||||
const now = Date.now();
|
||||
const result = computeEnergy(50, now - 180000, now);
|
||||
// 180s / 180s = 1 tick
|
||||
assert.equal(result.energy, 51);
|
||||
});
|
||||
|
||||
// Multiple full ticks
|
||||
test('computeEnergy multiple full ticks', () => {
|
||||
const now = Date.now();
|
||||
const result = computeEnergy(50, now - 360000, now);
|
||||
// 360s / 180s = 2 ticks
|
||||
assert.equal(result.energy, 52);
|
||||
});
|
||||
|
||||
// Caps at max
|
||||
test('computeEnergy caps at max', () => {
|
||||
const now = Date.now();
|
||||
const result = computeEnergy(100, now - 3600000, now);
|
||||
assert.equal(result.energy, ENERGY_MAX);
|
||||
});
|
||||
|
||||
// Large gap (hours ago)
|
||||
test('computeEnergy large gap caps at max', () => {
|
||||
const now = Date.now();
|
||||
const result = computeEnergy(30, now - 36000000, now); // 10 hours ago
|
||||
assert.equal(result.energy, ENERGY_MAX);
|
||||
});
|
||||
|
||||
// Partial interval preserved (timestamp advances by whole ticks only)
|
||||
test('computeEnergy preserves partial interval', () => {
|
||||
const updatedAt = 1000000;
|
||||
const now = 1000000 + 180000 + 50000; // 1 tick + 50s partial
|
||||
const result = computeEnergy(50, updatedAt, now);
|
||||
assert.equal(result.energy, 51);
|
||||
// Timestamp should advance by exactly 1 tick, not the full elapsed
|
||||
assert.equal(result.updatedAtMs, updatedAt + 180000);
|
||||
});
|
||||
|
||||
// Starting from zero
|
||||
test('computeEnergy from zero', () => {
|
||||
const now = Date.now();
|
||||
const result = computeEnergy(0, now - 540000, now);
|
||||
// 540s / 180s = 3 ticks → 0 + 3 = 3
|
||||
assert.equal(result.energy, 3);
|
||||
});
|
||||
|
||||
// At max, large gap → resets timestamp
|
||||
test('computeEnergy at max resets timestamp', () => {
|
||||
const now = Date.now();
|
||||
const result = computeEnergy(100, now - 10000000, now);
|
||||
assert.equal(result.energy, ENERGY_MAX);
|
||||
assert.equal(result.updatedAtMs, now);
|
||||
});
|
||||
|
||||
// Constants are correct
|
||||
test('ENERGY_MAX is 100', () => {
|
||||
assert.equal(ENERGY_MAX, 100);
|
||||
});
|
||||
|
||||
test('ENERGY_REGEN_SECONDS is 180', () => {
|
||||
assert.equal(ENERGY_REGEN_SECONDS, 180);
|
||||
});
|
||||
Reference in New Issue
Block a user