Changeset View
Changeset View
Standalone View
Standalone View
binaries/data/mods/public/simulation/components/tests/test_Heal.js
Engine.LoadHelperScript("ValueModification.js"); | Engine.LoadHelperScript("ValueModification.js"); | ||||
Engine.LoadHelperScript("Player.js"); | Engine.LoadHelperScript("Player.js"); | ||||
Engine.LoadComponentScript("interfaces/Formation.js"); | Engine.LoadComponentScript("interfaces/Formation.js"); | ||||
Engine.LoadComponentScript("interfaces/Heal.js"); | Engine.LoadComponentScript("interfaces/Heal.js"); | ||||
Engine.LoadComponentScript("interfaces/Health.js"); | Engine.LoadComponentScript("interfaces/Health.js"); | ||||
Engine.LoadComponentScript("interfaces/Loot.js"); | Engine.LoadComponentScript("interfaces/Loot.js"); | ||||
Engine.LoadComponentScript("interfaces/Promotion.js"); | Engine.LoadComponentScript("interfaces/Promotion.js"); | ||||
Engine.LoadComponentScript("interfaces/Timer.js"); | |||||
Engine.LoadComponentScript("interfaces/UnitAI.js"); | Engine.LoadComponentScript("interfaces/UnitAI.js"); | ||||
Engine.LoadComponentScript("Heal.js"); | Engine.LoadComponentScript("Heal.js"); | ||||
Engine.LoadComponentScript("Timer.js"); | |||||
const entity = 60; | const entity = 60; | ||||
const player = 1; | const player = 1; | ||||
const otherPlayer = 2 | const otherPlayer = 2 | ||||
Lint: ESLintBear (semi): `Missing semicolon.` | |||||
Lint: JSHintBear Missing semicolon. Lint: JSHintBear: `Missing semicolon.` | |||||
AddMock(SYSTEM_ENTITY, IID_ObstructionManager, { | |||||
"IsInTargetRange": () => true | |||||
}); | |||||
let template = { | let template = { | ||||
"Range": 20, | "Range": "20", | ||||
"RangeOverlay": { | "RangeOverlay": { | ||||
"LineTexture": "heal_overlay_range.png", | "LineTexture": "heal_overlay_range.png", | ||||
"LineTextureMask": "heal_overlay_range_mask.png", | "LineTextureMask": "heal_overlay_range_mask.png", | ||||
"LineThickness": 0.35 | "LineThickness": "0.35" | ||||
}, | }, | ||||
"Health": 5, | "Health": "5", | ||||
"Interval": 2000, | "Interval": "2000", | ||||
"UnhealableClasses": { "_string": "Cavalry" }, | "UnhealableClasses": { "_string": "Cavalry" }, | ||||
"HealableClasses": { "_string": "Support Infantry" }, | "HealableClasses": { "_string": "Support Infantry" }, | ||||
}; | }; | ||||
AddMock(entity, IID_Ownership, { | AddMock(entity, IID_Ownership, { | ||||
"GetOwner": () => player | "GetOwner": () => player | ||||
}); | }); | ||||
AddMock(SYSTEM_ENTITY, IID_PlayerManager, { | AddMock(SYSTEM_ENTITY, IID_PlayerManager, { | ||||
"GetPlayerByID": () => player | "GetPlayerByID": () => player | ||||
}); | }); | ||||
AddMock(player, IID_Player, { | AddMock(player, IID_Player, { | ||||
"IsAlly": () => true | "IsAlly": (p) => p == player | ||||
}); | }); | ||||
AddMock(otherPlayer, IID_Player, { | AddMock(otherPlayer, IID_Player, { | ||||
"IsAlly": () => false | "IsAlly": (p) => p == player | ||||
}); | }); | ||||
ApplyValueModificationsToEntity = function(value, stat, ent) | ApplyValueModificationsToEntity = function(value, stat, ent) | ||||
{ | { | ||||
if (ent != entity) | if (ent != entity) | ||||
return stat; | return stat; | ||||
switch (value) | switch (value) | ||||
{ | { | ||||
case "Heal/Health": | case "Heal/Health": | ||||
return stat + 100; | return stat + 100; | ||||
case "Heal/Interval": | case "Heal/Interval": | ||||
return stat + 200; | return stat + 200; | ||||
case "Heal/Range": | case "Heal/Range": | ||||
return stat + 300; | return stat + 300; | ||||
default: | default: | ||||
return stat; | return stat; | ||||
} | } | ||||
}; | }; | ||||
let cmpHeal = ConstructComponent(60, "Heal", template); | let cmpHeal = ConstructComponent(60, "Heal", template); | ||||
Done Inline ActionsMove to where needed. Freagarach: Move to where needed. | |||||
// Test Getters | // Test Getters | ||||
TS_ASSERT_EQUALS(cmpHeal.GetInterval(), 2000 + 200); | TS_ASSERT_EQUALS(cmpHeal.GetInterval(), 2000 + 200); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpHeal.GetTimers(), { "prepare": 1000, "repeat": 2000 + 200 }); | TS_ASSERT_UNEVAL_EQUALS(cmpHeal.GetTimers(), { "prepare": 1000, "repeat": 2000 + 200 }); | ||||
TS_ASSERT_EQUALS(cmpHeal.GetHealth(), 5 + 100); | TS_ASSERT_EQUALS(cmpHeal.GetHealth(), 5 + 100); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpHeal.GetRange(), { "min": 0, "max": 20 + 300 }); | TS_ASSERT_UNEVAL_EQUALS(cmpHeal.GetRange(), { "min": 0, "max": 20 + 300 }); | ||||
TS_ASSERT_EQUALS(cmpHeal.GetHealableClasses(), "Support Infantry"); | TS_ASSERT_EQUALS(cmpHeal.GetHealableClasses(), "Support Infantry"); | ||||
TS_ASSERT_EQUALS(cmpHeal.GetUnhealableClasses(), "Cavalry"); | TS_ASSERT_EQUALS(cmpHeal.GetUnhealableClasses(), "Cavalry"); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpHeal.GetRangeOverlays(), [{ | TS_ASSERT_UNEVAL_EQUALS(cmpHeal.GetRangeOverlays(), [{ | ||||
"radius": 20 + 300, | "radius": 20 + 300, | ||||
"texture": "heal_overlay_range.png", | "texture": "heal_overlay_range.png", | ||||
"textureMask": "heal_overlay_range_mask.png", | "textureMask": "heal_overlay_range_mask.png", | ||||
"thickness": 0.35 | "thickness": 0.35 | ||||
}]); | }]); | ||||
// Test PerformHeal | // Test healing. | ||||
Done Inline ActionsAdapt instead of remove. Freagarach: Adapt instead of remove. | |||||
let target = 70; | let target = 70; | ||||
AddMock(target, IID_Ownership, { | AddMock(target, IID_Ownership, { | ||||
"GetOwner": () => player | "GetOwner": () => player | ||||
}); | }); | ||||
let targetClasses; | let targetClasses = ["Infantry"]; | ||||
AddMock(target, IID_Identity, { | AddMock(target, IID_Identity, { | ||||
"GetClassesList": () => targetClasses | "GetClassesList": () => targetClasses | ||||
}); | }); | ||||
let cmpTimer = ConstructComponent(SYSTEM_ENTITY, "Timer"); | |||||
let increased; | let increased; | ||||
let unhealable = false; | let unhealable = false; | ||||
AddMock(target, IID_Health, { | AddMock(target, IID_Health, { | ||||
"GetMaxHitpoints": () => 700, | "GetMaxHitpoints": () => 700, | ||||
"Increase": amount => { | "Increase": amount => { | ||||
increased = true; | increased = true; | ||||
TS_ASSERT_EQUALS(amount, 5 + 100); | TS_ASSERT_EQUALS(amount, 5 + 100); | ||||
return { "old": 600, "new": 600 + 5 + 100 }; | return { "old": 600, "new": 600 + 5 + 100 }; | ||||
}, | }, | ||||
"IsUnhealable": () => unhealable | "IsUnhealable": () => unhealable, | ||||
"IsInjured": () => true | |||||
}); | }); | ||||
cmpHeal.PerformHeal(target); | TS_ASSERT(cmpHeal.StartHealing(target)); | ||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT(increased); | |||||
increased = false; | |||||
cmpTimer.OnUpdate({ "turnLength": 2.2 }); | |||||
TS_ASSERT(increased); | TS_ASSERT(increased); | ||||
Done Inline ActionsHow are we ever allowed to perform heal when we are not allowed? (No matching classes.) Freagarach: How are we ever allowed to perform heal when we are not allowed? (No matching classes.) | |||||
// Test we can't heal too quickly. | |||||
increased = false; | |||||
TS_ASSERT(cmpHeal.StartHealing(target)); | |||||
cmpTimer.OnUpdate({ "turnLength": 2 }); | |||||
TS_ASSERT(!increased) | |||||
Lint: ESLintBear (semi) Missing semicolon. Lint: ESLintBear (semi): `Missing semicolon.` | |||||
Lint: JSHintBear Missing semicolon. Lint: JSHintBear: `Missing semicolon.` | |||||
// Test experience. | |||||
let looted; | let looted; | ||||
AddMock(target, IID_Loot, { | AddMock(target, IID_Loot, { | ||||
"GetXp": () => { | "GetXp": () => { | ||||
looted = true; return 80; | looted = true; return 80; | ||||
} | } | ||||
}); | }); | ||||
let promoted; | let promoted; | ||||
AddMock(entity, IID_Promotion, { | AddMock(entity, IID_Promotion, { | ||||
"IncreaseXp": amount => { | "IncreaseXp": amount => { | ||||
promoted = true; | promoted = true; | ||||
TS_ASSERT_EQUALS(amount, (5 + 100) * 80 / 700); | TS_ASSERT_EQUALS(amount, (5 + 100) * 80 / 700); | ||||
} | } | ||||
}); | }); | ||||
increased = false; | increased = false; | ||||
cmpHeal.PerformHeal(target); | TS_ASSERT(cmpHeal.StartHealing(target)); | ||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT(increased && looted && promoted); | TS_ASSERT(increased && looted && promoted); | ||||
// Test OnValueModification | // Test OnValueModification | ||||
let updated; | let updated; | ||||
AddMock(entity, IID_UnitAI, { | AddMock(entity, IID_UnitAI, { | ||||
"UpdateRangeQueries": () => { | "UpdateRangeQueries": () => { | ||||
updated = true; | updated = true; | ||||
} | } | ||||
Show All 21 Lines | |||||
targetClasses = ["Infantry"]; | targetClasses = ["Infantry"]; | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpHeal.CanHeal(target), true); | TS_ASSERT_UNEVAL_EQUALS(cmpHeal.CanHeal(target), true); | ||||
unhealable = true; | unhealable = true; | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpHeal.CanHeal(target), false); | TS_ASSERT_UNEVAL_EQUALS(cmpHeal.CanHeal(target), false); | ||||
let otherTarget = 71; | let otherTarget = 71; | ||||
AddMock(otherTarget, IID_Ownership, { | AddMock(otherTarget, IID_Ownership, { | ||||
"GetOwner": () => player | "GetOwner": () => otherPlayer | ||||
}); | }); | ||||
AddMock(otherTarget, IID_Health, { | AddMock(otherTarget, IID_Health, { | ||||
"IsUnhealable": () => false | "IsUnhealable": () => false, | ||||
"IsInjured": () => true | |||||
}); | |||||
AddMock(otherTarget, IID_Identity, { | |||||
"GetClassesList": () => ["Infantry"] | |||||
}); | |||||
TS_ASSERT(!cmpHeal.CanHeal(otherTarget)); | |||||
// Test we stop healing when finished. | |||||
increased = false; | |||||
AddMock(target, IID_Health, { | |||||
"GetMaxHitpoints": () => 700, | |||||
"Increase": amount => { | |||||
increased = true; | |||||
TS_ASSERT_EQUALS(amount, 5 + 100); | |||||
return { "old": 600, "new": 600 + 5 + 100 }; | |||||
}, | |||||
"IsUnhealable": () => false, | |||||
"IsInjured": () => true | |||||
}); | |||||
TS_ASSERT(cmpHeal.StartHealing(target)); | |||||
cmpTimer.OnUpdate({ "turnLength": 2.2 }); | |||||
TS_ASSERT(increased); | |||||
increased = false; | |||||
AddMock(target, IID_Health, { | |||||
"GetMaxHitpoints": () => 700, | |||||
"Increase": amount => { | |||||
increased = true; | |||||
TS_ASSERT(false); | |||||
}, | |||||
"IsUnhealable": () => false, | |||||
"IsInjured": () => false | |||||
}); | }); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpHeal.CanHeal(otherTarget), false); | cmpTimer.OnUpdate({ "turnLength": 2.2 }); | ||||
TS_ASSERT(!increased); | |||||
Done Inline ActionsComment and elaborate. Freagarach: Comment and elaborate. |
Wildfire Games · Phabricator
Missing semicolon.