Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions spec/System/TestAilments_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,26 @@ describe("TestAilments", function()
runCallback("OnFrame")
end

for _, verb in ipairs({ "inflict", "apply" }) do
it("Painseeker removes inherent ailment chance on crit with '" .. verb .. "' wording", function()
build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nBall Lightning 20/0 1\n")
build.itemsTab:CreateDisplayItemFromRaw("Rarity: UNIQUE\nPainseeker\nShagreen Gloves\nImplicits: 0\nCritical Strikes do not inherently " .. verb .. " non-Damaging Ailments\nInflict non-Damaging Ailments as though dealing 150% more Damage")
build.itemsTab:AddDisplayItem()
runCallback("OnFrame")

assert.are.equals(0, build.calcsTab.mainOutput.ShockChanceOnCrit)
assert.are.equals(0, build.calcsTab.mainOutput.FreezeChanceOnCrit)
assert.are.equals(100, build.calcsTab.mainOutput.IgniteChanceOnCrit)

build.configTab.input.customMods = "25% chance to Shock\n25% chance to Freeze"
rebuild()

assert.are.equals(25, build.calcsTab.mainOutput.ShockChanceOnCrit)
assert.are.equals(25, build.calcsTab.mainOutput.FreezeChanceOnCrit)
assert.are.equals(25, build.calcsTab.mainOutput.ShockChance)
end)
end

it("maximum shock value", function()
-- Shock Nova
build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nShock Nova 4/0 1\n")
Expand Down
81 changes: 81 additions & 0 deletions spec/System/TestItemMods_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,87 @@ describe("TetsItemMods", function()
-- newBuild() takes care of resetting everything in setup()
end)

for _, wording in ipairs({ "Increases", "Increase" }) do
it("Scornflux applies Arcane Surge cast speed to movement speed with '" .. wording .. "' wording", function()
build.itemsTab:CreateDisplayItemFromRaw("Scornflux\nSatin Slippers\n" .. wording .. " to Cast Speed from Arcane Surge also applies to Movement Speed")
build.itemsTab:AddDisplayItem()
runCallback("OnFrame")
local withoutArcaneSurge = build.calcsTab.mainOutput.MovementSpeedMod

build.configTab.input.buffArcaneSurge = true
build.configTab:BuildModList()
runCallback("OnFrame")
assert.are.near(withoutArcaneSurge + 0.2, build.calcsTab.mainOutput.MovementSpeedMod, 10 ^ -9)
end)
end

for _, punctuation in ipairs({ ",", "" }) do
it("Gamblesprint applies configured movement speed with '" .. punctuation .. "' punctuation", function()
build.itemsTab:CreateDisplayItemFromRaw("Gamblesprint\nHydrascale Boots\nWhen Hit, gain a random Movement Speed modifier from 40% reduced to 100% increased" .. punctuation .. " until Hit again")
build.itemsTab:AddDisplayItem()
for _, movementSpeed in ipairs({ 100, -40 }) do
build.configTab.input.GamblesprintMovementSpeed = movementSpeed
build.configTab:BuildModList()
runCallback("OnFrame")
assert.are.near(1 + movementSpeed / 100, build.calcsTab.mainOutput.MovementSpeedMod, 10 ^ -9)
end
end)
end

for _, wording in ipairs({ "Item Rarity", "Rarity of Items found" }) do
it("The Pariah grants rarity only for white sockets with '" .. wording .. "' wording", function()
for _, colour in ipairs({ "W", "R" }) do
local item = new("Item"):Item("Rarity: UNIQUE\nThe Pariah\nUnset Ring\nSockets: " .. colour .. "\nImplicits: 0\n60% increased " .. wording .. " per White Socket")
build.itemsTab:AddItem(item, true)
build.itemsTab.slots["Ring 1"]:SetSelItemId(item.id)
build.buildFlag = true
runCallback("OnFrame")
assert.are.equals(colour == "W" and 60 or 0, build.calcsTab.mainEnv.player.modDB:Sum("INC", nil, "LootRarity"))
end
end)
end

for _, wording in ipairs({ "Enemy", "Enemy Monster" }) do
it("Triumvirate Authority ignores physical reduction only for socketed Vaal skills with '" .. wording .. "' wording", function()
build.itemsTab:CreateDisplayItemFromRaw("Triumvirate Authority\nUnset Ring\nSockets: G\nHits from Socketed Vaal Skills ignore " .. wording .. " Physical Damage Reduction")
build.itemsTab:AddDisplayItem()
build.skillsTab:PasteSocketGroup("Slot: Ring 1\nVaal Blade Vortex 20/0 1\n")
build.skillsTab:PasteSocketGroup("Slot: Ring 1\nFireball 20/0 1\n")
build.skillsTab:PasteSocketGroup("Slot: Helmet\nVaal Blade Vortex 20/0 1\n")
runCallback("OnFrame")

local affected, unaffected = 0, 0
for _, skill in ipairs(build.calcsTab.mainEnv.player.activeSkillList) do
local expected = skill.socketGroup.slot == "Ring 1" and skill.skillTypes[SkillType.Vaal] or false
assert.are.equals(expected, skill.skillModList:Flag(skill.skillCfg, "IgnoreEnemyPhysicalDamageReduction") or false)
if expected then
affected = affected + 1
else
unaffected = unaffected + 1
end
end
assert.are.equals(1, affected)
assert.is_true(unaffected >= 2)
end)
end

for _, case in ipairs({
{ name = "current", line = "100% chance to Avoid being Chilled or Frozen if you have used a Fire Skill Recently" },
{ name = "legacy", line = "Cannot be Frozen or Chilled if you've used a Fire Skill Recently" },
}) do
it("Hrimnor's Resolve grants conditional chill and freeze protection with " .. case.name .. " wording", function()
build.itemsTab:CreateDisplayItemFromRaw("Hrimnor's Resolve\nSamnite Helmet\n" .. case.line)
build.itemsTab:AddDisplayItem()
for _, recently in ipairs({ false, true, false }) do
build.configTab.input.conditionUsedFireSkillRecently = recently
build.configTab:BuildModList()
runCallback("OnFrame")
assert.are.equals(recently and 100 or 0, build.calcsTab.mainOutput.ChillAvoidChance)
assert.are.equals(recently and 100 or 0, build.calcsTab.mainOutput.FreezeAvoidChance)
end
end)
end

it("shows versioned reusable variant groups", function()
build.itemsTab:CreateDisplayItemFromRaw([[
Rarity: Unique
Expand Down
Loading
Loading