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.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; | ||||
let target = 70; | |||||
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" | ||||
}, | }, | ||||
"HP": 5, | "HP": "5", | ||||
"Rate": 2000, | "Rate": "2000", | ||||
"UnhealableClasses": { "_string": "Cavalry" }, | "UnhealableClasses": { "_string": "Cavalry" }, | ||||
"HealableClasses": { "_string": "Support Infantry" }, | "HealableClasses": { "_string": "Support Infantry" }, | ||||
}; | }; | ||||
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/HP": | case "Heal/HP": | ||||
return stat + 100; | return stat + 100; | ||||
case "Heal/Rate": | case "Heal/Rate": | ||||
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); | ||||
let cmpTimer; | |||||
Freagarach: Move to where needed. | |||||
// Test Getters | function test_Getters() | ||||
{ | |||||
TS_ASSERT_EQUALS(cmpHeal.GetRate(), 2000 + 200); | TS_ASSERT_EQUALS(cmpHeal.GetRate(), 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.GetHP(), 5 + 100); | TS_ASSERT_EQUALS(cmpHeal.GetHP(), 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_Getters(); | |||||
// Test PerformHeal | function test_Healing() | ||||
Done Inline ActionsAdapt instead of remove. Freagarach: Adapt instead of remove. | |||||
let target = 70; | { | ||||
cmpTimer = ConstructComponent(SYSTEM_ENTITY, "Timer"); | |||||
let increased; | let increased; | ||||
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 }; | ||||
} | }, | ||||
"IsInjured": () => true, | |||||
}); | }); | ||||
cmpHeal.PerformHeal(target); | 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.) | |||||
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); | cmpHeal.PerformHeal(target); | ||||
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; | ||||
} | } | ||||
}); | }); | ||||
cmpHeal.OnValueModification({ "component": "Heal", "valueNames": ["Heal/HP"] }); | cmpHeal.OnValueModification({ "component": "Heal", "valueNames": ["Heal/HP"] }); | ||||
TS_ASSERT(!updated); | TS_ASSERT(!updated); | ||||
cmpHeal.OnValueModification({ "component": "Heal", "valueNames": ["Heal/Range"] }); | cmpHeal.OnValueModification({ "component": "Heal", "valueNames": ["Heal/Range"] }); | ||||
TS_ASSERT(updated); | TS_ASSERT(updated); | ||||
} | |||||
test_Healing(); | |||||
function testStopHealing() | |||||
{ | |||||
cmpTimer = ConstructComponent(SYSTEM_ENTITY, "Timer"); | |||||
let 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 }; | |||||
}, | |||||
"IsInjured": () => true, | |||||
}); | |||||
cmpHeal.StartHealing(target); | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT(increased); | |||||
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 }; | |||||
}, | |||||
"IsInjured": () => false, | |||||
}); | |||||
cmpTimer.OnUpdate({ "turnLength": 2.2 }); | |||||
TS_ASSERT(!increased); | |||||
} | |||||
testStopHealing(); |
Wildfire Games · Phabricator
Move to where needed.