-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Expand file tree
/
Copy pathTestBuildDisplayStats_spec.lua
More file actions
139 lines (118 loc) · 5.82 KB
/
Copy pathTestBuildDisplayStats_spec.lua
File metadata and controls
139 lines (118 loc) · 5.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
describe("Build display stats", function()
local originalCompactValues
before_each(function()
originalCompactValues = main.useCompactValues
newBuild()
end)
after_each(function()
main.useCompactValues = originalCompactValues
end)
local function getSidebarLine(label)
local suffix = label .. ":"
for _, stat in ipairs(build.controls.statBox.list) do
if stat[1] and stat[1]:sub(-#suffix) == suffix then
return stat
end
end
end
local function getSidebarStat(label)
local line = getSidebarLine(label)
return line and line[2]
end
it("formats compact values once and preserves normal formatting below the threshold", function()
main.useCompactValues = true
assert.are.equals("^712.3K", build:FormatStat({ fmt = ".1f", compactValue = true }, 12345))
assert.are.equals("^7123", build:FormatStat({ fmt = ".1f", compactValue = true }, 123))
end)
it("shows guard suffixes for EHP and max hit values", function()
build.skillsTab:PasteSocketGroup("Steelskin 20/0 1")
runCallback("OnFrame")
assert.is_true(build.calcsTab.mainOutput.GuardSkillActive)
assert.matches("%(Guard%)$", getSidebarStat("Effective Hit Pool"))
assert.matches("%(Guard%)$", getSidebarStat("Phys Max Hit"))
assert.matches("%(Guard%)$", getSidebarStat("Elemental Max Hit"))
assert.matches("%(Guard%)$", getSidebarStat("Chaos Max Hit"))
end)
it("shows immunity instead of guard for an immune max hit", function()
build.skillsTab:PasteSocketGroup("Steelskin 20/0 1")
build.configTab.input.customMods = "Chaos Inoculation"
build.configTab:BuildModList()
runCallback("OnFrame")
assert.are.equals(math.huge, build.calcsTab.mainOutput.ChaosMaximumHitTaken)
assert.matches("%(Immune%)$", getSidebarStat("Chaos Resistance"))
assert.matches("%(Immune%)$", getSidebarStat("Chaos Max Hit"))
end)
it("only underlines sidebar stats with a visible breakdown", function()
build.skillsTab:PasteSocketGroup("Fireball 20/0 1")
runCallback("OnFrame")
for _, line in ipairs(build.controls.statBox.list) do
if line.underline and line.underline[2] then
build:SetDisplayStat({ line = line, x = 0, y = 0, width = 300 }, false)
assert.is_true(build.controls.breakdown.shown, line[1])
build:ClearDisplayStat()
end
end
end)
it("uses aggregate breakdowns for dual-wield attacks", function()
build.skillsTab:PasteSocketGroup("Cleave 20/0 1")
build.itemsTab:CreateDisplayItemFromRaw("New Item\nVaal Blade\nQuality: 0\n20% increased Attack Speed")
build.itemsTab:AddDisplayItem()
build.itemsTab:CreateDisplayItemFromRaw("New Item\nVaal Blade\nQuality: 0")
build.itemsTab:AddDisplayItem()
runCallback("OnFrame")
local actor = build.calcsTab.mainEnv.player
assert.is_true(actor.mainSkill.skillFlags.bothWeaponAttack)
assert.matches("Both weapons", table.concat(actor.breakdown.Speed, "\n"), nil, true)
assert.matches("Both weapons", table.concat(actor.breakdown.PreEffectiveCritChance, "\n"), nil, true)
assert.matches("Both weapons", table.concat(actor.breakdown.CritChance, "\n"), nil, true)
assert.not_matches("Crit confirmation roll", table.concat(actor.breakdown.PreEffectiveCritChance, "\n"), nil, true)
assert.matches("Crit confirmation roll", table.concat(actor.breakdown.CritChance, "\n"), nil, true)
assert.matches("Both weapons", table.concat(actor.breakdown.HitChance, "\n"), nil, true)
local critLine = getSidebarLine("Crit Chance")
local effectiveCritLine = getSidebarLine("Effective Crit Chance")
assert.are.equal("PreEffectiveCritChance", critLine.breakdown)
assert.are.equal("CritChance", effectiveCritLine.breakdown)
local displayData = build:GetSidebarBreakdown(critLine.breakdown, critLine.modNames, critLine.ignoredSections, "player")
local breakdownCount = 0
local hasMainHandModifiers = false
for _, section in ipairs(displayData) do
breakdownCount = breakdownCount + (section.breakdown and 1 or 0)
hasMainHandModifiers = hasMainHandModifiers or section.cfg == "weapon1"
end
assert.are.equal(1, breakdownCount)
assert.is_true(hasMainHandModifiers)
end)
it("uses off-hand breakdowns for shield attacks", function()
build.itemsTab:CreateDisplayItemFromRaw("New Item\nRusted Sword\nQuality: 0")
build.itemsTab:AddDisplayItem()
build.itemsTab:CreateDisplayItemFromRaw("New Item\nColossal Tower Shield\nQuality: 0")
build.itemsTab:AddDisplayItem()
build.skillsTab:PasteSocketGroup("Spectral Shield Throw 20/0 1")
build.configTab.input.enemyEvasion = 10000
build.configTab:BuildModList()
runCallback("OnFrame")
local actor = build.calcsTab.mainEnv.player
assert.is_falsy(actor.mainSkill.skillFlags.weapon1Attack)
assert.is_true(actor.mainSkill.skillFlags.weapon2Attack)
assert.are.equal(actor.breakdown.OffHand.Speed, actor.breakdown.Speed)
assert.are.equal(actor.breakdown.OffHand.AccuracyHitChance, actor.breakdown.HitChance)
assert.are.equal(actor.breakdown.OffHand.PreEffectiveCritChance, actor.breakdown.PreEffectiveCritChance)
assert.are.equal(actor.breakdown.OffHand.CritChance, actor.breakdown.CritChance)
local critLine = getSidebarLine("Crit Chance")
local effectiveCritLine = getSidebarLine("Effective Crit Chance")
assert.are.equal("PreEffectiveCritChance", critLine.breakdown)
assert.are.equal("OffHand.CritChance", actor.breakdown.PreEffectiveCritChance.breakdownSource)
assert.are.equal("CritChance", effectiveCritLine.breakdown)
local displayData = build:GetSidebarBreakdown(critLine.breakdown, critLine.modNames, critLine.ignoredSections, "player")
local hasModifierSection = false
for _, section in ipairs(displayData) do
hasModifierSection = hasModifierSection or section.modName ~= nil
end
assert.is_true(hasModifierSection)
build.configTab.input.enemyBlockChance = 25
build.configTab:BuildModList()
runCallback("OnFrame")
actor = build.calcsTab.mainEnv.player
assert.are.equal(actor.breakdown.OffHand.HitChance, actor.breakdown.HitChance)
end)
end)