80 lines
2 KiB
JavaScript
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');
|