-
Notifications
You must be signed in to change notification settings - Fork 443
Expand file tree
/
Copy pathTestBuildDisplayStats_spec.lua
More file actions
138 lines (121 loc) · 5.89 KB
/
Copy pathTestBuildDisplayStats_spec.lua
File metadata and controls
138 lines (121 loc) · 5.89 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
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
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("links resource sidebar stats to their breakdowns", function()
local expectedBreakdowns = {
LifeUnreserved = "LifeReserved",
LifeUnreservedPercent = "LifeReserved",
ManaUnreserved = "ManaReserved",
ManaUnreservedPercent = "ManaReserved",
SpiritUnreserved = "SpiritReserved",
SpiritUnreservedPercent = "SpiritReserved",
LifeLeechGainRate = "LifeLeech",
ManaLeechGainRate = "ManaLeech",
EnergyShieldLeechGainRate = "EnergyShieldLeech",
}
for _, statData in ipairs(build.displayStats) do
if expectedBreakdowns[statData.stat] then
assert.are.equal(expectedBreakdowns[statData.stat], statData.breakdown, statData.stat)
expectedBreakdowns[statData.stat] = nil
end
end
assert.is_nil(next(expectedBreakdowns))
end)
it("shows a breakdown for life reserved by a modifier", function()
build.itemsTab:CreateDisplayItemFromRaw("New Item\nGold Ring\nReserves 25% of Life")
build.itemsTab:AddDisplayItem()
runCallback("OnFrame")
local lifeLine = getSidebarLine("Unreserved Life")
assert.are.equal("LifeReserved", lifeLine.breakdown)
build:SetDisplayStat({ line = lifeLine, x = 0, y = 0, width = 300 }, false)
assert.is_true(build.controls.breakdown.shown)
end)
it("uses aggregate breakdowns for dual-wield attacks", function()
build.skillsTab:PasteSocketGroup("skillId:MeleeMaceMacePlayer Mace Strike 20/0 1")
build.itemsTab:CreateDisplayItemFromRaw("New Item\nMarauding Mace\nQuality: 0\n20% increased Attack Speed")
build.itemsTab:AddDisplayItem()
build.itemsTab:CreateDisplayItemFromRaw("New Item\nMarauding Mace\nQuality: 0")
build.itemsTab:AddDisplayItem()
runCallback("OnFrame")
local actor = build.calcsTab.mainEnv.player
assert.is_true(actor.mainSkill.activeEffect.statSet.skillFlags.bothWeaponAttack)
assert.matches("Simultaneous hits from each weapon", 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.not_matches("Effective Crit Chance:", 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\nShortsword\nQuality: 0")
build.itemsTab:AddDisplayItem()
build.itemsTab:CreateDisplayItemFromRaw("New Item\nSplintered Tower Shield\nQuality: 0")
build.itemsTab:AddDisplayItem()
build.skillsTab:PasteSocketGroup("Shield Wall 20/0 1")
build.configTab.input.enemyEvasion = 10000
build.configTab:BuildModList()
runCallback("OnFrame")
local actor = build.calcsTab.mainEnv.player
assert.is_falsy(actor.mainSkill.activeEffect.statSet.skillFlags.weapon1Attack)
assert.is_true(actor.mainSkill.activeEffect.statSet.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)