From 94819f6c52b7b26682a296af1605e399947a4aa0 Mon Sep 17 00:00:00 2001 From: mcagnion Date: Wed, 3 Jun 2026 15:47:06 +0000 Subject: [PATCH 1/6] Apply changes from https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9486 --- spec/System/TestAilments_spec.lua.rej | 19 + spec/System/TestDefence_spec.lua.rej | 70 ++++ spec/System/TestImportReimport_spec.lua | 226 +++++++++++ spec/System/TestItemMods_spec.lua | 2 +- spec/System/TestItemMods_spec.lua.rej | 91 +++++ spec/System/TestSkills_spec.lua.rej | 54 +++ spec/System/TestTriggers_spec.lua.rej | 498 ++++++++++++++++++++++++ src/Classes/ImportTab.lua | 23 ++ src/Classes/ImportTab.lua.rej | 23 ++ src/Classes/SkillsTab.lua.rej | 19 + 10 files changed, 1024 insertions(+), 1 deletion(-) create mode 100644 spec/System/TestAilments_spec.lua.rej create mode 100644 spec/System/TestDefence_spec.lua.rej create mode 100644 spec/System/TestImportReimport_spec.lua create mode 100644 spec/System/TestItemMods_spec.lua.rej create mode 100644 spec/System/TestSkills_spec.lua.rej create mode 100644 spec/System/TestTriggers_spec.lua.rej create mode 100644 src/Classes/ImportTab.lua.rej create mode 100644 src/Classes/SkillsTab.lua.rej diff --git a/spec/System/TestAilments_spec.lua.rej b/spec/System/TestAilments_spec.lua.rej new file mode 100644 index 0000000000..e8d203259c --- /dev/null +++ b/spec/System/TestAilments_spec.lua.rej @@ -0,0 +1,19 @@ +diff a/spec/System/TestAilments_spec.lua b/spec/System/TestAilments_spec.lua (rejected hunks) +@@ -9,7 +9,7 @@ describe("TestAilments", function() + + it("maximum shock value", function() + -- Shock Nova +- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nShock Nova 4/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nShock Nova 4/0 1\n") + runCallback("OnFrame") + assert.are.equals(round(50 + 10), build.calcsTab.mainOutput.MaximumShock) + +@@ -23,7 +23,7 @@ describe("TestAilments", function() + it("bleed is buffed by bleed chance", function() + build.itemsTab:CreateDisplayItemFromRaw("New Item\nKarui Chopper") + build.itemsTab:AddDisplayItem() +- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nHeavy Strike 1/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nHeavy Strike 1/0 1\n") + build.configTab.input.customMods = "\z + attacks have 10% chance to cause bleeding\n\z + " diff --git a/spec/System/TestDefence_spec.lua.rej b/spec/System/TestDefence_spec.lua.rej new file mode 100644 index 0000000000..70f4617dd6 --- /dev/null +++ b/spec/System/TestDefence_spec.lua.rej @@ -0,0 +1,70 @@ +diff a/spec/System/TestDefence_spec.lua b/spec/System/TestDefence_spec.lua (rejected hunks) +@@ -132,8 +132,8 @@ describe("TestDefence", function() + build.configTab.input.enemyIsBoss = "None" + -- Petrified blood + build.skillsTab:PasteSocketGroup("\z +- Petrified Blood 20/0 Default 1\n\z +- Arrogance 21/0 Default 1\n\z ++ Petrified Blood 20/0 1\n\z ++ Arrogance 21/0 1\n\z + ") -- 50% petrified effect, when exactly half of the life is reserved, should make the life pool be equivalent to no petrified effect and full life. + build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) + build.configTab.input.customMods = "\z +@@ -155,8 +155,8 @@ describe("TestDefence", function() + build.skillsTab.socketGroupList = {} + + build.skillsTab:PasteSocketGroup("\z +- Petrified Blood 20/0 Default 1\n\z +- Arrogance 21/0 Default 1\n\z ++ Petrified Blood 20/0 1\n\z ++ Arrogance 21/0 1\n\z + ") + build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) + build.configTab.input.customMods = "\z +@@ -180,7 +180,7 @@ describe("TestDefence", function() + build.skillsTab.socketGroupList = {} + + build.skillsTab:PasteSocketGroup("\z +- Petrified Blood 20/0 Default 1\n\z ++ Petrified Blood 20/0 1\n\z + ") -- 80% petrified effect, starting from full life, should make the life pool be equivalent to 0.5 * life (unprotected upper half) and then 5 * 0.5 * life (protected lower half), making it 3* bigger in total + build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) + build.configTab.input.customMods = "\z +@@ -238,8 +238,8 @@ describe("TestDefence", function() + + -- Progenesis + petrified blood + build.skillsTab:PasteSocketGroup("\z +- Petrified Blood 20/0 Default 1\n\z +- Arrogance 21/0 Default 1\n\z ++ Petrified Blood 20/0 1\n\z ++ Arrogance 21/0 1\n\z + ") + build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) + build.configTab.input.customMods = "\z +@@ -263,7 +263,7 @@ describe("TestDefence", function() + build.skillsTab.socketGroupList = {} + + build.skillsTab:PasteSocketGroup("\z +- Petrified Blood 20/0 Default 1\n\z ++ Petrified Blood 20/0 1\n\z + ") + build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) + build.configTab.input.customMods = "\z +@@ -286,7 +286,7 @@ describe("TestDefence", function() + build.skillsTab.socketGroupList = {} + + build.skillsTab:PasteSocketGroup("\z +- Petrified Blood 20/0 Default 1\n\z ++ Petrified Blood 20/0 1\n\z + ") + build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) + build.configTab.input.customMods = "\z +@@ -315,7 +315,7 @@ describe("TestDefence", function() + assert.are.equals(20, poolsRemaining.LifeBelowHalfLossLostOverTime) + + build.skillsTab:PasteSocketGroup("\z +- Petrified Blood 20/0 Default 1\n\z ++ Petrified Blood 20/0 1\n\z + ") + build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) + build.configTab.input.customMods = "\z diff --git a/spec/System/TestImportReimport_spec.lua b/spec/System/TestImportReimport_spec.lua new file mode 100644 index 0000000000..24663900d5 --- /dev/null +++ b/spec/System/TestImportReimport_spec.lua @@ -0,0 +1,226 @@ +describe("TestImportReimport", function() + local dkjson = require "dkjson" + local DEFAULT_CHARACTER_LEVEL = 12 + local DEFAULT_ITEM_LEVEL = 10 + local TEST_IMPORT_ITEM_ID = "test-import-item-1" + local DEFAULT_SOCKET_COLOR = "R" + + before_each(function() + newBuild() + end) + + local function makeGemProperties(level) + return { + { name = "Level", values = { { tostring(level), 0 } } }, + { name = "Quality", values = { { "+0%", 0 } } }, + } + end + + local function makeSocketedGemEntry(socket, support, typeLine, level) + return { + socket = socket, + support = support, + typeLine = typeLine, + properties = makeGemProperties(level), + } + end + + -- Build a minimal import item so the tests stay focused on state, not fixture noise. + local function makeImportItem(itemTypeLine, inventoryId, socketedItems, itemId) + local maxSocketIndex = 0 + for _, socketedItem in ipairs(socketedItems) do + maxSocketIndex = math.max(maxSocketIndex, socketedItem.socket + 1) + end + local sockets = {} + for index = 1, maxSocketIndex do + sockets[index] = { group = 0, sColour = DEFAULT_SOCKET_COLOR } + end + return { + id = itemId or TEST_IMPORT_ITEM_ID, + frameType = 0, + name = "", + typeLine = itemTypeLine, + inventoryId = inventoryId, + ilvl = DEFAULT_ITEM_LEVEL, + properties = {}, + sockets = sockets, + socketedItems = socketedItems, + } + end + + -- Build a minimal import payload so the tests stay focused on state, not fixture noise. + local function buildImportPayload(items) + return dkjson.encode({ + character = { level = DEFAULT_CHARACTER_LEVEL }, + items = items, + }) + end + + local function reimportSocketedItemsWithOptions(itemTypeLine, inventoryId, socketedItems, clearItems) + build.importTab.controls.charImportItemsClearSkills.state = true + build.importTab.controls.charImportItemsClearItems.state = clearItems + build.importTab:ImportItemsAndSkills(buildImportPayload({ + makeImportItem(itemTypeLine, inventoryId, socketedItems), + })) + runCallback("OnFrame") + end + + local function reimportSingleSocketedGemWithOptions(itemTypeLine, inventoryId, gemName, clearItems) + reimportSocketedItemsWithOptions(itemTypeLine, inventoryId, { + makeSocketedGemEntry(0, false, gemName, 20), + }, clearItems) + end + + local function reimportSingleSocketedGem(itemTypeLine, inventoryId, gemName) + reimportSingleSocketedGemWithOptions(itemTypeLine, inventoryId, gemName, false) + end + + local function assertReimportPreservesSkillSubstate(slotName, itemTypeLine, inventoryId, gemName, fieldName, fieldValue) + build.skillsTab:PasteSocketGroup(string.format([[ +Slot: %s +%s 20/0 1 +]], slotName, gemName)) + runCallback("OnFrame") + + local socketGroup = build.skillsTab.socketGroupList[1] + local srcInstance = socketGroup.displaySkillList[1].activeEffect.srcInstance + srcInstance[fieldName] = fieldValue + srcInstance[fieldName.."Calcs"] = fieldValue + build.modFlag = true + build.buildFlag = true + runCallback("OnFrame") + + reimportSingleSocketedGem(itemTypeLine, inventoryId, gemName) + + socketGroup = build.skillsTab.socketGroupList[1] + srcInstance = socketGroup.displaySkillList[1].activeEffect.srcInstance + assert.are.equal(fieldValue, srcInstance[fieldName]) + assert.are.equal(fieldValue, srcInstance[fieldName.."Calcs"]) + end + + it("preserves full DPS state and manually disabled gems when reimporting items and skills", function() + build.skillsTab:PasteSocketGroup([[ +Slot: Helmet +Cleave 1/0 1 +Heavy Strike 1/0 1 +Added Fire Damage 1/0 DISABLED 1 +]]) + runCallback("OnFrame") + + local socketGroup = build.skillsTab.socketGroupList[1] + socketGroup.includeInFullDPS = true + socketGroup.mainActiveSkill = 2 + runCallback("OnFrame") + + build.importTab.controls.charImportItemsClearSkills.state = true + build.importTab.controls.charImportItemsClearItems.state = false + build.importTab:ImportItemsAndSkills(buildImportPayload({ + makeImportItem("Iron Hat", "Helm", { + makeSocketedGemEntry(0, false, "Cleave", 1), + makeSocketedGemEntry(1, false, "Heavy Strike", 1), + makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), + }), + })) + runCallback("OnFrame") + + socketGroup = build.skillsTab.socketGroupList[1] + assert.are.equal("Helmet", socketGroup.slot) + assert.is_true(socketGroup.includeInFullDPS) + assert.are.equal(2, socketGroup.mainActiveSkill) + assert.are.equal(2, socketGroup.gemList[3].level) + assert.is_false(socketGroup.gemList[3].enabled) + end) + + it("preserves full DPS state and disabled gems when reimporting with deleted equipment", function() + build.skillsTab:PasteSocketGroup([[ +Slot: Helmet +Cleave 1/0 1 +Heavy Strike 1/0 1 +Added Fire Damage 1/0 DISABLED 1 +]]) + runCallback("OnFrame") + + local socketGroup = build.skillsTab.socketGroupList[1] + socketGroup.includeInFullDPS = true + socketGroup.mainActiveSkill = 2 + runCallback("OnFrame") + + reimportSocketedItemsWithOptions("Iron Hat", "Helm", { + makeSocketedGemEntry(0, false, "Cleave", 1), + makeSocketedGemEntry(1, false, "Heavy Strike", 1), + makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), + }, true) + + socketGroup = build.skillsTab.socketGroupList[1] + assert.are.equal("Helmet", socketGroup.slot) + assert.is_true(socketGroup.includeInFullDPS) + assert.are.equal(2, socketGroup.mainActiveSkill) + assert.are.equal(2, socketGroup.gemList[3].level) + assert.is_false(socketGroup.gemList[3].enabled) + end) + + it("preserves two socket groups when reimporting items and skills", function() + build.skillsTab:PasteSocketGroup([[ +Slot: Helmet +Cleave 1/0 1 +Heavy Strike 1/0 1 +Added Fire Damage 1/0 DISABLED 1 +]]) + runCallback("OnFrame") + + build.skillsTab:PasteSocketGroup([[ +Slot: Gloves +Blight 20/0 1 +]]) + runCallback("OnFrame") + + local helmetGroup = build.skillsTab.socketGroupList[1] + helmetGroup.includeInFullDPS = true + helmetGroup.mainActiveSkill = 2 + local glovesGroup = build.skillsTab.socketGroupList[2] + glovesGroup.enabled = false + runCallback("OnFrame") + + build.importTab.controls.charImportItemsClearSkills.state = true + build.importTab.controls.charImportItemsClearItems.state = false + build.importTab:ImportItemsAndSkills(buildImportPayload({ + makeImportItem("Iron Hat", "Helm", { + makeSocketedGemEntry(0, false, "Cleave", 1), + makeSocketedGemEntry(1, false, "Heavy Strike", 1), + makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), + }, "test-import-item-helmet"), + makeImportItem("Rawhide Gloves", "Gloves", { + makeSocketedGemEntry(0, false, "Blight", 20), + }, "test-import-item-gloves"), + })) + runCallback("OnFrame") + + local groupsBySlot = {} + for _, socketGroup in ipairs(build.skillsTab.socketGroupList) do + groupsBySlot[socketGroup.slot] = socketGroup + end + + assert.are.equal(2, #build.skillsTab.socketGroupList) + assert.is_not_nil(groupsBySlot.Helmet) + assert.is_not_nil(groupsBySlot.Gloves) + assert.is_true(groupsBySlot.Helmet.includeInFullDPS) + assert.are.equal(2, groupsBySlot.Helmet.mainActiveSkill) + assert.is_false(groupsBySlot.Gloves.enabled) + end) + + it("preserves skill part selection when reimporting items and skills", function() + assertReimportPreservesSkillSubstate("Helmet", "Iron Hat", "Helm", "Blight", "skillPart", 2) + end) + + it("preserves stage count when reimporting items and skills", function() + assertReimportPreservesSkillSubstate("Weapon 1", "Driftwood Wand", "Weapon", "Scorching Ray", "skillStageCount", 8) + end) + + it("preserves mine count when reimporting items and skills", function() + assertReimportPreservesSkillSubstate("Gloves", "Rawhide Gloves", "Gloves", "Pyroclast Mine", "skillMineCount", 12) + end) + + it("preserves minion skill when reimporting items and skills", function() + assertReimportPreservesSkillSubstate("Gloves", "Rawhide Gloves", "Gloves", "Summon Chaos Golem", "skillMinionSkill", 3) + end) +end) diff --git a/spec/System/TestItemMods_spec.lua b/spec/System/TestItemMods_spec.lua index e29122b662..cc435f3b7c 100644 --- a/spec/System/TestItemMods_spec.lua +++ b/spec/System/TestItemMods_spec.lua @@ -246,7 +246,7 @@ describe("TetsItemMods", function() {range:1}(15-20)% increased Cold Damage per 1% Missing Cold Resistance, up to a maximum of 300% {range:1}(15-20)% increased Fire Damage per 1% Missing Fire Resistance, up to a maximum of 300%]]) build.itemsTab:AddDisplayItem() - build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nFireball 20/0 Default 1\n") + build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nFireball 20/0 1\n") runCallback("OnFrame") assert.are_not.equals(340, build.calcsTab.mainEnv.modDB:Sum("INC", "FireDamage")) diff --git a/spec/System/TestItemMods_spec.lua.rej b/spec/System/TestItemMods_spec.lua.rej new file mode 100644 index 0000000000..d6dad117cf --- /dev/null +++ b/spec/System/TestItemMods_spec.lua.rej @@ -0,0 +1,91 @@ +diff a/spec/System/TestItemMods_spec.lua b/spec/System/TestItemMods_spec.lua (rejected hunks) +@@ -8,7 +8,7 @@ describe("TetsItemMods", function() + end) + + it("Dialla's socket mods", function() +- build.skillsTab:PasteSocketGroup("Slot: Body Armour\nArc 20/0 Default 1\nArc 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Body Armour\nArc 20/0 1\nArc 20/0 1\n") + runCallback("OnFrame") + + build.itemsTab:CreateDisplayItemFromRaw([[Dialla's Malefaction +@@ -61,7 +61,7 @@ describe("TetsItemMods", function() + + local lightningResBefore = build.calcsTab.mainOutput.LightningResist + +- build.skillsTab:PasteSocketGroup("Slot: Ring 1\nWrath 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Ring 1\nWrath 20/0 1\n") + runCallback("OnFrame") + + assert.are_not.equals(lightningResBefore, build.calcsTab.mainOutput.LightningResist) +@@ -96,7 +96,7 @@ describe("TetsItemMods", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nSmite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nSmite 20/0 1\n") + runCallback("OnFrame") + + assert.is_true(build.calcsTab.mainEnv.keystonesAdded["Vaal Pact"]) +@@ -124,7 +124,7 @@ describe("TetsItemMods", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\nNightblade 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\nNightblade 20/0 1\n") + runCallback("OnFrame") + local nonElusiveCritMult = build.calcsTab.mainOutput.CritMultiplier + +@@ -160,7 +160,7 @@ describe("TetsItemMods", function() + build.configTab:BuildModList() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Cyclone 20/0 Default 1\nClose Combat 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Cyclone 20/0 1\nClose Combat 20/0 1\n") + runCallback("OnFrame") + + local farDPS = build.calcsTab.mainOutput.TotalDPS +@@ -200,7 +200,7 @@ describe("TetsItemMods", function() + + it("Kalandra's Touch influence copy", function() + +- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nSmite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nSmite 20/0 1\n") + runCallback("OnFrame") + + local dmg = build.calcsTab.mainOutput.AverageDamage +@@ -547,7 +547,7 @@ describe("TetsItemMods", function() + Armour: 32 + ]]) + build.itemsTab:AddDisplayItem() +- build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1") ++ build.skillsTab:PasteSocketGroup("Arc 20/0 1") + + assert.are_not.equals(40, build.calcsTab.mainEnv.modDB:Sum("INC", { flags = ModFlag.Cast }, "Speed")) + assert.are_not.equals(64, build.calcsTab.mainOutput.Armour) +@@ -555,7 +555,7 @@ describe("TetsItemMods", function() + end) + + it("Heralds apply exposure with Heraldry", function() +- build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nHerald of Thunder 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Arc 20/0 1\nHerald of Thunder 20/0 1\n") + runCallback("OnFrame") + + assert.are.equals(0.5, build.calcsTab.calcsOutput.LightningEffMult) +@@ -572,7 +572,7 @@ describe("TetsItemMods", function() + end) + + it("Enemy self curse effect", function() +- build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nConductivity 14/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Arc 20/0 1\nConductivity 14/0 1\n") + runCallback("OnFrame") + + assert.are.equals(0.8, build.calcsTab.calcsOutput.LightningEffMult) +@@ -587,7 +587,7 @@ describe("TetsItemMods", function() + end) + + it("Max charges with conditional mod", function() -- see #9442 +- build.skillsTab:PasteSocketGroup("Grace 20/20 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Grace 20/20 1\n") + runCallback("OnFrame") + + local baseFrenzyChargesMax = build.calcsTab.calcsOutput.FrenzyChargesMax diff --git a/spec/System/TestSkills_spec.lua.rej b/spec/System/TestSkills_spec.lua.rej new file mode 100644 index 0000000000..dfb3c139e0 --- /dev/null +++ b/spec/System/TestSkills_spec.lua.rej @@ -0,0 +1,54 @@ +diff a/spec/System/TestSkills_spec.lua b/spec/System/TestSkills_spec.lua (rejected hunks) +@@ -13,11 +13,11 @@ describe("TestAttacks", function() + runCallback("OnFrame") + assert.are.equals(205, build.calcsTab.mainEnv.minion.modDB:Sum("BASE", build.calcsTab.mainEnv.minion.mainSkill.skillCfg, "ChaosMin")) + +- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nAwakened Generosity 4/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nAwakened Generosity 4/0 1\n") + runCallback("OnFrame") + assert.are.equals(round(205 * 1.43), build.calcsTab.mainEnv.minion.modDB:Sum("BASE", build.calcsTab.mainEnv.minion.mainSkill.skillCfg, "ChaosMin")) + +- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nAwakened Generosity 5/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nAwakened Generosity 5/0 1\n") + runCallback("OnFrame") + -- No Envy level increase, so base should still be 205 + assert.are.equals(round(205 * 1.44), build.calcsTab.mainEnv.minion.modDB:Sum("BASE", build.calcsTab.mainEnv.minion.mainSkill.skillCfg, "ChaosMin")) +@@ -43,10 +43,10 @@ describe("TestAttacks", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Mirage Archer 20/0 Default 1\nRain of Arrows 20/0 Default 1\nManaforged Arrows 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Mirage Archer 20/0 1\nRain of Arrows 20/0 1\nManaforged Arrows 20/0 1\n") + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Toxic Rain 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Toxic Rain 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.MirageDPS ~= nil) +@@ -71,14 +71,14 @@ describe("TestAttacks", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Power Siphon 20/0 Default 1\nSacred Wisps 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Power Siphon 20/0 1\nSacred Wisps 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.MirageDPS ~= nil) + end) + + it("Test Scorching ray applying exposure at max stages", function() +- build.skillsTab:PasteSocketGroup("Scorching Ray 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Scorching Ray 20/0 1\n") + runCallback("OnFrame") + + local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] +@@ -101,7 +101,7 @@ describe("TestAttacks", function() + end) + + it("Test Adrenaline affecting blight max stage count", function() +- build.skillsTab:PasteSocketGroup("Blight 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Blight 20/0 1\n") + runCallback("OnFrame") + + local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] diff --git a/spec/System/TestTriggers_spec.lua.rej b/spec/System/TestTriggers_spec.lua.rej new file mode 100644 index 0000000000..c52809aade --- /dev/null +++ b/spec/System/TestTriggers_spec.lua.rej @@ -0,0 +1,498 @@ +diff a/spec/System/TestTriggers_spec.lua b/spec/System/TestTriggers_spec.lua (rejected hunks) +@@ -28,7 +28,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Reave 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Reave 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -56,7 +56,7 @@ describe("TestTriggers", function() + build.mainSocketGroup = 2 + build.modFlag = true + build.buildFlag = true +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -84,7 +84,7 @@ describe("TestTriggers", function() + build.mainSocketGroup = 2 + build.modFlag = true + build.buildFlag = true +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -197,7 +197,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -248,7 +248,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -294,7 +294,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -322,7 +322,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -348,7 +348,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -371,7 +371,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -398,7 +398,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -421,7 +421,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -449,7 +449,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -485,7 +485,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -507,7 +507,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Reave 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Reave 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -535,7 +535,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -557,7 +557,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -579,7 +579,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -600,10 +600,10 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 1\n") + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -643,10 +643,10 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nRain of Arrows 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nRain of Arrows 20/0 1\n") + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -687,10 +687,10 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nRain of Arrows 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nRain of Arrows 20/0 1\n") + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Arc 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -740,10 +740,10 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 1\n") + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -766,10 +766,10 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Slot: Gloves\nEnfeeble 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Gloves\nEnfeeble 20/0 1\n") + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Despair 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Despair 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -820,10 +820,10 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 1\n") + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Reave 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Reave 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -872,10 +872,10 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 1\n") + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Ice Nova 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Ice Nova 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -909,10 +909,10 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 1\n") + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -940,10 +940,10 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nIce Nova 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nIce Nova 20/0 1\n") + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Reave 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Reave 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -971,7 +971,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 Default 1\nArc 20/0 Default 1\nCyclone 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 1\nArc 20/0 1\nCyclone 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -999,7 +999,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Cast on Melee Kill 20/0 Default 1\nArc 20/0 Default 1\nCyclone 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Cast on Melee Kill 20/0 1\nArc 20/0 1\nCyclone 20/0 1\n") + runCallback("OnFrame") + + build.configTab.input["conditionKilledRecently"] = true +@@ -1010,24 +1010,24 @@ describe("TestTriggers", function() + end) + + it("Trigger Holy Relic", function() +- build.skillsTab:PasteSocketGroup("Summon Holy Relic 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Summon Holy Relic 20/0 1\n") + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.Minion.SkillTriggerRate ~= nil) + end) + + it("Trigger Cast when Damage Taken", function() +- build.skillsTab:PasteSocketGroup("Cast when Damage Taken 20/0 Default 1\nArc 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Cast when Damage Taken 20/0 1\nArc 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) + end) + + it("Trigger Cast when Stunned", function() +- build.skillsTab:PasteSocketGroup("Cast when Stunned 20/0 Default 1\nArc 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Cast when Stunned 20/0 1\nArc 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -1055,27 +1055,27 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nSpellslinger 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Arc 20/0 1\nSpellslinger 20/0 1\n") + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) + end) + + it("Trigger Mark On Hit", function() +- build.skillsTab:PasteSocketGroup("Mark On Hit 20/0 Default 1\nAlchemist's Mark 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Mark On Hit 20/0 1\nAlchemist's Mark 20/0 1\n") + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) + end) + + it("Trigger Hextouch", function() +- build.skillsTab:PasteSocketGroup("Despair 20/0 Default 1\nHextouch 20/0 Default 1\nSmite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Despair 20/0 1\nHextouch 20/0 1\nSmite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -1103,7 +1103,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -1132,7 +1132,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Tempest Shield 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Tempest Shield 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -1161,7 +1161,7 @@ describe("TestTriggers", function() + end) + + it("Trigger Combust", function() +- build.skillsTab:PasteSocketGroup("Infernal Cry 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Infernal Cry 20/0 1\n") + runCallback("OnFrame") + + local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] +@@ -1170,14 +1170,14 @@ describe("TestTriggers", function() + build.buildFlag = true + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) + end) + + it("Trigger Prismatic Burst", function() +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\nPrismatic Burst 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\nPrismatic Burst 20/0 1\n") + runCallback("OnFrame") + + local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] +@@ -1211,7 +1211,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\nShockwave 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\nShockwave 20/0 1\n") + runCallback("OnFrame") + + local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] +@@ -1243,24 +1243,24 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\nManaforged Arrows 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\nManaforged Arrows 20/0 1\n") + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Rain of Arrows 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Rain of Arrows 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) + end) + + it("Trigger Doom Blast", function() +- build.skillsTab:PasteSocketGroup("Impending Doom 20/0 Default 1\nDespair 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Impending Doom 20/0 1\nDespair 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) + end) + + it("Trigger Cast while Channelling", function() +- build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nCast while Channelling 20/0 Default 1\nBlight 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Arc 20/0 1\nCast while Channelling 20/0 1\nBlight 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -1285,14 +1285,14 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) + end) + + it("Trigger Flamewood", function() +- build.skillsTab:PasteSocketGroup("Decoy Totem 20/0 Default 1\nFlamewood 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Decoy Totem 20/0 1\nFlamewood 20/0 1\n") + runCallback("OnFrame") + + local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] +@@ -1305,7 +1305,7 @@ describe("TestTriggers", function() + end) + + it("Trigger Automation", function() +- build.skillsTab:PasteSocketGroup("Steelskin 20/0 Default 1\nAutomation 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Steelskin 20/0 1\nAutomation 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -1334,7 +1334,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nArc 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nArc 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -1351,17 +1351,17 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nFireball 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nFireball 20/0 1\n") + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") + runCallback("OnFrame") + + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) + end) + + it("Triggerbots CWCHandler", function() +- build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nCast while Channelling 20/0 Default 1\nBlight 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Arc 20/0 1\nCast while Channelling 20/0 1\nBlight 20/0 1\n") + runCallback("OnFrame") + local baseRate = build.calcsTab.mainOutput.SkillTriggerRate + assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) +@@ -1396,7 +1396,7 @@ describe("TestTriggers", function() + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + +- build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 Default 1\nArc 20/0 Default 1\nCyclone 20/0 Default 1\n") ++ build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 1\nArc 20/0 1\nCyclone 20/0 1\n") + runCallback("OnFrame") + + local baseRate = build.calcsTab.mainOutput.SkillTriggerRate diff --git a/src/Classes/ImportTab.lua b/src/Classes/ImportTab.lua index b94cc52731..56c287a081 100644 --- a/src/Classes/ImportTab.lua +++ b/src/Classes/ImportTab.lua @@ -827,8 +827,10 @@ function ImportTabClass:ImportItemsAndSkills(charData) local mainSkillEmpty = #self.build.skillsTab.socketGroupList == 0 local skillOrder + local preservedSocketGroupStateByKey if self.controls.charImportItemsClearSkills.state then skillOrder = { } + preservedSocketGroupStateByKey = { } for _, socketGroup in ipairs(self.build.skillsTab.socketGroupList) do for _, gem in ipairs(socketGroup.gemList) do if gem.grantedEffect and not gem.grantedEffect.support then @@ -836,6 +838,11 @@ function ImportTabClass:ImportItemsAndSkills(charData) end end end + for index, socketGroup in ipairs(self.build.skillsTab.socketGroupList) do + local key = getSocketGroupReimportKey(socketGroup) + preservedSocketGroupStateByKey[key] = preservedSocketGroupStateByKey[key] or { } + t_insert(preservedSocketGroupStateByKey[key], snapshotSocketGroupReimportState(socketGroup, index == self.build.mainSocketGroup)) + end wipeTable(self.build.skillsTab.socketGroupList) end self.charImportStatus = colorCodes.POSITIVE.."Items and skills successfully imported." @@ -1010,6 +1017,22 @@ function ImportTabClass:ImportItemsAndSkills(charData) end end) end + if preservedSocketGroupStateByKey then + local restoredMainSocketGroup + for index, socketGroup in ipairs(self.build.skillsTab.socketGroupList) do + local stateList = preservedSocketGroupStateByKey[getSocketGroupReimportKey(socketGroup)] + if stateList and stateList[1] then + local state = t_remove(stateList, 1) + applySocketGroupReimportState(socketGroup, state) + if state.isMainGroup then + restoredMainSocketGroup = index + end + end + end + if restoredMainSocketGroup then + self.build.mainSocketGroup = restoredMainSocketGroup + end + end if mainSkillEmpty then self.build.mainSocketGroup = self:GuessMainSocketGroup() end diff --git a/src/Classes/ImportTab.lua.rej b/src/Classes/ImportTab.lua.rej new file mode 100644 index 0000000000..209e400954 --- /dev/null +++ b/src/Classes/ImportTab.lua.rej @@ -0,0 +1,23 @@ +diff a/src/Classes/ImportTab.lua b/src/Classes/ImportTab.lua (rejected hunks) +@@ -756,6 +756,10 @@ local function snapshotSocketGroupReimportState(socketGroup, isMainGroup) + skillStageCountCalcs = gem.skillStageCountCalcs, + skillMineCount = gem.skillMineCount, + skillMineCountCalcs = gem.skillMineCountCalcs, ++ skillMinionSkill = gem.skillMinionSkill, ++ skillMinionSkillCalcs = gem.skillMinionSkillCalcs, ++ enableGlobal1 = gem.enableGlobal1, ++ enableGlobal2 = gem.enableGlobal2, + } + end + return { +@@ -778,6 +782,10 @@ local function applyGemReimportState(gem, state) + gem.skillStageCountCalcs = state.skillStageCountCalcs + gem.skillMineCount = state.skillMineCount + gem.skillMineCountCalcs = state.skillMineCountCalcs ++ gem.skillMinionSkill = state.skillMinionSkill ++ gem.skillMinionSkillCalcs = state.skillMinionSkillCalcs ++ gem.enableGlobal1 = state.enableGlobal1 ++ gem.enableGlobal2 = state.enableGlobal2 + end + + local function applySocketGroupReimportState(socketGroup, state) diff --git a/src/Classes/SkillsTab.lua.rej b/src/Classes/SkillsTab.lua.rej new file mode 100644 index 0000000000..3aeab18982 --- /dev/null +++ b/src/Classes/SkillsTab.lua.rej @@ -0,0 +1,19 @@ +diff a/src/Classes/SkillsTab.lua b/src/Classes/SkillsTab.lua (rejected hunks) +@@ -591,7 +591,7 @@ function SkillsTabClass:CopySocketGroup(socketGroup) + skillText = skillText .. "Slot: " .. socketGroup.slot .. "\r\n" + end + for _, gemInstance in ipairs(socketGroup.gemList) do +- skillText = skillText .. string.format("%s %d/%d %s %d\r\n", gemInstance.nameSpec, gemInstance.level, gemInstance.quality, gemInstance.enabled and "ENABLED" or "DISABLED", gemInstance.count or 1) ++ skillText = skillText .. string.format("%s %d/%d %s %d\r\n", gemInstance.nameSpec, gemInstance.level, gemInstance.quality, gemInstance.enabled and "" or "DISABLED", gemInstance.count or 1) + end + Copy(skillText) + end +@@ -608,7 +608,7 @@ function SkillsTabClass:PasteSocketGroup(testInput) + if slot then + newGroup.slot = slot + end +- for nameSpec, level, quality, state, count in skillText:gmatch("([ %a']+) (%d+)/(%d+) (%a+%d?) ?(%a*) (%d+)") do ++ for nameSpec, level, quality, state, count in skillText:gmatch("([ %a']+) (%d+)/(%d+) ?(%a*) (%d+)") do + t_insert(newGroup.gemList, { + nameSpec = nameSpec, + level = tonumber(level) or 20, From 2f0614fcd6d3123822e59b3d82fb576abe699049 Mon Sep 17 00:00:00 2001 From: LocalIdentity Date: Thu, 4 Jun 2026 06:13:37 +1000 Subject: [PATCH 2/6] Fix merge issues --- spec/System/TestAilments_spec.lua.rej | 19 - spec/System/TestDefence_spec.lua.rej | 70 ---- spec/System/TestImportReimport_spec.lua | 226 ----------- spec/System/TestItemMods_spec.lua.rej | 91 ----- spec/System/TestSkills_spec.lua.rej | 54 --- spec/System/TestTriggers_spec.lua.rej | 498 ------------------------ src/Classes/ImportTab.lua | 85 ++++ src/Classes/ImportTab.lua.rej | 23 -- src/Classes/SkillsTab.lua.rej | 19 - 9 files changed, 85 insertions(+), 1000 deletions(-) delete mode 100644 spec/System/TestAilments_spec.lua.rej delete mode 100644 spec/System/TestDefence_spec.lua.rej delete mode 100644 spec/System/TestImportReimport_spec.lua delete mode 100644 spec/System/TestItemMods_spec.lua.rej delete mode 100644 spec/System/TestSkills_spec.lua.rej delete mode 100644 spec/System/TestTriggers_spec.lua.rej delete mode 100644 src/Classes/ImportTab.lua.rej delete mode 100644 src/Classes/SkillsTab.lua.rej diff --git a/spec/System/TestAilments_spec.lua.rej b/spec/System/TestAilments_spec.lua.rej deleted file mode 100644 index e8d203259c..0000000000 --- a/spec/System/TestAilments_spec.lua.rej +++ /dev/null @@ -1,19 +0,0 @@ -diff a/spec/System/TestAilments_spec.lua b/spec/System/TestAilments_spec.lua (rejected hunks) -@@ -9,7 +9,7 @@ describe("TestAilments", function() - - it("maximum shock value", function() - -- Shock Nova -- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nShock Nova 4/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nShock Nova 4/0 1\n") - runCallback("OnFrame") - assert.are.equals(round(50 + 10), build.calcsTab.mainOutput.MaximumShock) - -@@ -23,7 +23,7 @@ describe("TestAilments", function() - it("bleed is buffed by bleed chance", function() - build.itemsTab:CreateDisplayItemFromRaw("New Item\nKarui Chopper") - build.itemsTab:AddDisplayItem() -- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nHeavy Strike 1/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nHeavy Strike 1/0 1\n") - build.configTab.input.customMods = "\z - attacks have 10% chance to cause bleeding\n\z - " diff --git a/spec/System/TestDefence_spec.lua.rej b/spec/System/TestDefence_spec.lua.rej deleted file mode 100644 index 70f4617dd6..0000000000 --- a/spec/System/TestDefence_spec.lua.rej +++ /dev/null @@ -1,70 +0,0 @@ -diff a/spec/System/TestDefence_spec.lua b/spec/System/TestDefence_spec.lua (rejected hunks) -@@ -132,8 +132,8 @@ describe("TestDefence", function() - build.configTab.input.enemyIsBoss = "None" - -- Petrified blood - build.skillsTab:PasteSocketGroup("\z -- Petrified Blood 20/0 Default 1\n\z -- Arrogance 21/0 Default 1\n\z -+ Petrified Blood 20/0 1\n\z -+ Arrogance 21/0 1\n\z - ") -- 50% petrified effect, when exactly half of the life is reserved, should make the life pool be equivalent to no petrified effect and full life. - build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) - build.configTab.input.customMods = "\z -@@ -155,8 +155,8 @@ describe("TestDefence", function() - build.skillsTab.socketGroupList = {} - - build.skillsTab:PasteSocketGroup("\z -- Petrified Blood 20/0 Default 1\n\z -- Arrogance 21/0 Default 1\n\z -+ Petrified Blood 20/0 1\n\z -+ Arrogance 21/0 1\n\z - ") - build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) - build.configTab.input.customMods = "\z -@@ -180,7 +180,7 @@ describe("TestDefence", function() - build.skillsTab.socketGroupList = {} - - build.skillsTab:PasteSocketGroup("\z -- Petrified Blood 20/0 Default 1\n\z -+ Petrified Blood 20/0 1\n\z - ") -- 80% petrified effect, starting from full life, should make the life pool be equivalent to 0.5 * life (unprotected upper half) and then 5 * 0.5 * life (protected lower half), making it 3* bigger in total - build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) - build.configTab.input.customMods = "\z -@@ -238,8 +238,8 @@ describe("TestDefence", function() - - -- Progenesis + petrified blood - build.skillsTab:PasteSocketGroup("\z -- Petrified Blood 20/0 Default 1\n\z -- Arrogance 21/0 Default 1\n\z -+ Petrified Blood 20/0 1\n\z -+ Arrogance 21/0 1\n\z - ") - build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) - build.configTab.input.customMods = "\z -@@ -263,7 +263,7 @@ describe("TestDefence", function() - build.skillsTab.socketGroupList = {} - - build.skillsTab:PasteSocketGroup("\z -- Petrified Blood 20/0 Default 1\n\z -+ Petrified Blood 20/0 1\n\z - ") - build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) - build.configTab.input.customMods = "\z -@@ -286,7 +286,7 @@ describe("TestDefence", function() - build.skillsTab.socketGroupList = {} - - build.skillsTab:PasteSocketGroup("\z -- Petrified Blood 20/0 Default 1\n\z -+ Petrified Blood 20/0 1\n\z - ") - build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) - build.configTab.input.customMods = "\z -@@ -315,7 +315,7 @@ describe("TestDefence", function() - assert.are.equals(20, poolsRemaining.LifeBelowHalfLossLostOverTime) - - build.skillsTab:PasteSocketGroup("\z -- Petrified Blood 20/0 Default 1\n\z -+ Petrified Blood 20/0 1\n\z - ") - build.skillsTab:ProcessSocketGroup(build.skillsTab.socketGroupList[1]) - build.configTab.input.customMods = "\z diff --git a/spec/System/TestImportReimport_spec.lua b/spec/System/TestImportReimport_spec.lua deleted file mode 100644 index 24663900d5..0000000000 --- a/spec/System/TestImportReimport_spec.lua +++ /dev/null @@ -1,226 +0,0 @@ -describe("TestImportReimport", function() - local dkjson = require "dkjson" - local DEFAULT_CHARACTER_LEVEL = 12 - local DEFAULT_ITEM_LEVEL = 10 - local TEST_IMPORT_ITEM_ID = "test-import-item-1" - local DEFAULT_SOCKET_COLOR = "R" - - before_each(function() - newBuild() - end) - - local function makeGemProperties(level) - return { - { name = "Level", values = { { tostring(level), 0 } } }, - { name = "Quality", values = { { "+0%", 0 } } }, - } - end - - local function makeSocketedGemEntry(socket, support, typeLine, level) - return { - socket = socket, - support = support, - typeLine = typeLine, - properties = makeGemProperties(level), - } - end - - -- Build a minimal import item so the tests stay focused on state, not fixture noise. - local function makeImportItem(itemTypeLine, inventoryId, socketedItems, itemId) - local maxSocketIndex = 0 - for _, socketedItem in ipairs(socketedItems) do - maxSocketIndex = math.max(maxSocketIndex, socketedItem.socket + 1) - end - local sockets = {} - for index = 1, maxSocketIndex do - sockets[index] = { group = 0, sColour = DEFAULT_SOCKET_COLOR } - end - return { - id = itemId or TEST_IMPORT_ITEM_ID, - frameType = 0, - name = "", - typeLine = itemTypeLine, - inventoryId = inventoryId, - ilvl = DEFAULT_ITEM_LEVEL, - properties = {}, - sockets = sockets, - socketedItems = socketedItems, - } - end - - -- Build a minimal import payload so the tests stay focused on state, not fixture noise. - local function buildImportPayload(items) - return dkjson.encode({ - character = { level = DEFAULT_CHARACTER_LEVEL }, - items = items, - }) - end - - local function reimportSocketedItemsWithOptions(itemTypeLine, inventoryId, socketedItems, clearItems) - build.importTab.controls.charImportItemsClearSkills.state = true - build.importTab.controls.charImportItemsClearItems.state = clearItems - build.importTab:ImportItemsAndSkills(buildImportPayload({ - makeImportItem(itemTypeLine, inventoryId, socketedItems), - })) - runCallback("OnFrame") - end - - local function reimportSingleSocketedGemWithOptions(itemTypeLine, inventoryId, gemName, clearItems) - reimportSocketedItemsWithOptions(itemTypeLine, inventoryId, { - makeSocketedGemEntry(0, false, gemName, 20), - }, clearItems) - end - - local function reimportSingleSocketedGem(itemTypeLine, inventoryId, gemName) - reimportSingleSocketedGemWithOptions(itemTypeLine, inventoryId, gemName, false) - end - - local function assertReimportPreservesSkillSubstate(slotName, itemTypeLine, inventoryId, gemName, fieldName, fieldValue) - build.skillsTab:PasteSocketGroup(string.format([[ -Slot: %s -%s 20/0 1 -]], slotName, gemName)) - runCallback("OnFrame") - - local socketGroup = build.skillsTab.socketGroupList[1] - local srcInstance = socketGroup.displaySkillList[1].activeEffect.srcInstance - srcInstance[fieldName] = fieldValue - srcInstance[fieldName.."Calcs"] = fieldValue - build.modFlag = true - build.buildFlag = true - runCallback("OnFrame") - - reimportSingleSocketedGem(itemTypeLine, inventoryId, gemName) - - socketGroup = build.skillsTab.socketGroupList[1] - srcInstance = socketGroup.displaySkillList[1].activeEffect.srcInstance - assert.are.equal(fieldValue, srcInstance[fieldName]) - assert.are.equal(fieldValue, srcInstance[fieldName.."Calcs"]) - end - - it("preserves full DPS state and manually disabled gems when reimporting items and skills", function() - build.skillsTab:PasteSocketGroup([[ -Slot: Helmet -Cleave 1/0 1 -Heavy Strike 1/0 1 -Added Fire Damage 1/0 DISABLED 1 -]]) - runCallback("OnFrame") - - local socketGroup = build.skillsTab.socketGroupList[1] - socketGroup.includeInFullDPS = true - socketGroup.mainActiveSkill = 2 - runCallback("OnFrame") - - build.importTab.controls.charImportItemsClearSkills.state = true - build.importTab.controls.charImportItemsClearItems.state = false - build.importTab:ImportItemsAndSkills(buildImportPayload({ - makeImportItem("Iron Hat", "Helm", { - makeSocketedGemEntry(0, false, "Cleave", 1), - makeSocketedGemEntry(1, false, "Heavy Strike", 1), - makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), - }), - })) - runCallback("OnFrame") - - socketGroup = build.skillsTab.socketGroupList[1] - assert.are.equal("Helmet", socketGroup.slot) - assert.is_true(socketGroup.includeInFullDPS) - assert.are.equal(2, socketGroup.mainActiveSkill) - assert.are.equal(2, socketGroup.gemList[3].level) - assert.is_false(socketGroup.gemList[3].enabled) - end) - - it("preserves full DPS state and disabled gems when reimporting with deleted equipment", function() - build.skillsTab:PasteSocketGroup([[ -Slot: Helmet -Cleave 1/0 1 -Heavy Strike 1/0 1 -Added Fire Damage 1/0 DISABLED 1 -]]) - runCallback("OnFrame") - - local socketGroup = build.skillsTab.socketGroupList[1] - socketGroup.includeInFullDPS = true - socketGroup.mainActiveSkill = 2 - runCallback("OnFrame") - - reimportSocketedItemsWithOptions("Iron Hat", "Helm", { - makeSocketedGemEntry(0, false, "Cleave", 1), - makeSocketedGemEntry(1, false, "Heavy Strike", 1), - makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), - }, true) - - socketGroup = build.skillsTab.socketGroupList[1] - assert.are.equal("Helmet", socketGroup.slot) - assert.is_true(socketGroup.includeInFullDPS) - assert.are.equal(2, socketGroup.mainActiveSkill) - assert.are.equal(2, socketGroup.gemList[3].level) - assert.is_false(socketGroup.gemList[3].enabled) - end) - - it("preserves two socket groups when reimporting items and skills", function() - build.skillsTab:PasteSocketGroup([[ -Slot: Helmet -Cleave 1/0 1 -Heavy Strike 1/0 1 -Added Fire Damage 1/0 DISABLED 1 -]]) - runCallback("OnFrame") - - build.skillsTab:PasteSocketGroup([[ -Slot: Gloves -Blight 20/0 1 -]]) - runCallback("OnFrame") - - local helmetGroup = build.skillsTab.socketGroupList[1] - helmetGroup.includeInFullDPS = true - helmetGroup.mainActiveSkill = 2 - local glovesGroup = build.skillsTab.socketGroupList[2] - glovesGroup.enabled = false - runCallback("OnFrame") - - build.importTab.controls.charImportItemsClearSkills.state = true - build.importTab.controls.charImportItemsClearItems.state = false - build.importTab:ImportItemsAndSkills(buildImportPayload({ - makeImportItem("Iron Hat", "Helm", { - makeSocketedGemEntry(0, false, "Cleave", 1), - makeSocketedGemEntry(1, false, "Heavy Strike", 1), - makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), - }, "test-import-item-helmet"), - makeImportItem("Rawhide Gloves", "Gloves", { - makeSocketedGemEntry(0, false, "Blight", 20), - }, "test-import-item-gloves"), - })) - runCallback("OnFrame") - - local groupsBySlot = {} - for _, socketGroup in ipairs(build.skillsTab.socketGroupList) do - groupsBySlot[socketGroup.slot] = socketGroup - end - - assert.are.equal(2, #build.skillsTab.socketGroupList) - assert.is_not_nil(groupsBySlot.Helmet) - assert.is_not_nil(groupsBySlot.Gloves) - assert.is_true(groupsBySlot.Helmet.includeInFullDPS) - assert.are.equal(2, groupsBySlot.Helmet.mainActiveSkill) - assert.is_false(groupsBySlot.Gloves.enabled) - end) - - it("preserves skill part selection when reimporting items and skills", function() - assertReimportPreservesSkillSubstate("Helmet", "Iron Hat", "Helm", "Blight", "skillPart", 2) - end) - - it("preserves stage count when reimporting items and skills", function() - assertReimportPreservesSkillSubstate("Weapon 1", "Driftwood Wand", "Weapon", "Scorching Ray", "skillStageCount", 8) - end) - - it("preserves mine count when reimporting items and skills", function() - assertReimportPreservesSkillSubstate("Gloves", "Rawhide Gloves", "Gloves", "Pyroclast Mine", "skillMineCount", 12) - end) - - it("preserves minion skill when reimporting items and skills", function() - assertReimportPreservesSkillSubstate("Gloves", "Rawhide Gloves", "Gloves", "Summon Chaos Golem", "skillMinionSkill", 3) - end) -end) diff --git a/spec/System/TestItemMods_spec.lua.rej b/spec/System/TestItemMods_spec.lua.rej deleted file mode 100644 index d6dad117cf..0000000000 --- a/spec/System/TestItemMods_spec.lua.rej +++ /dev/null @@ -1,91 +0,0 @@ -diff a/spec/System/TestItemMods_spec.lua b/spec/System/TestItemMods_spec.lua (rejected hunks) -@@ -8,7 +8,7 @@ describe("TetsItemMods", function() - end) - - it("Dialla's socket mods", function() -- build.skillsTab:PasteSocketGroup("Slot: Body Armour\nArc 20/0 Default 1\nArc 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Body Armour\nArc 20/0 1\nArc 20/0 1\n") - runCallback("OnFrame") - - build.itemsTab:CreateDisplayItemFromRaw([[Dialla's Malefaction -@@ -61,7 +61,7 @@ describe("TetsItemMods", function() - - local lightningResBefore = build.calcsTab.mainOutput.LightningResist - -- build.skillsTab:PasteSocketGroup("Slot: Ring 1\nWrath 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Ring 1\nWrath 20/0 1\n") - runCallback("OnFrame") - - assert.are_not.equals(lightningResBefore, build.calcsTab.mainOutput.LightningResist) -@@ -96,7 +96,7 @@ describe("TetsItemMods", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nSmite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nSmite 20/0 1\n") - runCallback("OnFrame") - - assert.is_true(build.calcsTab.mainEnv.keystonesAdded["Vaal Pact"]) -@@ -124,7 +124,7 @@ describe("TetsItemMods", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\nNightblade 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\nNightblade 20/0 1\n") - runCallback("OnFrame") - local nonElusiveCritMult = build.calcsTab.mainOutput.CritMultiplier - -@@ -160,7 +160,7 @@ describe("TetsItemMods", function() - build.configTab:BuildModList() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Cyclone 20/0 Default 1\nClose Combat 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Cyclone 20/0 1\nClose Combat 20/0 1\n") - runCallback("OnFrame") - - local farDPS = build.calcsTab.mainOutput.TotalDPS -@@ -200,7 +200,7 @@ describe("TetsItemMods", function() - - it("Kalandra's Touch influence copy", function() - -- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nSmite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nSmite 20/0 1\n") - runCallback("OnFrame") - - local dmg = build.calcsTab.mainOutput.AverageDamage -@@ -547,7 +547,7 @@ describe("TetsItemMods", function() - Armour: 32 - ]]) - build.itemsTab:AddDisplayItem() -- build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1") -+ build.skillsTab:PasteSocketGroup("Arc 20/0 1") - - assert.are_not.equals(40, build.calcsTab.mainEnv.modDB:Sum("INC", { flags = ModFlag.Cast }, "Speed")) - assert.are_not.equals(64, build.calcsTab.mainOutput.Armour) -@@ -555,7 +555,7 @@ describe("TetsItemMods", function() - end) - - it("Heralds apply exposure with Heraldry", function() -- build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nHerald of Thunder 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Arc 20/0 1\nHerald of Thunder 20/0 1\n") - runCallback("OnFrame") - - assert.are.equals(0.5, build.calcsTab.calcsOutput.LightningEffMult) -@@ -572,7 +572,7 @@ describe("TetsItemMods", function() - end) - - it("Enemy self curse effect", function() -- build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nConductivity 14/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Arc 20/0 1\nConductivity 14/0 1\n") - runCallback("OnFrame") - - assert.are.equals(0.8, build.calcsTab.calcsOutput.LightningEffMult) -@@ -587,7 +587,7 @@ describe("TetsItemMods", function() - end) - - it("Max charges with conditional mod", function() -- see #9442 -- build.skillsTab:PasteSocketGroup("Grace 20/20 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Grace 20/20 1\n") - runCallback("OnFrame") - - local baseFrenzyChargesMax = build.calcsTab.calcsOutput.FrenzyChargesMax diff --git a/spec/System/TestSkills_spec.lua.rej b/spec/System/TestSkills_spec.lua.rej deleted file mode 100644 index dfb3c139e0..0000000000 --- a/spec/System/TestSkills_spec.lua.rej +++ /dev/null @@ -1,54 +0,0 @@ -diff a/spec/System/TestSkills_spec.lua b/spec/System/TestSkills_spec.lua (rejected hunks) -@@ -13,11 +13,11 @@ describe("TestAttacks", function() - runCallback("OnFrame") - assert.are.equals(205, build.calcsTab.mainEnv.minion.modDB:Sum("BASE", build.calcsTab.mainEnv.minion.mainSkill.skillCfg, "ChaosMin")) - -- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nAwakened Generosity 4/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nAwakened Generosity 4/0 1\n") - runCallback("OnFrame") - assert.are.equals(round(205 * 1.43), build.calcsTab.mainEnv.minion.modDB:Sum("BASE", build.calcsTab.mainEnv.minion.mainSkill.skillCfg, "ChaosMin")) - -- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nAwakened Generosity 5/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nAwakened Generosity 5/0 1\n") - runCallback("OnFrame") - -- No Envy level increase, so base should still be 205 - assert.are.equals(round(205 * 1.44), build.calcsTab.mainEnv.minion.modDB:Sum("BASE", build.calcsTab.mainEnv.minion.mainSkill.skillCfg, "ChaosMin")) -@@ -43,10 +43,10 @@ describe("TestAttacks", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Mirage Archer 20/0 Default 1\nRain of Arrows 20/0 Default 1\nManaforged Arrows 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Mirage Archer 20/0 1\nRain of Arrows 20/0 1\nManaforged Arrows 20/0 1\n") - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Toxic Rain 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Toxic Rain 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.MirageDPS ~= nil) -@@ -71,14 +71,14 @@ describe("TestAttacks", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Power Siphon 20/0 Default 1\nSacred Wisps 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Power Siphon 20/0 1\nSacred Wisps 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.MirageDPS ~= nil) - end) - - it("Test Scorching ray applying exposure at max stages", function() -- build.skillsTab:PasteSocketGroup("Scorching Ray 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Scorching Ray 20/0 1\n") - runCallback("OnFrame") - - local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] -@@ -101,7 +101,7 @@ describe("TestAttacks", function() - end) - - it("Test Adrenaline affecting blight max stage count", function() -- build.skillsTab:PasteSocketGroup("Blight 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Blight 20/0 1\n") - runCallback("OnFrame") - - local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] diff --git a/spec/System/TestTriggers_spec.lua.rej b/spec/System/TestTriggers_spec.lua.rej deleted file mode 100644 index c52809aade..0000000000 --- a/spec/System/TestTriggers_spec.lua.rej +++ /dev/null @@ -1,498 +0,0 @@ -diff a/spec/System/TestTriggers_spec.lua b/spec/System/TestTriggers_spec.lua (rejected hunks) -@@ -28,7 +28,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Reave 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Reave 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -56,7 +56,7 @@ describe("TestTriggers", function() - build.mainSocketGroup = 2 - build.modFlag = true - build.buildFlag = true -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -84,7 +84,7 @@ describe("TestTriggers", function() - build.mainSocketGroup = 2 - build.modFlag = true - build.buildFlag = true -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -197,7 +197,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -248,7 +248,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -294,7 +294,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -322,7 +322,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -348,7 +348,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -371,7 +371,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -398,7 +398,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -421,7 +421,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -449,7 +449,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -485,7 +485,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -507,7 +507,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Reave 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Reave 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -535,7 +535,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -557,7 +557,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -579,7 +579,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -600,10 +600,10 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 1\n") - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -643,10 +643,10 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nRain of Arrows 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nRain of Arrows 20/0 1\n") - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -687,10 +687,10 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nRain of Arrows 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nRain of Arrows 20/0 1\n") - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Arc 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -740,10 +740,10 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 1\n") - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -766,10 +766,10 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Slot: Gloves\nEnfeeble 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Gloves\nEnfeeble 20/0 1\n") - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Despair 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Despair 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -820,10 +820,10 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 1\n") - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Reave 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Reave 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -872,10 +872,10 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 1\n") - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Ice Nova 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Ice Nova 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -909,10 +909,10 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nArc 20/0 1\n") - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -940,10 +940,10 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nIce Nova 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nIce Nova 20/0 1\n") - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Reave 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Reave 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -971,7 +971,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 Default 1\nArc 20/0 Default 1\nCyclone 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 1\nArc 20/0 1\nCyclone 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -999,7 +999,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Cast on Melee Kill 20/0 Default 1\nArc 20/0 Default 1\nCyclone 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Cast on Melee Kill 20/0 1\nArc 20/0 1\nCyclone 20/0 1\n") - runCallback("OnFrame") - - build.configTab.input["conditionKilledRecently"] = true -@@ -1010,24 +1010,24 @@ describe("TestTriggers", function() - end) - - it("Trigger Holy Relic", function() -- build.skillsTab:PasteSocketGroup("Summon Holy Relic 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Summon Holy Relic 20/0 1\n") - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.Minion.SkillTriggerRate ~= nil) - end) - - it("Trigger Cast when Damage Taken", function() -- build.skillsTab:PasteSocketGroup("Cast when Damage Taken 20/0 Default 1\nArc 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Cast when Damage Taken 20/0 1\nArc 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) - end) - - it("Trigger Cast when Stunned", function() -- build.skillsTab:PasteSocketGroup("Cast when Stunned 20/0 Default 1\nArc 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Cast when Stunned 20/0 1\nArc 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -1055,27 +1055,27 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nSpellslinger 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Arc 20/0 1\nSpellslinger 20/0 1\n") - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Kinetic Blast 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) - end) - - it("Trigger Mark On Hit", function() -- build.skillsTab:PasteSocketGroup("Mark On Hit 20/0 Default 1\nAlchemist's Mark 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Mark On Hit 20/0 1\nAlchemist's Mark 20/0 1\n") - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) - end) - - it("Trigger Hextouch", function() -- build.skillsTab:PasteSocketGroup("Despair 20/0 Default 1\nHextouch 20/0 Default 1\nSmite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Despair 20/0 1\nHextouch 20/0 1\nSmite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -1103,7 +1103,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -1132,7 +1132,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Tempest Shield 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Tempest Shield 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -1161,7 +1161,7 @@ describe("TestTriggers", function() - end) - - it("Trigger Combust", function() -- build.skillsTab:PasteSocketGroup("Infernal Cry 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Infernal Cry 20/0 1\n") - runCallback("OnFrame") - - local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] -@@ -1170,14 +1170,14 @@ describe("TestTriggers", function() - build.buildFlag = true - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) - end) - - it("Trigger Prismatic Burst", function() -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\nPrismatic Burst 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\nPrismatic Burst 20/0 1\n") - runCallback("OnFrame") - - local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] -@@ -1211,7 +1211,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\nShockwave 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\nShockwave 20/0 1\n") - runCallback("OnFrame") - - local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] -@@ -1243,24 +1243,24 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Frenzy 20/0 Default 1\nManaforged Arrows 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Frenzy 20/0 1\nManaforged Arrows 20/0 1\n") - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Rain of Arrows 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Rain of Arrows 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) - end) - - it("Trigger Doom Blast", function() -- build.skillsTab:PasteSocketGroup("Impending Doom 20/0 Default 1\nDespair 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Impending Doom 20/0 1\nDespair 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) - end) - - it("Trigger Cast while Channelling", function() -- build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nCast while Channelling 20/0 Default 1\nBlight 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Arc 20/0 1\nCast while Channelling 20/0 1\nBlight 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -1285,14 +1285,14 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Helmet\nArc 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) - end) - - it("Trigger Flamewood", function() -- build.skillsTab:PasteSocketGroup("Decoy Totem 20/0 Default 1\nFlamewood 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Decoy Totem 20/0 1\nFlamewood 20/0 1\n") - runCallback("OnFrame") - - local mainSocketGroup = build.skillsTab.socketGroupList[build.mainSocketGroup] -@@ -1305,7 +1305,7 @@ describe("TestTriggers", function() - end) - - it("Trigger Automation", function() -- build.skillsTab:PasteSocketGroup("Steelskin 20/0 Default 1\nAutomation 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Steelskin 20/0 1\nAutomation 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -1334,7 +1334,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nArc 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nArc 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -1351,17 +1351,17 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nFireball 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nFireball 20/0 1\n") - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Smite 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Smite 20/0 1\n") - runCallback("OnFrame") - - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) - end) - - it("Triggerbots CWCHandler", function() -- build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nCast while Channelling 20/0 Default 1\nBlight 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Arc 20/0 1\nCast while Channelling 20/0 1\nBlight 20/0 1\n") - runCallback("OnFrame") - local baseRate = build.calcsTab.mainOutput.SkillTriggerRate - assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil) -@@ -1396,7 +1396,7 @@ describe("TestTriggers", function() - build.itemsTab:AddDisplayItem() - runCallback("OnFrame") - -- build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 Default 1\nArc 20/0 Default 1\nCyclone 20/0 Default 1\n") -+ build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 1\nArc 20/0 1\nCyclone 20/0 1\n") - runCallback("OnFrame") - - local baseRate = build.calcsTab.mainOutput.SkillTriggerRate diff --git a/src/Classes/ImportTab.lua b/src/Classes/ImportTab.lua index 56c287a081..b6c85bc2ef 100644 --- a/src/Classes/ImportTab.lua +++ b/src/Classes/ImportTab.lua @@ -815,6 +815,91 @@ function ImportTabClass:ImportPassiveTreeAndJewels(charData) main:SetWindowTitleSubtext(string.format("%s (%s, %s, %s)", self.build.buildName, charData.name, charData.class, charData.league)) end +local SOCKET_GROUP_REIMPORT_KEY_SEPARATOR = "\31" + +local function getSocketGroupReimportKey(socketGroup) + -- Use a rarely-used separator to avoid accidental collisions when concatenating fields. + local gemNameParts = { } + for _, gem in ipairs(socketGroup.gemList) do + t_insert(gemNameParts, (gem.nameSpec or ""):lower()) + end + return table.concat({ + socketGroup.slot or "", + socketGroup.source or "", + tostring(#socketGroup.gemList), + table.concat(gemNameParts, SOCKET_GROUP_REIMPORT_KEY_SEPARATOR), + }, SOCKET_GROUP_REIMPORT_KEY_SEPARATOR) +end + +local function snapshotSocketGroupReimportState(socketGroup, isMainGroup) + local gemStates = { } + for gemIndex, gem in ipairs(socketGroup.gemList) do + gemStates[gemIndex] = { + enabled = gem.enabled, + count = gem.count, + skillPart = gem.skillPart, + skillPartCalcs = gem.skillPartCalcs, + skillStageCount = gem.skillStageCount, + skillStageCountCalcs = gem.skillStageCountCalcs, + skillMineCount = gem.skillMineCount, + skillMineCountCalcs = gem.skillMineCountCalcs, + skillMinion = gem.skillMinion, + skillMinionCalcs = gem.skillMinionCalcs, + skillMinionItemSet = gem.skillMinionItemSet, + skillMinionItemSetCalcs = gem.skillMinionItemSetCalcs, + skillMinionSkill = gem.skillMinionSkill, + skillMinionSkillCalcs = gem.skillMinionSkillCalcs, + enableGlobal1 = gem.enableGlobal1, + enableGlobal2 = gem.enableGlobal2, + } + end + return { + enabled = socketGroup.enabled, + includeInFullDPS = socketGroup.includeInFullDPS, + groupCount = socketGroup.groupCount, + label = socketGroup.label, + mainActiveSkill = socketGroup.mainActiveSkill, + mainActiveSkillCalcs = socketGroup.mainActiveSkillCalcs, + gemStates = gemStates, + isMainGroup = isMainGroup, + } +end + +local function applyGemReimportState(gem, state) + gem.enabled = state.enabled + gem.count = state.count + gem.skillPart = state.skillPart + gem.skillPartCalcs = state.skillPartCalcs + gem.skillStageCount = state.skillStageCount + gem.skillStageCountCalcs = state.skillStageCountCalcs + gem.skillMineCount = state.skillMineCount + gem.skillMineCountCalcs = state.skillMineCountCalcs + gem.skillMinion = state.skillMinion + gem.skillMinionCalcs = state.skillMinionCalcs + gem.skillMinionItemSet = state.skillMinionItemSet + gem.skillMinionItemSetCalcs = state.skillMinionItemSetCalcs + gem.skillMinionSkill = state.skillMinionSkill + gem.skillMinionSkillCalcs = state.skillMinionSkillCalcs + gem.enableGlobal1 = state.enableGlobal1 + gem.enableGlobal2 = state.enableGlobal2 +end + +local function applySocketGroupReimportState(socketGroup, state) + socketGroup.enabled = state.enabled + socketGroup.includeInFullDPS = state.includeInFullDPS + socketGroup.groupCount = state.groupCount + socketGroup.label = state.label + socketGroup.mainActiveSkill = state.mainActiveSkill + socketGroup.mainActiveSkillCalcs = state.mainActiveSkillCalcs + if state.gemStates then + for gemIndex, gemState in ipairs(state.gemStates) do + if socketGroup.gemList[gemIndex] then + applyGemReimportState(socketGroup.gemList[gemIndex], gemState) + end + end + end +end + function ImportTabClass:ImportItemsAndSkills(charData) local charItemData = charData.equipment if self.controls.charImportItemsClearItems.state then diff --git a/src/Classes/ImportTab.lua.rej b/src/Classes/ImportTab.lua.rej deleted file mode 100644 index 209e400954..0000000000 --- a/src/Classes/ImportTab.lua.rej +++ /dev/null @@ -1,23 +0,0 @@ -diff a/src/Classes/ImportTab.lua b/src/Classes/ImportTab.lua (rejected hunks) -@@ -756,6 +756,10 @@ local function snapshotSocketGroupReimportState(socketGroup, isMainGroup) - skillStageCountCalcs = gem.skillStageCountCalcs, - skillMineCount = gem.skillMineCount, - skillMineCountCalcs = gem.skillMineCountCalcs, -+ skillMinionSkill = gem.skillMinionSkill, -+ skillMinionSkillCalcs = gem.skillMinionSkillCalcs, -+ enableGlobal1 = gem.enableGlobal1, -+ enableGlobal2 = gem.enableGlobal2, - } - end - return { -@@ -778,6 +782,10 @@ local function applyGemReimportState(gem, state) - gem.skillStageCountCalcs = state.skillStageCountCalcs - gem.skillMineCount = state.skillMineCount - gem.skillMineCountCalcs = state.skillMineCountCalcs -+ gem.skillMinionSkill = state.skillMinionSkill -+ gem.skillMinionSkillCalcs = state.skillMinionSkillCalcs -+ gem.enableGlobal1 = state.enableGlobal1 -+ gem.enableGlobal2 = state.enableGlobal2 - end - - local function applySocketGroupReimportState(socketGroup, state) diff --git a/src/Classes/SkillsTab.lua.rej b/src/Classes/SkillsTab.lua.rej deleted file mode 100644 index 3aeab18982..0000000000 --- a/src/Classes/SkillsTab.lua.rej +++ /dev/null @@ -1,19 +0,0 @@ -diff a/src/Classes/SkillsTab.lua b/src/Classes/SkillsTab.lua (rejected hunks) -@@ -591,7 +591,7 @@ function SkillsTabClass:CopySocketGroup(socketGroup) - skillText = skillText .. "Slot: " .. socketGroup.slot .. "\r\n" - end - for _, gemInstance in ipairs(socketGroup.gemList) do -- skillText = skillText .. string.format("%s %d/%d %s %d\r\n", gemInstance.nameSpec, gemInstance.level, gemInstance.quality, gemInstance.enabled and "ENABLED" or "DISABLED", gemInstance.count or 1) -+ skillText = skillText .. string.format("%s %d/%d %s %d\r\n", gemInstance.nameSpec, gemInstance.level, gemInstance.quality, gemInstance.enabled and "" or "DISABLED", gemInstance.count or 1) - end - Copy(skillText) - end -@@ -608,7 +608,7 @@ function SkillsTabClass:PasteSocketGroup(testInput) - if slot then - newGroup.slot = slot - end -- for nameSpec, level, quality, state, count in skillText:gmatch("([ %a']+) (%d+)/(%d+) (%a+%d?) ?(%a*) (%d+)") do -+ for nameSpec, level, quality, state, count in skillText:gmatch("([ %a']+) (%d+)/(%d+) ?(%a*) (%d+)") do - t_insert(newGroup.gemList, { - nameSpec = nameSpec, - level = tonumber(level) or 20, From 301d0ee8ba6ffe08fdf03a891253e8ce9c95a108 Mon Sep 17 00:00:00 2001 From: LocalIdentity Date: Thu, 4 Jun 2026 06:15:16 +1000 Subject: [PATCH 3/6] Add back reimport test --- spec/System/TestImportReimport_spec.lua | 226 ++++++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 spec/System/TestImportReimport_spec.lua diff --git a/spec/System/TestImportReimport_spec.lua b/spec/System/TestImportReimport_spec.lua new file mode 100644 index 0000000000..24663900d5 --- /dev/null +++ b/spec/System/TestImportReimport_spec.lua @@ -0,0 +1,226 @@ +describe("TestImportReimport", function() + local dkjson = require "dkjson" + local DEFAULT_CHARACTER_LEVEL = 12 + local DEFAULT_ITEM_LEVEL = 10 + local TEST_IMPORT_ITEM_ID = "test-import-item-1" + local DEFAULT_SOCKET_COLOR = "R" + + before_each(function() + newBuild() + end) + + local function makeGemProperties(level) + return { + { name = "Level", values = { { tostring(level), 0 } } }, + { name = "Quality", values = { { "+0%", 0 } } }, + } + end + + local function makeSocketedGemEntry(socket, support, typeLine, level) + return { + socket = socket, + support = support, + typeLine = typeLine, + properties = makeGemProperties(level), + } + end + + -- Build a minimal import item so the tests stay focused on state, not fixture noise. + local function makeImportItem(itemTypeLine, inventoryId, socketedItems, itemId) + local maxSocketIndex = 0 + for _, socketedItem in ipairs(socketedItems) do + maxSocketIndex = math.max(maxSocketIndex, socketedItem.socket + 1) + end + local sockets = {} + for index = 1, maxSocketIndex do + sockets[index] = { group = 0, sColour = DEFAULT_SOCKET_COLOR } + end + return { + id = itemId or TEST_IMPORT_ITEM_ID, + frameType = 0, + name = "", + typeLine = itemTypeLine, + inventoryId = inventoryId, + ilvl = DEFAULT_ITEM_LEVEL, + properties = {}, + sockets = sockets, + socketedItems = socketedItems, + } + end + + -- Build a minimal import payload so the tests stay focused on state, not fixture noise. + local function buildImportPayload(items) + return dkjson.encode({ + character = { level = DEFAULT_CHARACTER_LEVEL }, + items = items, + }) + end + + local function reimportSocketedItemsWithOptions(itemTypeLine, inventoryId, socketedItems, clearItems) + build.importTab.controls.charImportItemsClearSkills.state = true + build.importTab.controls.charImportItemsClearItems.state = clearItems + build.importTab:ImportItemsAndSkills(buildImportPayload({ + makeImportItem(itemTypeLine, inventoryId, socketedItems), + })) + runCallback("OnFrame") + end + + local function reimportSingleSocketedGemWithOptions(itemTypeLine, inventoryId, gemName, clearItems) + reimportSocketedItemsWithOptions(itemTypeLine, inventoryId, { + makeSocketedGemEntry(0, false, gemName, 20), + }, clearItems) + end + + local function reimportSingleSocketedGem(itemTypeLine, inventoryId, gemName) + reimportSingleSocketedGemWithOptions(itemTypeLine, inventoryId, gemName, false) + end + + local function assertReimportPreservesSkillSubstate(slotName, itemTypeLine, inventoryId, gemName, fieldName, fieldValue) + build.skillsTab:PasteSocketGroup(string.format([[ +Slot: %s +%s 20/0 1 +]], slotName, gemName)) + runCallback("OnFrame") + + local socketGroup = build.skillsTab.socketGroupList[1] + local srcInstance = socketGroup.displaySkillList[1].activeEffect.srcInstance + srcInstance[fieldName] = fieldValue + srcInstance[fieldName.."Calcs"] = fieldValue + build.modFlag = true + build.buildFlag = true + runCallback("OnFrame") + + reimportSingleSocketedGem(itemTypeLine, inventoryId, gemName) + + socketGroup = build.skillsTab.socketGroupList[1] + srcInstance = socketGroup.displaySkillList[1].activeEffect.srcInstance + assert.are.equal(fieldValue, srcInstance[fieldName]) + assert.are.equal(fieldValue, srcInstance[fieldName.."Calcs"]) + end + + it("preserves full DPS state and manually disabled gems when reimporting items and skills", function() + build.skillsTab:PasteSocketGroup([[ +Slot: Helmet +Cleave 1/0 1 +Heavy Strike 1/0 1 +Added Fire Damage 1/0 DISABLED 1 +]]) + runCallback("OnFrame") + + local socketGroup = build.skillsTab.socketGroupList[1] + socketGroup.includeInFullDPS = true + socketGroup.mainActiveSkill = 2 + runCallback("OnFrame") + + build.importTab.controls.charImportItemsClearSkills.state = true + build.importTab.controls.charImportItemsClearItems.state = false + build.importTab:ImportItemsAndSkills(buildImportPayload({ + makeImportItem("Iron Hat", "Helm", { + makeSocketedGemEntry(0, false, "Cleave", 1), + makeSocketedGemEntry(1, false, "Heavy Strike", 1), + makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), + }), + })) + runCallback("OnFrame") + + socketGroup = build.skillsTab.socketGroupList[1] + assert.are.equal("Helmet", socketGroup.slot) + assert.is_true(socketGroup.includeInFullDPS) + assert.are.equal(2, socketGroup.mainActiveSkill) + assert.are.equal(2, socketGroup.gemList[3].level) + assert.is_false(socketGroup.gemList[3].enabled) + end) + + it("preserves full DPS state and disabled gems when reimporting with deleted equipment", function() + build.skillsTab:PasteSocketGroup([[ +Slot: Helmet +Cleave 1/0 1 +Heavy Strike 1/0 1 +Added Fire Damage 1/0 DISABLED 1 +]]) + runCallback("OnFrame") + + local socketGroup = build.skillsTab.socketGroupList[1] + socketGroup.includeInFullDPS = true + socketGroup.mainActiveSkill = 2 + runCallback("OnFrame") + + reimportSocketedItemsWithOptions("Iron Hat", "Helm", { + makeSocketedGemEntry(0, false, "Cleave", 1), + makeSocketedGemEntry(1, false, "Heavy Strike", 1), + makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), + }, true) + + socketGroup = build.skillsTab.socketGroupList[1] + assert.are.equal("Helmet", socketGroup.slot) + assert.is_true(socketGroup.includeInFullDPS) + assert.are.equal(2, socketGroup.mainActiveSkill) + assert.are.equal(2, socketGroup.gemList[3].level) + assert.is_false(socketGroup.gemList[3].enabled) + end) + + it("preserves two socket groups when reimporting items and skills", function() + build.skillsTab:PasteSocketGroup([[ +Slot: Helmet +Cleave 1/0 1 +Heavy Strike 1/0 1 +Added Fire Damage 1/0 DISABLED 1 +]]) + runCallback("OnFrame") + + build.skillsTab:PasteSocketGroup([[ +Slot: Gloves +Blight 20/0 1 +]]) + runCallback("OnFrame") + + local helmetGroup = build.skillsTab.socketGroupList[1] + helmetGroup.includeInFullDPS = true + helmetGroup.mainActiveSkill = 2 + local glovesGroup = build.skillsTab.socketGroupList[2] + glovesGroup.enabled = false + runCallback("OnFrame") + + build.importTab.controls.charImportItemsClearSkills.state = true + build.importTab.controls.charImportItemsClearItems.state = false + build.importTab:ImportItemsAndSkills(buildImportPayload({ + makeImportItem("Iron Hat", "Helm", { + makeSocketedGemEntry(0, false, "Cleave", 1), + makeSocketedGemEntry(1, false, "Heavy Strike", 1), + makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), + }, "test-import-item-helmet"), + makeImportItem("Rawhide Gloves", "Gloves", { + makeSocketedGemEntry(0, false, "Blight", 20), + }, "test-import-item-gloves"), + })) + runCallback("OnFrame") + + local groupsBySlot = {} + for _, socketGroup in ipairs(build.skillsTab.socketGroupList) do + groupsBySlot[socketGroup.slot] = socketGroup + end + + assert.are.equal(2, #build.skillsTab.socketGroupList) + assert.is_not_nil(groupsBySlot.Helmet) + assert.is_not_nil(groupsBySlot.Gloves) + assert.is_true(groupsBySlot.Helmet.includeInFullDPS) + assert.are.equal(2, groupsBySlot.Helmet.mainActiveSkill) + assert.is_false(groupsBySlot.Gloves.enabled) + end) + + it("preserves skill part selection when reimporting items and skills", function() + assertReimportPreservesSkillSubstate("Helmet", "Iron Hat", "Helm", "Blight", "skillPart", 2) + end) + + it("preserves stage count when reimporting items and skills", function() + assertReimportPreservesSkillSubstate("Weapon 1", "Driftwood Wand", "Weapon", "Scorching Ray", "skillStageCount", 8) + end) + + it("preserves mine count when reimporting items and skills", function() + assertReimportPreservesSkillSubstate("Gloves", "Rawhide Gloves", "Gloves", "Pyroclast Mine", "skillMineCount", 12) + end) + + it("preserves minion skill when reimporting items and skills", function() + assertReimportPreservesSkillSubstate("Gloves", "Rawhide Gloves", "Gloves", "Summon Chaos Golem", "skillMinionSkill", 3) + end) +end) From c7a00edb2b0eb3aaa2d0dd76ecea260bb50cde3b Mon Sep 17 00:00:00 2001 From: LocalIdentity Date: Thu, 4 Jun 2026 06:36:10 +1000 Subject: [PATCH 4/6] Fix tests --- spec/System/TestImportReimport_spec.lua | 148 ++++++++++-------------- src/Classes/ImportTab.lua | 1 + 2 files changed, 62 insertions(+), 87 deletions(-) diff --git a/spec/System/TestImportReimport_spec.lua b/spec/System/TestImportReimport_spec.lua index 24663900d5..ce34a2dacd 100644 --- a/spec/System/TestImportReimport_spec.lua +++ b/spec/System/TestImportReimport_spec.lua @@ -1,9 +1,7 @@ describe("TestImportReimport", function() - local dkjson = require "dkjson" local DEFAULT_CHARACTER_LEVEL = 12 local DEFAULT_ITEM_LEVEL = 10 local TEST_IMPORT_ITEM_ID = "test-import-item-1" - local DEFAULT_SOCKET_COLOR = "R" before_each(function() newBuild() @@ -16,25 +14,17 @@ describe("TestImportReimport", function() } end - local function makeSocketedGemEntry(socket, support, typeLine, level) + local function makeGemEntry(support, typeLine, level, socketedItems) return { - socket = socket, support = support, typeLine = typeLine, properties = makeGemProperties(level), + socketedItems = socketedItems, } end -- Build a minimal import item so the tests stay focused on state, not fixture noise. - local function makeImportItem(itemTypeLine, inventoryId, socketedItems, itemId) - local maxSocketIndex = 0 - for _, socketedItem in ipairs(socketedItems) do - maxSocketIndex = math.max(maxSocketIndex, socketedItem.socket + 1) - end - local sockets = {} - for index = 1, maxSocketIndex do - sockets[index] = { group = 0, sColour = DEFAULT_SOCKET_COLOR } - end + local function makeImportItem(itemTypeLine, inventoryId, itemId) return { id = itemId or TEST_IMPORT_ITEM_ID, frameType = 0, @@ -43,43 +33,41 @@ describe("TestImportReimport", function() inventoryId = inventoryId, ilvl = DEFAULT_ITEM_LEVEL, properties = {}, - sockets = sockets, - socketedItems = socketedItems, } end -- Build a minimal import payload so the tests stay focused on state, not fixture noise. - local function buildImportPayload(items) - return dkjson.encode({ - character = { level = DEFAULT_CHARACTER_LEVEL }, - items = items, - }) + local function buildImportPayload(items, skills) + return { + level = DEFAULT_CHARACTER_LEVEL, + equipment = items, + skills = skills, + } end - local function reimportSocketedItemsWithOptions(itemTypeLine, inventoryId, socketedItems, clearItems) + local function reimportSkillsWithOptions(itemTypeLine, inventoryId, skills, clearItems) build.importTab.controls.charImportItemsClearSkills.state = true build.importTab.controls.charImportItemsClearItems.state = clearItems build.importTab:ImportItemsAndSkills(buildImportPayload({ - makeImportItem(itemTypeLine, inventoryId, socketedItems), - })) + makeImportItem(itemTypeLine, inventoryId), + }, skills)) runCallback("OnFrame") end - local function reimportSingleSocketedGemWithOptions(itemTypeLine, inventoryId, gemName, clearItems) - reimportSocketedItemsWithOptions(itemTypeLine, inventoryId, { - makeSocketedGemEntry(0, false, gemName, 20), + local function reimportSingleGemWithOptions(itemTypeLine, inventoryId, gemName, clearItems) + reimportSkillsWithOptions(itemTypeLine, inventoryId, { + makeGemEntry(false, gemName, 20), }, clearItems) end - local function reimportSingleSocketedGem(itemTypeLine, inventoryId, gemName) - reimportSingleSocketedGemWithOptions(itemTypeLine, inventoryId, gemName, false) + local function reimportSingleGem(itemTypeLine, inventoryId, gemName) + reimportSingleGemWithOptions(itemTypeLine, inventoryId, gemName, false) end - local function assertReimportPreservesSkillSubstate(slotName, itemTypeLine, inventoryId, gemName, fieldName, fieldValue) + local function assertReimportPreservesSkillSubstate(itemTypeLine, inventoryId, gemName, fieldName, fieldValue) build.skillsTab:PasteSocketGroup(string.format([[ -Slot: %s %s 20/0 1 -]], slotName, gemName)) +]], gemName)) runCallback("OnFrame") local socketGroup = build.skillsTab.socketGroupList[1] @@ -90,7 +78,7 @@ Slot: %s build.buildFlag = true runCallback("OnFrame") - reimportSingleSocketedGem(itemTypeLine, inventoryId, gemName) + reimportSingleGem(itemTypeLine, inventoryId, gemName) socketGroup = build.skillsTab.socketGroupList[1] srcInstance = socketGroup.displaySkillList[1].activeEffect.srcInstance @@ -100,10 +88,8 @@ Slot: %s it("preserves full DPS state and manually disabled gems when reimporting items and skills", function() build.skillsTab:PasteSocketGroup([[ -Slot: Helmet -Cleave 1/0 1 -Heavy Strike 1/0 1 -Added Fire Damage 1/0 DISABLED 1 +Dark Effigy 1/0 1 +Controlled Destruction 1/0 DISABLED 1 ]]) runCallback("OnFrame") @@ -115,28 +101,25 @@ Added Fire Damage 1/0 DISABLED 1 build.importTab.controls.charImportItemsClearSkills.state = true build.importTab.controls.charImportItemsClearItems.state = false build.importTab:ImportItemsAndSkills(buildImportPayload({ - makeImportItem("Iron Hat", "Helm", { - makeSocketedGemEntry(0, false, "Cleave", 1), - makeSocketedGemEntry(1, false, "Heavy Strike", 1), - makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), + makeImportItem("Wrapped Cap", "Helm"), + }, { + makeGemEntry(false, "Dark Effigy", 2, { + makeGemEntry(true, "Controlled Destruction", 1), }), })) runCallback("OnFrame") socketGroup = build.skillsTab.socketGroupList[1] - assert.are.equal("Helmet", socketGroup.slot) assert.is_true(socketGroup.includeInFullDPS) assert.are.equal(2, socketGroup.mainActiveSkill) - assert.are.equal(2, socketGroup.gemList[3].level) - assert.is_false(socketGroup.gemList[3].enabled) + assert.are.equal(2, socketGroup.gemList[1].level) + assert.is_false(socketGroup.gemList[2].enabled) end) it("preserves full DPS state and disabled gems when reimporting with deleted equipment", function() build.skillsTab:PasteSocketGroup([[ -Slot: Helmet -Cleave 1/0 1 -Heavy Strike 1/0 1 -Added Fire Damage 1/0 DISABLED 1 +Dark Effigy 1/0 1 +Controlled Destruction 1/0 DISABLED 1 ]]) runCallback("OnFrame") @@ -145,82 +128,73 @@ Added Fire Damage 1/0 DISABLED 1 socketGroup.mainActiveSkill = 2 runCallback("OnFrame") - reimportSocketedItemsWithOptions("Iron Hat", "Helm", { - makeSocketedGemEntry(0, false, "Cleave", 1), - makeSocketedGemEntry(1, false, "Heavy Strike", 1), - makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), + reimportSkillsWithOptions("Wrapped Cap", "Helm", { + makeGemEntry(false, "Dark Effigy", 2, { + makeGemEntry(true, "Controlled Destruction", 1), + }), }, true) socketGroup = build.skillsTab.socketGroupList[1] - assert.are.equal("Helmet", socketGroup.slot) assert.is_true(socketGroup.includeInFullDPS) assert.are.equal(2, socketGroup.mainActiveSkill) - assert.are.equal(2, socketGroup.gemList[3].level) - assert.is_false(socketGroup.gemList[3].enabled) + assert.are.equal(2, socketGroup.gemList[1].level) + assert.is_false(socketGroup.gemList[2].enabled) end) it("preserves two socket groups when reimporting items and skills", function() build.skillsTab:PasteSocketGroup([[ -Slot: Helmet -Cleave 1/0 1 -Heavy Strike 1/0 1 -Added Fire Damage 1/0 DISABLED 1 +Dark Effigy 1/0 1 +Controlled Destruction 1/0 DISABLED 1 ]]) runCallback("OnFrame") build.skillsTab:PasteSocketGroup([[ -Slot: Gloves -Blight 20/0 1 +Fireball 20/0 1 ]]) runCallback("OnFrame") - local helmetGroup = build.skillsTab.socketGroupList[1] - helmetGroup.includeInFullDPS = true - helmetGroup.mainActiveSkill = 2 - local glovesGroup = build.skillsTab.socketGroupList[2] - glovesGroup.enabled = false + local darkEffigyGroup = build.skillsTab.socketGroupList[1] + darkEffigyGroup.includeInFullDPS = true + darkEffigyGroup.mainActiveSkill = 2 + local fireballGroup = build.skillsTab.socketGroupList[2] + fireballGroup.enabled = false runCallback("OnFrame") build.importTab.controls.charImportItemsClearSkills.state = true build.importTab.controls.charImportItemsClearItems.state = false build.importTab:ImportItemsAndSkills(buildImportPayload({ - makeImportItem("Iron Hat", "Helm", { - makeSocketedGemEntry(0, false, "Cleave", 1), - makeSocketedGemEntry(1, false, "Heavy Strike", 1), - makeSocketedGemEntry(2, true, "Added Fire Damage Support", 2), - }, "test-import-item-helmet"), - makeImportItem("Rawhide Gloves", "Gloves", { - makeSocketedGemEntry(0, false, "Blight", 20), - }, "test-import-item-gloves"), + makeImportItem("Wrapped Cap", "Helm", "test-import-item-helmet"), + makeImportItem("Linen Wraps", "Gloves", "test-import-item-gloves"), + }, { + makeGemEntry(false, "Dark Effigy", 1, { + makeGemEntry(true, "Controlled Destruction", 1), + }), + makeGemEntry(false, "Fireball", 20), })) runCallback("OnFrame") - local groupsBySlot = {} + local groupsByGem = {} for _, socketGroup in ipairs(build.skillsTab.socketGroupList) do - groupsBySlot[socketGroup.slot] = socketGroup + groupsByGem[socketGroup.gemList[1].nameSpec] = socketGroup end assert.are.equal(2, #build.skillsTab.socketGroupList) - assert.is_not_nil(groupsBySlot.Helmet) - assert.is_not_nil(groupsBySlot.Gloves) - assert.is_true(groupsBySlot.Helmet.includeInFullDPS) - assert.are.equal(2, groupsBySlot.Helmet.mainActiveSkill) - assert.is_false(groupsBySlot.Gloves.enabled) + assert.is_not_nil(groupsByGem["Dark Effigy"]) + assert.is_not_nil(groupsByGem.Fireball) + assert.is_true(groupsByGem["Dark Effigy"].includeInFullDPS) + assert.are.equal(2, groupsByGem["Dark Effigy"].mainActiveSkill) + assert.is_false(groupsByGem.Fireball.enabled) end) it("preserves skill part selection when reimporting items and skills", function() - assertReimportPreservesSkillSubstate("Helmet", "Iron Hat", "Helm", "Blight", "skillPart", 2) + assertReimportPreservesSkillSubstate("Twig Focus", "Offhand", "Dark Effigy", "skillPart", 2) end) it("preserves stage count when reimporting items and skills", function() - assertReimportPreservesSkillSubstate("Weapon 1", "Driftwood Wand", "Weapon", "Scorching Ray", "skillStageCount", 8) + assertReimportPreservesSkillSubstate("Withered Wand", "Weapon", "Flameblast", "skillStageCount", 8) end) - it("preserves mine count when reimporting items and skills", function() - assertReimportPreservesSkillSubstate("Gloves", "Rawhide Gloves", "Gloves", "Pyroclast Mine", "skillMineCount", 12) - end) - it("preserves minion skill when reimporting items and skills", function() - assertReimportPreservesSkillSubstate("Gloves", "Rawhide Gloves", "Gloves", "Summon Chaos Golem", "skillMinionSkill", 3) + assertReimportPreservesSkillSubstate("Linen Wraps", "Gloves", "Skeletal Sniper", "skillMinionSkill", 2) end) end) diff --git a/src/Classes/ImportTab.lua b/src/Classes/ImportTab.lua index b6c85bc2ef..90cfdf444b 100644 --- a/src/Classes/ImportTab.lua +++ b/src/Classes/ImportTab.lua @@ -5,6 +5,7 @@ -- local ipairs = ipairs local t_insert = table.insert +local t_remove = table.remove local b_rshift = bit.rshift local band = bit.band local m_max = math.max From 360022bb57d620d774234199b3d5688ab1da2ef7 Mon Sep 17 00:00:00 2001 From: LocalIdentity Date: Thu, 4 Jun 2026 07:01:21 +1000 Subject: [PATCH 5/6] Fix minion imports --- spec/System/TestImportReimport_spec.lua | 28 +++++++++++++++++++++++++ src/Classes/ImportTab.lua | 6 ++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/spec/System/TestImportReimport_spec.lua b/spec/System/TestImportReimport_spec.lua index ce34a2dacd..8166864f2f 100644 --- a/spec/System/TestImportReimport_spec.lua +++ b/spec/System/TestImportReimport_spec.lua @@ -88,6 +88,7 @@ describe("TestImportReimport", function() it("preserves full DPS state and manually disabled gems when reimporting items and skills", function() build.skillsTab:PasteSocketGroup([[ +Slot: Gloves Dark Effigy 1/0 1 Controlled Destruction 1/0 DISABLED 1 ]]) @@ -197,4 +198,31 @@ Fireball 20/0 1 it("preserves minion skill when reimporting items and skills", function() assertReimportPreservesSkillSubstate("Linen Wraps", "Gloves", "Skeletal Sniper", "skillMinionSkill", 2) end) + + it("preserves minion skill stat set when reimporting items and skills", function() + build.skillsTab:PasteSocketGroup([[ +Skeletal Sniper 20/0 1 +]]) + runCallback("OnFrame") + + local socketGroup = build.skillsTab.socketGroupList[1] + local activeEffect = socketGroup.displaySkillList[1].activeEffect + local grantedEffectId = activeEffect.grantedEffect.id + local srcInstance = activeEffect.srcInstance + srcInstance.skillMinionSkill = 2 + srcInstance.skillMinionSkillCalcs = 2 + srcInstance.skillMinionSkillStatSetIndexLookup = { [grantedEffectId] = { [2] = 3 } } + srcInstance.skillMinionSkillStatSetIndexLookupCalcs = { [grantedEffectId] = { [2] = 2 } } + + reimportSingleGem("Linen Wraps", "Gloves", "Skeletal Sniper") + + socketGroup = build.skillsTab.socketGroupList[1] + activeEffect = socketGroup.displaySkillList[1].activeEffect + grantedEffectId = activeEffect.grantedEffect.id + srcInstance = activeEffect.srcInstance + assert.are.equal(2, srcInstance.skillMinionSkill) + assert.are.equal(2, srcInstance.skillMinionSkillCalcs) + assert.are.equal(3, srcInstance.skillMinionSkillStatSetIndexLookup[grantedEffectId][2]) + assert.are.equal(2, srcInstance.skillMinionSkillStatSetIndexLookupCalcs[grantedEffectId][2]) + end) end) diff --git a/src/Classes/ImportTab.lua b/src/Classes/ImportTab.lua index 90cfdf444b..a9299f8910 100644 --- a/src/Classes/ImportTab.lua +++ b/src/Classes/ImportTab.lua @@ -825,8 +825,6 @@ local function getSocketGroupReimportKey(socketGroup) t_insert(gemNameParts, (gem.nameSpec or ""):lower()) end return table.concat({ - socketGroup.slot or "", - socketGroup.source or "", tostring(#socketGroup.gemList), table.concat(gemNameParts, SOCKET_GROUP_REIMPORT_KEY_SEPARATOR), }, SOCKET_GROUP_REIMPORT_KEY_SEPARATOR) @@ -850,6 +848,8 @@ local function snapshotSocketGroupReimportState(socketGroup, isMainGroup) skillMinionItemSetCalcs = gem.skillMinionItemSetCalcs, skillMinionSkill = gem.skillMinionSkill, skillMinionSkillCalcs = gem.skillMinionSkillCalcs, + skillMinionSkillStatSetIndexLookup = gem.skillMinionSkillStatSetIndexLookup and copyTable(gem.skillMinionSkillStatSetIndexLookup), + skillMinionSkillStatSetIndexLookupCalcs = gem.skillMinionSkillStatSetIndexLookupCalcs and copyTable(gem.skillMinionSkillStatSetIndexLookupCalcs), enableGlobal1 = gem.enableGlobal1, enableGlobal2 = gem.enableGlobal2, } @@ -881,6 +881,8 @@ local function applyGemReimportState(gem, state) gem.skillMinionItemSetCalcs = state.skillMinionItemSetCalcs gem.skillMinionSkill = state.skillMinionSkill gem.skillMinionSkillCalcs = state.skillMinionSkillCalcs + gem.skillMinionSkillStatSetIndexLookup = state.skillMinionSkillStatSetIndexLookup and copyTable(state.skillMinionSkillStatSetIndexLookup) + gem.skillMinionSkillStatSetIndexLookupCalcs = state.skillMinionSkillStatSetIndexLookupCalcs and copyTable(state.skillMinionSkillStatSetIndexLookupCalcs) gem.enableGlobal1 = state.enableGlobal1 gem.enableGlobal2 = state.enableGlobal2 end From 89ada7e97b7c2c5e995b98f394a01ecdddc5acd7 Mon Sep 17 00:00:00 2001 From: LocalIdentity Date: Thu, 4 Jun 2026 07:17:38 +1000 Subject: [PATCH 6/6] Fix skill stat set import --- spec/System/TestImportReimport_spec.lua | 23 +++++++++++++++++++++++ src/Classes/ImportTab.lua | 4 ++++ 2 files changed, 27 insertions(+) diff --git a/spec/System/TestImportReimport_spec.lua b/spec/System/TestImportReimport_spec.lua index 8166864f2f..cdcf6392a9 100644 --- a/spec/System/TestImportReimport_spec.lua +++ b/spec/System/TestImportReimport_spec.lua @@ -225,4 +225,27 @@ Skeletal Sniper 20/0 1 assert.are.equal(3, srcInstance.skillMinionSkillStatSetIndexLookup[grantedEffectId][2]) assert.are.equal(2, srcInstance.skillMinionSkillStatSetIndexLookupCalcs[grantedEffectId][2]) end) + + it("preserves active skill stat set when reimporting items and skills", function() + build.skillsTab:PasteSocketGroup([[ +Fireball 20/0 1 +]]) + runCallback("OnFrame") + + local socketGroup = build.skillsTab.socketGroupList[1] + local activeEffect = socketGroup.displaySkillList[1].activeEffect + local grantedEffectId = activeEffect.grantedEffect.id + local srcInstance = activeEffect.srcInstance + srcInstance.statSet = { [grantedEffectId] = 3 } + srcInstance.statSetCalcs = { [grantedEffectId] = 2 } + + reimportSingleGem("Linen Wraps", "Gloves", "Fireball") + + socketGroup = build.skillsTab.socketGroupList[1] + activeEffect = socketGroup.displaySkillList[1].activeEffect + grantedEffectId = activeEffect.grantedEffect.id + srcInstance = activeEffect.srcInstance + assert.are.equal(3, srcInstance.statSet[grantedEffectId]) + assert.are.equal(2, srcInstance.statSetCalcs[grantedEffectId]) + end) end) diff --git a/src/Classes/ImportTab.lua b/src/Classes/ImportTab.lua index a9299f8910..f6ea8cc44c 100644 --- a/src/Classes/ImportTab.lua +++ b/src/Classes/ImportTab.lua @@ -836,6 +836,8 @@ local function snapshotSocketGroupReimportState(socketGroup, isMainGroup) gemStates[gemIndex] = { enabled = gem.enabled, count = gem.count, + statSet = gem.statSet and copyTable(gem.statSet), + statSetCalcs = gem.statSetCalcs and copyTable(gem.statSetCalcs), skillPart = gem.skillPart, skillPartCalcs = gem.skillPartCalcs, skillStageCount = gem.skillStageCount, @@ -869,6 +871,8 @@ end local function applyGemReimportState(gem, state) gem.enabled = state.enabled gem.count = state.count + gem.statSet = state.statSet and copyTable(state.statSet) + gem.statSetCalcs = state.statSetCalcs and copyTable(state.statSetCalcs) gem.skillPart = state.skillPart gem.skillPartCalcs = state.skillPartCalcs gem.skillStageCount = state.skillStageCount