mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 11:42:29 +00:00
149 lines
5.2 KiB
JavaScript
149 lines
5.2 KiB
JavaScript
const { k } = require('..');
|
|
describe('Calculation.js',()=>{
|
|
describe('calcAttribute({trigger,attributes})',()=>{
|
|
Object.entries({
|
|
vigilance:[{logic:2,willpower:2},{logic:0,willpower:-1},{logic:-1,willpower:-1}],
|
|
build:[{size:2,stamina:2},{size:2,stamina:-1},{size:-1,stamina:-1}],
|
|
intuition:[{charisma:2,wisdom:2},{charisma:2,wisdom:-1},{charisma:-1,wisdom:-1}],
|
|
reflex:[{athletics:2,aptitude:2},{athletics:2,aptitude:-1},{athletics:-1,aptitude:-1}]
|
|
}).forEach(([attr,propArray])=>{
|
|
propArray.forEach(obj => {
|
|
const entries = Object.entries(obj);
|
|
const [prop1,value1,prop2,value2] = entries.flat();
|
|
const expectedVal = 10 + value1 + value2;
|
|
const itMsg = `Given ${value1} ${prop1} and ${value2} ${prop2}, should return ${expectedVal} for ${attr}`
|
|
it(itMsg,()=>{
|
|
k.getAllAttrs({
|
|
callback:(attributes,sections,casc)=>{
|
|
attributes[prop1] = value1;
|
|
attributes[prop2] = value2;
|
|
const retVal = k.callFunc('calcAttribute',{trigger:{name:`${attr}_goal`},attributes});
|
|
expect(retVal).toBe(expectedVal);
|
|
}
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
describe('calcAttributeMod({trigger,attributes})',()=>{
|
|
Object.entries({
|
|
vigilance:[9,11,14],
|
|
build:[9,11,14],
|
|
intuition:[9,11,14],
|
|
reflex:[9,11,14],
|
|
}).forEach(([attr,numArr]) => {
|
|
numArr.forEach((num)=>{
|
|
const expectedVal = num - 11;
|
|
const itMsg = `Given ${num} ${attr}, should return ${expectedVal} for ${attr}_mod`;
|
|
it(itMsg,()=>{
|
|
k.getAllAttrs({
|
|
callback:(attributes,sections,casc)=>{
|
|
attributes[`${attr}_goal`] = num;
|
|
expect(k.callFunc('calcAttributeMod',{trigger:{name:attr},attributes})).toBe(expectedVal);
|
|
}
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
describe('calcMovement({attributes})',()=>{
|
|
[-1,0,2].forEach(num => {
|
|
const expectedVal = 20 + num * 5;
|
|
const itMsg = `Given ${num} athletics, should return ${expectedVal}`;
|
|
it(itMsg,()=>{
|
|
k.getAllAttrs({
|
|
callback:(attributes,sections,casc) => {
|
|
attributes.athletics = num;
|
|
expect(k.callFunc('calcMovement',{attributes})).toBe(expectedVal);
|
|
}
|
|
})
|
|
})
|
|
});
|
|
});
|
|
describe('calcSprint({attributes})',()=>{
|
|
[-1,0,2].forEach(num => {
|
|
const expectedVal = 10 + num * 5;
|
|
const itMsg = `Given ${num} athletics, should return ${expectedVal}`;
|
|
it(itMsg,()=>{
|
|
k.getAllAttrs({
|
|
callback:(attributes,sections,casc) => {
|
|
attributes.athletics = num;
|
|
expect(k.callFunc('calcSprint',{attributes})).toBe(expectedVal);
|
|
}
|
|
});
|
|
});
|
|
});
|
|
});
|
|
describe('calcItemSlotsMax({attributes})',()=>{
|
|
it('Max item slots should equal the largest of SIZ + 3 or SIZ + ATH + 1',()=>{
|
|
k.getAllAttrs({
|
|
callback:(attributes,sections,casc)=>{
|
|
// siz + athletics + 1 < siz + 3
|
|
attributes.attributes.size = 4;
|
|
attributes.attributes.athletics = 1;
|
|
const sizExpected = 7;
|
|
|
|
const sizReceived = k.callFunc('calcItemSlotsMax',{attributes});
|
|
|
|
expect(sizReceived).toBe(sizExpected);
|
|
// siz + athletics + 1 === siz +3
|
|
attributes.attributes.size = 4;
|
|
attributes.attributes.athletics = 2;
|
|
const equalExpected = 7;
|
|
|
|
const equalReceived = k.callFunc('calcItemSlotsMax',{attributes});
|
|
|
|
expect(equalReceived).toBe(equalExpected);
|
|
|
|
// siz + athletics + 1 > siz +3
|
|
attributes.attributes.size = 4;
|
|
attributes.attributes.athletics = 4;
|
|
const athExpected = 9;
|
|
|
|
const athReceived = k.callFunc('calcItemSlotsMax',{attributes});
|
|
|
|
expect(athReceived).toBe(athExpected);
|
|
}
|
|
});
|
|
});
|
|
});
|
|
describe('calcUsedSlots({attributes,sections})',()=>{
|
|
it('used Item slots should equal the number of equipped items',()=>{
|
|
k.getAllAttrs({
|
|
callback:(attributes,sections,casc)=>{
|
|
// no equipped items
|
|
const emptyUsed = k.callFunc('calcUsedSlots',{attributes,sections});
|
|
|
|
expect(emptyUsed).toBe(0);
|
|
|
|
// 3 equipped gear pieces; 1 that doesn't use a slot, no weapons
|
|
const equippedRows = [1,2,3].map(n=>k.generateRowID('repeating_equipped',sections));
|
|
equippedRows.forEach((row,n)=>
|
|
attributes.attributes[`${row}_uses_slot`] =
|
|
n === 1 ?
|
|
0 :
|
|
1
|
|
);
|
|
|
|
const equipUsed = k.callFunc('calcUsedSlots',{attributes,sections});
|
|
|
|
expect(equipUsed).toBe(2);
|
|
|
|
// 3 equipped gear pieces; 1 that doesn't use a slot, and 2 weapons; 1 that doesn't use a slot
|
|
const weaponRows = [1,2].map(n=>k.generateRowID('repeating_weapon',sections));
|
|
weaponRows.forEach((row,n)=>
|
|
attributes.attributes[`${row}_uses_slot`] =
|
|
n === 1 ?
|
|
0 :
|
|
1
|
|
);
|
|
|
|
const weaponUsed = k.callFunc('calcUsedSlots',{attributes,sections});
|
|
|
|
expect(weaponUsed).toBe(3);
|
|
|
|
}
|
|
})
|
|
})
|
|
});
|
|
}); |