@@ -167,6 +167,113 @@ describe("TestAttacks", function()
167167 assert .are .equals (1.1 , build .calcsTab .mainOutput .MainHand .AverageHit )
168168 end )
169169
170+ it (" matches in-game tooltip DPS for low-level spear skills" , function ()
171+ build .spec :SelectClass (build .spec .tree .classNameMap .Huntress )
172+ build .characterLevel = 11
173+ build .characterLevelAutoMode = false
174+ build .controls .characterLevel :SetText (11 )
175+ build .configTab .input .customMods = [[
176+ 10% increased Attack Damage
177+ +10000 to Accuracy Rating
178+ nearby enemies have 100% less armour
179+ nearby enemies have 100% less evasion
180+ ]]
181+ build .configTab :BuildModList ()
182+ build .itemsTab :CreateDisplayItemFromRaw ([[
183+ Apocalypse Edge
184+ Ironhead Spear
185+ Item Level: 7
186+ Quality: 0
187+ LevelReq: 5
188+ Implicits: 1
189+ Grants Skill: Spear Throw
190+ Adds 2 to 4 Physical Damage
191+ ]] )
192+ build .itemsTab :AddDisplayItem ()
193+
194+ local skills = {
195+ { gemId = " Metadata/Items/Gems/SkillGemPlayerDefaultSpear" , level = 4 , dps = 32.8 },
196+ { gemId = " Metadata/Items/Gems/SkillGemWhirlingSlash" , level = 1 , dps = 11.8 },
197+ { gemId = " Metadata/Items/Gems/SkillGemPlayerDefaultSpearThrow" , level = 4 , dps = 28.8 },
198+ { gemId = " Metadata/Items/Gems/SkillGemTwister" , level = 2 , dps = 17.5 },
199+ }
200+ for _ , skill in ipairs (skills ) do
201+ local group = {
202+ enabled = true ,
203+ gemList = { {
204+ gemId = skill .gemId ,
205+ level = skill .level ,
206+ quality = 0 ,
207+ enabled = true ,
208+ count = 1 ,
209+ enableGlobal1 = true ,
210+ enableGlobal2 = true ,
211+ } },
212+ }
213+ table.insert (build .skillsTab .socketGroupList , group )
214+ build .skillsTab :ProcessSocketGroup (group )
215+ skill .groupIndex = # build .skillsTab .socketGroupList
216+ end
217+
218+ for _ , skill in ipairs (skills ) do
219+ local group = build .skillsTab .socketGroupList [skill .groupIndex ]
220+ build .mainSocketGroup = skill .groupIndex
221+ build .calcsTab .input .skill_number = skill .groupIndex
222+ group .mainActiveSkill = 1
223+ group .mainActiveSkillCalcs = 1
224+ build .buildFlag = true
225+ build .modFlag = true
226+ runCallback (" OnFrame" )
227+ build .calcsTab :BuildOutput ()
228+ runCallback (" OnFrame" )
229+
230+ assert .are .equals (skill .dps , round (build .calcsTab .mainOutput .TotalDPS , 1 ))
231+ end
232+ end )
233+
234+ it (" correctly calculates Garukhan's Resolve bifurcated critical hit damage" , function ()
235+ local function setup (socketGroup )
236+ newBuild ()
237+ build .itemsTab :CreateDisplayItemFromRaw ([[
238+ New Item
239+ Razor Quarterstaff
240+ Quality: 0
241+ This Weapon's Critical Hit Chance is 0%
242+ -100% increased physical damage
243+ adds 1 to 1 physical damage to attacks
244+ nearby enemies have 100% less armour
245+ nearby enemies have 100% less evasion
246+ ]] )
247+ build .itemsTab :AddDisplayItem ()
248+ runCallback (" OnFrame" )
249+ build .skillsTab :PasteSocketGroup (socketGroup )
250+ runCallback (" OnFrame" )
251+
252+ build .configTab .input .customMods = [[
253+ +50% to critical hit chance
254+ your critical damage bonus is 1000000%
255+ +4000 to accuracy
256+ ]]
257+ build .configTab :BuildModList ()
258+ runCallback (" OnFrame" )
259+ build .calcsTab :BuildOutput ()
260+ runCallback (" OnFrame" )
261+
262+ return build .calcsTab .mainOutput .MainHand
263+ end
264+
265+ local normalOutput = setup (" Quarterstaff Strike 1/0 1" )
266+ assert .are .equals (50 , normalOutput .CritChance )
267+ assert .are .equals (10001 , normalOutput .CritMultiplier )
268+ assert .are .equals (5001 , normalOutput .AverageHit )
269+
270+ local garukhanOutput = setup (" Quarterstaff Strike 1/0 1\n Garukhan's Resolve 1/0 1" )
271+ assert .are .equals (50 , garukhanOutput .PreBifurcateCritChance )
272+ assert .are .equals (75 , garukhanOutput .CritChance )
273+ assert .is_true (math.abs (1 / 3 - (garukhanOutput .CritBifurcates - 1 )) < 0.000001 )
274+ assert .is_true (math.abs (10001 - garukhanOutput .AverageHit ) < 0.01 )
275+ end )
276+
170277 it (" correctly adds damage with oracle forced outcome" , function ()
171278 -- Setup: Add weapon with no crit chance, and strip enemy defenses
172279 build .itemsTab :CreateDisplayItemFromRaw ([[
0 commit comments