hpFormula field persisted on participant doc (makeParticipant + builder). Add handler stores formula. Edit modal loads participant.hpFormula, reroll button sets maxHp field (no save until save). Edit submit persists formula. Formula only for monster/npc types.
61 lines
1.6 KiB
JavaScript
61 lines
1.6 KiB
JavaScript
// HP formula roll: parse "2d6+9" style, roll, return total.
|
|
const shared = require('@ttrpg/shared');
|
|
const { rollHpFormula } = shared;
|
|
|
|
describe('rollHpFormula', () => {
|
|
test('basic NdM', () => {
|
|
const r = rollHpFormula('2d6');
|
|
expect(r).toBeGreaterThanOrEqual(2);
|
|
expect(r).toBeLessThanOrEqual(12);
|
|
});
|
|
|
|
test('NdM+bonus', () => {
|
|
const r = rollHpFormula('2d6+9');
|
|
expect(r).toBeGreaterThanOrEqual(11);
|
|
expect(r).toBeLessThanOrEqual(21);
|
|
});
|
|
|
|
test('NdM-bonus', () => {
|
|
const r = rollHpFormula('3d8-2');
|
|
expect(r).toBeGreaterThanOrEqual(1);
|
|
expect(r).toBeLessThanOrEqual(22);
|
|
});
|
|
|
|
test('single die', () => {
|
|
const r = rollHpFormula('1d20');
|
|
expect(r).toBeGreaterThanOrEqual(1);
|
|
expect(r).toBeLessThanOrEqual(20);
|
|
});
|
|
|
|
test('case insensitive', () => {
|
|
const r = rollHpFormula('2D6+5');
|
|
expect(r).toBeGreaterThanOrEqual(7);
|
|
expect(r).toBeLessThanOrEqual(17);
|
|
});
|
|
|
|
test('whitespace tolerant', () => {
|
|
const r = rollHpFormula(' 2d6 + 9 ');
|
|
expect(r).toBeGreaterThanOrEqual(11);
|
|
expect(r).toBeLessThanOrEqual(21);
|
|
});
|
|
|
|
test('large die', () => {
|
|
const r = rollHpFormula('4d12+10');
|
|
expect(r).toBeGreaterThanOrEqual(14);
|
|
expect(r).toBeLessThanOrEqual(58);
|
|
});
|
|
|
|
test('invalid returns null', () => {
|
|
expect(rollHpFormula('abc')).toBeNull();
|
|
expect(rollHpFormula('')).toBeNull();
|
|
expect(rollHpFormula(null)).toBeNull();
|
|
expect(rollHpFormula(undefined)).toBeNull();
|
|
expect(rollHpFormula('2d')).toBeNull();
|
|
expect(rollHpFormula('d6')).toBeNull();
|
|
});
|
|
|
|
test('zero dice invalid', () => {
|
|
expect(rollHpFormula('0d6')).toBeNull();
|
|
});
|
|
});
|