You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
vore-rpg/src/battlers/HitPoints.test.ts

558 lines
28 KiB

import {
checkValidConfidenceLimit,
checkValidCurrentHitPoints,
checkValidHitPoints,
checkValidHitPointsWithoutConfidence,
checkValidMaxHitPoints,
confidenceLimit,
damageConfidence,
damageHealth,
HitPoints,
HitPointsWithoutConfidence,
hitPointsWithoutConfidenceToString,
hitPointsToString, isValidConfidenceLimit,
isValidCurrentHitPoints,
isValidHitPoints,
isValidHitPointsWithoutConfidence,
isValidMaxHitPoints,
recoverConfidence,
recoverHealth, setCurrentConfidence,
setCurrentHealth,
setMaxConfidence,
setMaxHealth, checkConsistentConfidenceDelta
} from "./HitPoints";
import {assertion, AssertionConfig} from "../testing/Assertions";
const InvalidHitPoints = {currentHealth: 999, maxHealth: 99, maxConfidence: 100, currentConfidence: 20};
let originalConfig: AssertionConfig.Type
beforeEach(() => {
originalConfig = assertion.config
assertion.config = AssertionConfig.Throw
});
afterEach(() => {
assertion.config = originalConfig
});
describe("hitPointsWithoutConfidenceToString", () => {
const pairs: [HitPointsWithoutConfidence, string][] = [
[{currentHealth: 99, maxHealth: 100, maxConfidence: 200}, "{Health: 99/100, Confidence: -/-/200}"],
[{currentHealth: -25, maxHealth: 0, maxConfidence: -200}, "{Health: -25/0, Confidence: -/-/-200}"],
]
pairs.forEach(([hp, expected]) => {
test(`for ${JSON.stringify(hp)} = "${expected}"`, () => {
expect(hitPointsWithoutConfidenceToString(hp)).toStrictEqual(expected)
})
})
});
describe("hitPointsToString", () => {
const pairs: [HitPoints, string][] = [
[{currentHealth: 99, maxHealth: 100, maxConfidence: 200, currentConfidence: 10}, "{Health: 99/100, Confidence: 10/198/200}"],
[{currentHealth: -25, maxHealth: 0, maxConfidence: -200, currentConfidence: -15}, "{Health: -25/0, Confidence: -15/<err>/-200}"],
]
pairs.forEach(([hp, expected]) => {
test(`for ${JSON.stringify(hp)} = "${expected}"`, () => {
expect(hitPointsToString(hp)).toStrictEqual(expected)
})
})
});
describe("isValidMaxHitPoints", () => {
const validValues = [1, 2, 99999]
const invalidValues = [0, -1, 1.5, NaN, Infinity, -Infinity, 100000, 999999]
validValues.forEach((value) => {
test(`returns true for ${value}`, () => {
expect(isValidMaxHitPoints(value)).toBe(true)
})
})
invalidValues.forEach((value) => {
test(`returns false for ${value}`, () => {
expect(isValidMaxHitPoints(value)).toBe(false)
})
})
});
describe("isValidCurrentHitPoints", () => {
const validValues: [number, number, number][] = [[1, 1, 0], [-1, 1, -1], [0, 1, 0], [0, 1, -1], [50, 99999, 0]]
const invalidValues: [number, number, number][] = [[2, 1, 0], [-1, 1, 0], [0.5, 1, 0], [-2, 1, -1]]
validValues.forEach(([current, max, min]) => {
test(`returns true for ${current} between ${min} and ${max}`, () => {
expect(isValidCurrentHitPoints(current, max, min)).toBe(true)
})
})
invalidValues.forEach(([current, max, min]) => {
test(`returns false for ${current} between ${min} and ${max}`, () => {
expect(isValidCurrentHitPoints(current, max, min)).toBe(false)
})
})
});
describe("isValidHitPointsWithoutConfidence", () => {
const validValues: HitPointsWithoutConfidence[] = [{
currentHealth: 100,
maxHealth: 100,
maxConfidence: 100,
}, {
currentHealth: 50,
maxHealth: 100,
maxConfidence: 25
}, {
currentHealth: 0,
maxHealth: 1,
maxConfidence: 1,
}]
const invalidValues: HitPointsWithoutConfidence[] = [{
currentHealth: 0,
maxHealth: 0,
maxConfidence: 99,
}, {
currentHealth: 0,
maxHealth: 20,
maxConfidence: 0,
}, {
currentHealth: -300,
maxHealth: 100,
maxConfidence: 99,
}]
validValues.forEach((value) => {
test(`returns true for ${hitPointsWithoutConfidenceToString(value)}`, () => {
expect(isValidHitPointsWithoutConfidence(value)).toBe(true)
})
})
invalidValues.forEach((value) => {
test(`returns false for ${hitPointsWithoutConfidenceToString(value)}`, () => {
expect(isValidHitPointsWithoutConfidence(value)).toBe(false)
})
})
})
describe("isValidHitPoints", () => {
const validValues: HitPoints[] = [{
currentHealth: 100,
maxHealth: 100,
currentConfidence: 100,
maxConfidence: 100,
}, {
currentHealth: 50,
maxHealth: 100,
currentConfidence: 30,
maxConfidence: 60,
}, {
currentHealth: 0,
maxHealth: 100,
currentConfidence: 0,
maxConfidence: 30,
}]
const invalidValues: HitPoints[] = [{
currentHealth: 11,
maxHealth: 10,
currentConfidence: 99,
maxConfidence: 99,
}, {
currentHealth: 10,
maxHealth: 20,
currentConfidence: 20,
maxConfidence: 20,
}, {
currentHealth: 20,
maxHealth: 20,
currentConfidence: 25,
maxConfidence: 20,
}]
validValues.forEach((value) => {
test(`returns true for ${hitPointsToString(value)}`, () => {
expect(isValidHitPoints(value)).toBe(true)
})
})
invalidValues.forEach((value) => {
test(`returns false for ${hitPointsToString(value)}`, () => {
expect(isValidHitPoints(value)).toBe(false)
})
})
})
describe("isValidConfidenceLimit", () => {
const validValues: [number, HitPointsWithoutConfidence][] = [
[200, {
currentHealth: 100,
maxHealth: 100,
maxConfidence: 200,
}], [0, {
currentHealth: 50,
maxHealth: 100,
maxConfidence: 60
}], [10, {
currentHealth: 50,
maxHealth: 100,
maxConfidence: 60
}], [0, {
currentHealth: 0,
maxHealth: 100,
maxConfidence: 100,
}]]
const invalidValues: [number, HitPointsWithoutConfidence][] = [
[195, {
currentHealth: 100,
maxHealth: 100,
maxConfidence: 200,
}], [25, {
currentHealth: 0,
maxHealth: 100,
maxConfidence: 100,
}]]
validValues.forEach(([value, hp]) => {
test(`returns true for ${value} and ${hitPointsWithoutConfidenceToString(hp)}`, () => {
expect(isValidConfidenceLimit(value, hp)).toBe(true)
})
})
invalidValues.forEach(([value, hp]) => {
test(`returns false for ${value} and ${hitPointsWithoutConfidenceToString(hp)}`, () => {
expect(isValidConfidenceLimit(value, hp)).toBe(false)
})
})
})
describe("checkValidMaxHitPoints", () => {
test("returns on valid max HP", () => {
expect(checkValidMaxHitPoints(30)).toEqual(30)
})
test("throws on invalid max HP", () => {
expect(() => checkValidMaxHitPoints(-1)).toThrow()
})
})
describe("checkValidCurrentHitPoints", () => {
test("returns on valid current HP", () => {
expect(checkValidCurrentHitPoints(30, 30, 0)).toEqual(30)
})
test("throws on invalid current HP", () => {
expect(() => checkValidCurrentHitPoints(-10, 30, 0)).toThrow()
})
})
describe("checkValidHitPointsWithoutConfidence", () => {
test("returns on valid hit points base", () => {
expect(checkValidHitPointsWithoutConfidence({currentHealth: 30, maxHealth: 40, maxConfidence: 99})).toStrictEqual({currentHealth: 30, maxHealth: 40, maxConfidence: 99})
})
test("throws on invalid hit points base", () => {
expect(() => checkValidHitPointsWithoutConfidence({currentHealth: -20, maxHealth: 10, maxConfidence: 30})).toThrow()
})
})
describe("checkValidHitPoints", () => {
test("returns on valid hit points", () => {
expect(checkValidHitPoints({currentHealth: 30, maxHealth: 40, maxConfidence: 99, currentConfidence: 30})).toStrictEqual({currentHealth: 30, maxHealth: 40, maxConfidence: 99, currentConfidence: 30})
})
test("throws on invalid hit points", () => {
expect(() => checkValidHitPoints({currentHealth: -20, maxHealth: 10, maxConfidence: 30, currentConfidence: 50})).toThrow()
})
})
describe("checkValidConfidenceLimit", () => {
test("returns on valid confidence limit", () => {
expect(checkValidConfidenceLimit(30, {currentHealth: 15, maxHealth: 20, maxConfidence: 40})).toEqual(30)
})
test("throws on invalid confidence limit", () => {
expect(() => checkValidConfidenceLimit(40, {currentHealth: 15, maxHealth: 20, maxConfidence: 40})).toThrow()
})
})
describe("checkConsistentConfidenceDelta", () => {
const consistentValues: [HitPoints, number, number][] = [
[{currentHealth: 30, maxHealth: 30, currentConfidence: 10, maxConfidence: 20}, -10, 0],
[{currentHealth: 30, maxHealth: 30, currentConfidence: 20, maxConfidence: 20}, 0, 0],
[{currentHealth: 30, maxHealth: 30, currentConfidence: 20, maxConfidence: 20}, 10, 15],
[{currentHealth: 7, maxHealth: 10, currentConfidence: 17, maxConfidence: 25}, 10, 4],
[{currentHealth: 7, maxHealth: 10, currentConfidence: 17, maxConfidence: 25}, 9, 4],
[{currentHealth: 7, maxHealth: 10, currentConfidence: 17, maxConfidence: 25}, 25, 10],
[{currentHealth: 7, maxHealth: 10, currentConfidence: 17, maxConfidence: 25}, 24, 10],
]
consistentValues.forEach(([hp, confidence, health]) => {
const newHealth = {...hp, currentConfidence: confidence, currentHealth: health}
test(`returns for ${hitPointsToString(hp)} -> ${hitPointsToString(newHealth)}`, () => {
expect(checkConsistentConfidenceDelta(confidence, "testing", hp, health)).toEqual(confidence)
})
})
const inconsistentValues: [HitPoints, number, number][] = [
[{currentHealth: 30, maxHealth: 30, currentConfidence: 10, maxConfidence: 20}, 0, 0],
[{currentHealth: 30, maxHealth: 30, currentConfidence: 20, maxConfidence: 20}, 20, 0],
[{currentHealth: 30, maxHealth: 30, currentConfidence: 20, maxConfidence: 20}, 5, 15],
[{currentHealth: 7, maxHealth: 10, currentConfidence: 10, maxConfidence: 25}, 8, 4],
[{currentHealth: 7, maxHealth: 10, currentConfidence: 17, maxConfidence: 25}, 23, 10],
]
inconsistentValues.forEach(([hp, confidence, health]) => {
const newHealth = {...hp, currentConfidence: confidence, currentHealth: health}
test(`throws for ${hitPointsToString(hp)} -> ${hitPointsToString(newHealth)}`, () => {
expect(() => checkConsistentConfidenceDelta(confidence, "testing", hp, health)).toThrow()
})
})
test("throws an error starting with the evaluation of the action function", () => {
expect(() => checkConsistentConfidenceDelta(
30, "frozzing the snagler",
{maxHealth: 10, currentHealth: 0, maxConfidence: 30, currentConfidence: 0},
9
)).toThrow(/^frozzing the snagler /)
})
})
describe("confidenceLimit", () => {
test("throws on invalid input", () => {
expect(() => confidenceLimit({ currentHealth: -99, maxHealth: 30, maxConfidence: 20})).toThrow()
})
const values: [HitPointsWithoutConfidence, number][] = [
[{maxConfidence: 99, maxHealth: 30, currentHealth: 30}, 99],
// Even 1 missing health results in a loss of at least 1 confidence.
[{maxConfidence: 10, maxHealth: 99999, currentHealth: 99998}, 9],
// Confidence is 0 when each point of confidence represents multiple points of health and there aren't enough to make 1 point of confidence
[{maxConfidence: 10, maxHealth: 50, currentHealth: 4}, 0],
// Confidence is 0 when health is 0
[{maxConfidence: 99999, maxHealth: 99, currentHealth: 0}, 0],
// or when it's below 0
[{maxConfidence: 99999, maxHealth: 99, currentHealth: -50}, 0],
]
values.forEach(([hp, expected]) => {
test(`returns ${expected} for ${hitPointsWithoutConfidenceToString(hp)}`, () => {
expect(confidenceLimit(hp)).toBe(expected)
})
})
})
describe("damageHealth", () => {
const invalidValues: [HitPoints, number][] = [
[InvalidHitPoints, 10],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 10}, -1],
]
invalidValues.forEach(([hp, damage]) => {
test(`for ${damage} on ${hitPointsToString(hp)} throws`, () => {
expect(() => damageHealth(hp, damage, {damageConfidence: false})).toThrow()
})
})
const values: [[HitPoints, number, {damageConfidence: boolean}?], Partial<HitPoints>][] = [
[[{currentHealth: -10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 0], {}],
[[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 0], {}],
[[{currentHealth: -5, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 5], {currentHealth: -10}],
[[{currentHealth: -5, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 10], {currentHealth: -10}],
[[{currentHealth: 0, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 10], {currentHealth: -10}],
[[{currentHealth: 0, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 15], {currentHealth: -10}],
[[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 15], {currentHealth: -5}],
[[{currentHealth: 10, maxHealth: 10, maxConfidence: 20, currentConfidence: 18}, 5, {damageConfidence: true}], {currentHealth: 5, currentConfidence: 8}],
[[{currentHealth: 10, maxHealth: 10, maxConfidence: 20, currentConfidence: 18}, 5, {damageConfidence: false}], {currentHealth: 5, currentConfidence: 10}],
[[{currentHealth: 10, maxHealth: 10, maxConfidence: 20, currentConfidence: 18}, 15, {damageConfidence: true}], {currentHealth: -5, currentConfidence: 0}],
[[{currentHealth: 10, maxHealth: 10, maxConfidence: 20, currentConfidence: 18}, 15, {damageConfidence: false}], {currentHealth: -5, currentConfidence: 0}],
[[{currentHealth: 100, maxHealth: 100, maxConfidence: 20, currentConfidence: 18}, 7, {damageConfidence: true}], {currentHealth: 93, currentConfidence: 16}],
[[{currentHealth: 100, maxHealth: 100, maxConfidence: 20, currentConfidence: 18}, 7, {damageConfidence: false}], {currentHealth: 93, currentConfidence: 18}],
[[{currentHealth: 93, maxHealth: 100, maxConfidence: 20, currentConfidence: 18}, 2, {damageConfidence: true}], {currentHealth: 91, currentConfidence: 17}],
[[{currentHealth: 93, maxHealth: 100, maxConfidence: 20, currentConfidence: 18}, 2, {damageConfidence: false}], {currentHealth: 91, currentConfidence: 18}],
]
values.forEach(([[hp, damage, options = {damageConfidence: true}], expectedChanges]) => {
const expected = {...hp, ...expectedChanges}
test(`for ${damage} on ${hitPointsToString(hp)} with damageConfidence ${options.damageConfidence ? "on" : "off"} results in ${hitPointsToString(expected)}`, () => {
expect(damageHealth(hp, damage, options)).toStrictEqual(expected)
})
})
})
describe("recoverHealth", () => {
const invalidValues: [HitPoints, number][] = [
[InvalidHitPoints, 10],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 10}, -1],
]
invalidValues.forEach(([hp, healing]) => {
test(`for ${healing} on ${hitPointsToString(hp)} throws`, () => {
expect(() => recoverHealth(hp, healing, {recoverConfidence: false})).toThrow()
})
})
const values: [[HitPoints, number, {recoverConfidence: boolean}?], Partial<HitPoints>][] = [
[[{currentHealth: -10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 0], {}],
[[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 0], {}],
[[{currentHealth: -5, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 5], {currentHealth: 0}],
[[{currentHealth: -10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 10], {currentHealth: 0}],
[[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 10], {}],
[[{currentHealth: 7, maxHealth: 10, maxConfidence: 20, currentConfidence: 8}, 2, {recoverConfidence: true}], {currentHealth: 9, currentConfidence: 12}],
[[{currentHealth: 7, maxHealth: 10, maxConfidence: 20, currentConfidence: 8}, 2, {recoverConfidence: false}], {currentHealth: 9, currentConfidence: 8}],
[[{currentHealth: 7, maxHealth: 10, maxConfidence: 20, currentConfidence: 8}, 5, {recoverConfidence: true}], {currentHealth: 10, currentConfidence: 14}],
[[{currentHealth: 7, maxHealth: 10, maxConfidence: 20, currentConfidence: 8}, 5, {recoverConfidence: false}], {currentHealth: 10, currentConfidence: 8}],
[[{currentHealth: -10, maxHealth: 10, maxConfidence: 20, currentConfidence: 0}, 15, {recoverConfidence: true}], {currentHealth: 5, currentConfidence: 10}],
[[{currentHealth: -10, maxHealth: 10, maxConfidence: 20, currentConfidence: 0}, 15, {recoverConfidence: false}], {currentHealth: 5, currentConfidence: 0}],
[[{currentHealth: 0, maxHealth: 10, maxConfidence: 25, currentConfidence: 0}, 3, {recoverConfidence: true}], {currentHealth: 3, currentConfidence: 7}],
[[{currentHealth: 3, maxHealth: 10, maxConfidence: 25, currentConfidence: 7}, 3, {recoverConfidence: true}], {currentHealth: 6, currentConfidence: 14}],
[[{currentHealth: 0, maxHealth: 10, maxConfidence: 25, currentConfidence: 0}, 3, {recoverConfidence: false}], {currentHealth: 3, currentConfidence: 0}],
]
values.forEach(([[hp, damage, options = {recoverConfidence: true}], expectedChanges]) => {
const expected = {...hp, ...expectedChanges}
test(`for ${damage} on ${hitPointsToString(hp)} with recoverConfidence ${options.recoverConfidence ? "on" : "off"} results in ${hitPointsToString(expected)}`, () => {
expect(recoverHealth(hp, damage, options)).toStrictEqual(expected)
})
})
})
describe("setMaxHealth", () => {
const invalidValues: [HitPoints, number][] = [
[InvalidHitPoints, 10],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 0],
]
invalidValues.forEach(([hp, newMax]) => {
test(`to ${newMax} on ${hitPointsToString(hp)} throws`, () => {
expect(() => setMaxHealth(hp, newMax)).toThrow()
})
})
const values: [HitPoints, number, Partial<HitPoints>][] = [
[{currentHealth: 8, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 10, {}],
[{currentHealth: 8, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 5, {maxHealth: 5, currentHealth: 5}],
[{currentHealth: 8, maxHealth: 10, maxConfidence: 10, currentConfidence: 4}, 20, {maxHealth: 20}],
[{currentHealth: 8, maxHealth: 10, maxConfidence: 10, currentConfidence: 4}, 19, {maxHealth: 19}],
[{currentHealth: 8, maxHealth: 10, maxConfidence: 10, currentConfidence: 4}, 21, {maxHealth: 21, currentConfidence: 3}],
]
values.forEach(([hp, newMax, expectedChanges]) => {
const expected = {...hp, ...expectedChanges}
test(`to ${newMax} on ${hitPointsToString(hp)} results in ${hitPointsToString(expected)}`, () => {
expect(setMaxHealth(hp, newMax)).toStrictEqual(expected)
})
})
})
describe("setCurrentHealth", () => {
const invalidValues: [HitPoints, number][] = [
[InvalidHitPoints, 10],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, -11],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 11],
]
invalidValues.forEach(([hp, newValue]) => {
test(`to ${newValue} on ${hitPointsToString(hp)} throws`, () => {
expect(() => setCurrentHealth(hp, newValue)).toThrow()
})
})
const values: [HitPoints, number, Partial<HitPoints>][] = [
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 0, {currentHealth: 0}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 10, {}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 5, {currentHealth: 5}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 10, {currentHealth: 10}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, -5, {currentHealth: -5}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, -10, {currentHealth: -10}],
[{currentHealth: 4, maxHealth: 10, maxConfidence: 20, currentConfidence: 5}, 0, {currentHealth: 0, currentConfidence: 0}],
[{currentHealth: 4, maxHealth: 10, maxConfidence: 20, currentConfidence: 5}, 8, {currentHealth: 8}],
]
values.forEach(([hp, newValue, expectedChanges]) => {
const expected = {...hp, ...expectedChanges}
test(`to ${newValue} on ${hitPointsToString(hp)} results in ${hitPointsToString(expected)}`, () => {
expect(setCurrentHealth(hp, newValue)).toStrictEqual(expected)
})
})
})
describe("damageConfidence", () => {
const invalidValues: [HitPoints, number][] = [
[InvalidHitPoints, 10],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, -1],
]
invalidValues.forEach(([hp, damage]) => {
test(`for ${damage} on ${hitPointsToString(hp)} throws`, () => {
expect(() => damageConfidence(hp, damage)).toThrow()
})
})
const values: [HitPoints, number, Partial<HitPoints>][] = [
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 0, {}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 10, {}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 6, {currentConfidence: 0}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 5, {currentConfidence: 0}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 4, {currentConfidence: 1}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 10}, 9, {currentConfidence: 1}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 10}, 11, {currentConfidence: 0}],
]
values.forEach(([hp, damage, expectedChanges]) => {
const expected = {...hp, ...expectedChanges}
test(`for ${damage} on ${hitPointsToString(hp)} results in ${hitPointsToString(expected)}`, () => {
expect(damageConfidence(hp, damage)).toStrictEqual(expected)
})
})
})
describe("recoverConfidence", () => {
const invalidValues: [HitPoints, number][] = [
[InvalidHitPoints, 10],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, -1],
]
invalidValues.forEach(([hp, healing]) => {
test(`for ${healing} on ${hitPointsToString(hp)} throws`, () => {
expect(() => recoverConfidence(hp, healing)).toThrow()
})
})
const values: [HitPoints, number, Partial<HitPoints>][] = [
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 0, {}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 10}, 10, {}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 6, {currentConfidence: 10}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 5, {currentConfidence: 10}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 4, {currentConfidence: 9}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 9, {currentConfidence: 9}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 11, {currentConfidence: 10}],
[{currentHealth: 5, maxHealth: 10, maxConfidence: 20, currentConfidence: 5}, 6, {currentConfidence: 10}],
[{currentHealth: 5, maxHealth: 10, maxConfidence: 20, currentConfidence: 5}, 5, {currentConfidence: 10}],
[{currentHealth: 5, maxHealth: 10, maxConfidence: 20, currentConfidence: 5}, 4, {currentConfidence: 9}],
]
values.forEach(([hp, healing, expectedChanges]) => {
const expected = {...hp, ...expectedChanges}
test(`for ${healing} on ${hitPointsToString(hp)} results in ${hitPointsToString(expected)}`, () => {
expect(recoverConfidence(hp, healing)).toStrictEqual(expected)
})
})
})
describe("setMaxConfidence", () => {
const invalidValues: [HitPoints, number][] = [
[InvalidHitPoints, 10],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 0],
]
invalidValues.forEach(([hp, newMax]) => {
test(`to ${newMax} on ${hitPointsToString(hp)} throws`, () => {
expect(() => setMaxConfidence(hp, newMax)).toThrow()
})
})
const values: [HitPoints, number, Partial<HitPoints>][] = [
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 10, {}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 10, {}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 10}, 10, {}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 6, {maxConfidence: 6}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 5, {maxConfidence: 5}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 4, {maxConfidence: 4, currentConfidence: 4}],
[{currentHealth: 4, maxHealth: 10, maxConfidence: 20, currentConfidence: 5}, 30, {maxConfidence: 30}],
[{currentHealth: 4, maxHealth: 10, maxConfidence: 20, currentConfidence: 5}, 5, {maxConfidence: 5, currentConfidence: 2}],
]
values.forEach(([hp, newMax, expectedChanges]) => {
const expected = {...hp, ...expectedChanges}
test(`to ${newMax} on ${hitPointsToString(hp)} results in ${hitPointsToString(expected)}`, () => {
expect(setMaxConfidence(hp, newMax)).toStrictEqual(expected)
})
})
})
describe("setCurrentConfidence", () => {
const invalidValues: [HitPoints, number][] = [
[InvalidHitPoints, 10],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, -1],
[{currentHealth: 5, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 6],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 5}, 11],
]
invalidValues.forEach(([hp, newValue]) => {
test(`to ${newValue} on ${hitPointsToString(hp)} throws`, () => {
expect(() => setCurrentConfidence(hp, newValue)).toThrow()
})
})
const values: [HitPoints, number, Partial<HitPoints>][] = [
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 0, {}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 5, {currentConfidence: 5}],
[{currentHealth: 10, maxHealth: 10, maxConfidence: 10, currentConfidence: 0}, 10, {currentConfidence: 10}],
[{currentHealth: 4, maxHealth: 10, maxConfidence: 20, currentConfidence: 5}, 0, {currentConfidence: 0}],
[{currentHealth: 4, maxHealth: 10, maxConfidence: 20, currentConfidence: 5}, 8, {currentConfidence: 8}],
]
values.forEach(([hp, newValue, expectedChanges]) => {
const expected = {...hp, ...expectedChanges}
test(`to ${newValue} on ${hitPointsToString(hp)} results in ${hitPointsToString(expected)}`, () => {
expect(setCurrentConfidence(hp, newValue)).toStrictEqual(expected)
})
})
})