Index: binaries/data/mods/public/simulation/components/tests/test_Promotion.js =================================================================== --- binaries/data/mods/public/simulation/components/tests/test_Promotion.js +++ binaries/data/mods/public/simulation/components/tests/test_Promotion.js @@ -1,19 +1,21 @@ Engine.LoadComponentScript("interfaces/Health.js"); Engine.LoadComponentScript("interfaces/Promotion.js"); +Engine.LoadComponentScript("interfaces/Timer.js"); Engine.LoadComponentScript("interfaces/UnitAI.js"); Engine.LoadComponentScript("Promotion.js"); +Engine.LoadComponentScript("Timer.js"); -(function testMultipleXPIncrease() -{ -let ApplyValueModificationsToEntity = (_, val) => val; +let cmpPromotion; +const entity = 60; +let modif = 0; + +let ApplyValueModificationsToEntity = (_, val) => val + modif; Engine.RegisterGlobal("ApplyValueModificationsToEntity", ApplyValueModificationsToEntity); Engine.RegisterGlobal("ApplyValueModificationsToTemplate", ApplyValueModificationsToEntity); -let QueryOwnerInterface = () => ({ "GetPlayerID": () => 2 }); +let QueryOwnerInterface = () => ({ "GetPlayerID": () => 1 }); Engine.RegisterGlobal("QueryOwnerInterface", QueryOwnerInterface); -const ENT_ID = 60; - let entTemplates = { "60": "template_b", "61": "template_f", @@ -36,42 +38,80 @@ }), }); -let cmpPromotion = ConstructComponent(ENT_ID, "Promotion", { - "Entity": "template_b", - "RequiredXp": 1000 -}); - let ChangeEntityTemplate = function(ent, template) { - cmpPromotion = ConstructComponent(ent + 1, "Promotion", { - "Entity": entTemplates[ent + 1], + let newEnt = ent + 1; + cmpPromotion = ConstructComponent(newEnt, "Promotion", { + "Entity": entTemplates[newEnt], "RequiredXp": 1000 }); - return ent + 1; + return newEnt; }; Engine.RegisterGlobal("ChangeEntityTemplate", ChangeEntityTemplate); +cmpPromotion = ConstructComponent(entity, "Promotion", { + "Entity": "template_b", + "RequiredXp": 1000 +}); + +// Test getters/setters. +TS_ASSERT_EQUALS(cmpPromotion.GetRequiredXp(), 1000); TS_ASSERT_EQUALS(cmpPromotion.GetCurrentXp(), 0); +modif = 111; +TS_ASSERT_EQUALS(cmpPromotion.GetRequiredXp(), 1111); +modif = 0; + cmpPromotion.IncreaseXp(200); TS_ASSERT_EQUALS(cmpPromotion.GetCurrentXp(), 200); -cmpPromotion.IncreaseXp(800); +// Test promotion itself. +cmpPromotion.IncreaseXp(800); TS_ASSERT_EQUALS(cmpPromotion.entity, 61); TS_ASSERT_EQUALS(cmpPromotion.GetCurrentXp(), 0); TS_ASSERT_EQUALS(cmpPromotion.GetRequiredXp(), 1000); + +// Test multiple promotions at once. cmpPromotion.IncreaseXp(4200); TS_ASSERT_EQUALS(cmpPromotion.entity, 62); TS_ASSERT_EQUALS(cmpPromotion.template.Entity, "end"); TS_ASSERT_EQUALS(cmpPromotion.GetCurrentXp(), 200); -cmpPromotion = ConstructComponent(ENT_ID, "Promotion", { +// Test a dead entity can't promote. +cmpPromotion = ConstructComponent(entity, "Promotion", { "Entity": "template_b", "RequiredXp": 1000 }); -let cmpHealth = AddMock(ENT_ID, IID_Health, { +let cmpHealth = AddMock(entity, IID_Health, { "GetHitpoints": () => 0, }); cmpPromotion.IncreaseXp(1000); -})(); +TS_ASSERT_EQUALS(cmpPromotion.entity, entity); +TS_ASSERT_EQUALS(cmpPromotion.GetCurrentXp(), 0); +DeleteMock(entity, IID_Health); + +// Test XP trickle. +let cmpTimer = ConstructComponent(SYSTEM_ENTITY, "Timer", {}); +cmpPromotion = ConstructComponent(entity, "Promotion", { + "Entity": "template_b", + "RequiredXp": "100", + "TrickleRate": "10" +}); +TS_ASSERT_EQUALS(cmpPromotion.GetCurrentXp(), 0); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(cmpPromotion.GetCurrentXp(), 10); +cmpTimer.OnUpdate({ "turnLength": 2 }); +TS_ASSERT_EQUALS(cmpPromotion.GetCurrentXp(), 30); + +// Test promoted due to trickle. +cmpTimer.OnUpdate({ "turnLength": 8 }); +TS_ASSERT_EQUALS(cmpPromotion.GetCurrentXp(), 10); +TS_ASSERT_EQUALS(cmpPromotion.entity, 61); + +// Test valuemodification applies. +modif = 10; +cmpPromotion.OnValueModification({ "component": "Promotion" }); +cmpTimer.OnUpdate({ "turnLength": 4 }); +TS_ASSERT_EQUALS(cmpPromotion.GetCurrentXp(), 90); +modif = 0;