code-kumpel/tests/level.test.js
2026-10-24 04:51:23 +02:00

80 lines
2 KiB
JavaScript

/**
* Unit-Tests XP/Level (#86)
* Run: node tests/level.test.js
*/
const assert = require('assert');
const STAGES = [
[1, 'Funke'],
[3, 'Kleiner Kumpel'],
[6, 'Junior-Coder'],
[10, 'Senior-Kumpel'],
[15, 'Code-Meister']
];
function levelInfo(xp0) {
let lvl = 1;
let xp = xp0;
while (xp >= lvl * 100) {
xp -= lvl * 100;
lvl++;
}
return { lvl, cur: xp, need: lvl * 100 };
}
function stage(lvl) {
let n = STAGES[0][1];
let i = 0;
STAGES.forEach(([l, name], j) => {
if (lvl >= l) {
n = name;
i = j;
}
});
return { name: n, idx: i };
}
function gainXP(state, n) {
const before = levelInfo(state.xp).lvl;
const stBefore = stage(before).idx;
state.xp += Math.max(0, n || 0);
const after = levelInfo(state.xp).lvl;
const stAfter = stage(after).idx;
return { before, after, stBefore, stAfter, leveled: after > before, evolved: stAfter > stBefore };
}
// --- tests
assert.deepStrictEqual(levelInfo(0), { lvl: 1, cur: 0, need: 100 });
assert.deepStrictEqual(levelInfo(99), { lvl: 1, cur: 99, need: 100 });
assert.deepStrictEqual(levelInfo(100), { lvl: 2, cur: 0, need: 200 });
assert.deepStrictEqual(levelInfo(100 + 200), { lvl: 3, cur: 0, need: 300 });
assert.strictEqual(stage(1).name, 'Funke');
assert.strictEqual(stage(3).name, 'Kleiner Kumpel');
assert.strictEqual(stage(6).idx, 2);
assert.strictEqual(stage(15).name, 'Code-Meister');
assert.strictEqual(stage(100).name, 'Code-Meister');
{
const s = { xp: 0 };
const r = gainXP(s, 100);
assert.strictEqual(s.xp, 100);
assert.strictEqual(r.after, 2);
assert.strictEqual(r.leveled, true);
assert.strictEqual(r.evolved, false); // still Funke until lvl 3
}
{
const s = { xp: 0 };
// lvl1 need 100, lvl2 need 200 → 300 XP = lvl 3
const r = gainXP(s, 300);
assert.strictEqual(r.after, 3);
assert.strictEqual(r.evolved, true);
assert.strictEqual(stage(r.after).name, 'Kleiner Kumpel');
}
{
const s = { xp: 50 };
gainXP(s, -10);
assert.strictEqual(s.xp, 50); // negative clamped by Math.max in gainXP
}
console.log('level.test.js OK');