From 9181ba412bbfeaf3aa9dac0c0cc4c45c5d93bf07 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sun, 5 Jun 2022 14:56:15 +0200 Subject: [PATCH] Add tests for levels with quest sets using dummy maps Banner1.DUN, Banner2.DUN, SKngDO.DUN, Blind1.DUN are custom maps made to facilitate the tests that load map files as elements for generated levels. --- test/Fixtures.cmake | 16 +++++++++++ test/drlg_l1_test.cpp | 36 ++++++++++++++++++++++-- test/drlg_l2_test.cpp | 16 +++++++++++ test/drlg_l3_test.cpp | 13 +++++++++ test/drlg_l4_test.cpp | 8 ++++++ test/drlg_test.hpp | 4 ++- test/fixtures/Levels/L1Data/Banner1.DUN | Bin 0 -> 2180 bytes test/fixtures/Levels/L1Data/Banner2.DUN | Bin 0 -> 2180 bytes test/fixtures/Levels/L1Data/SKngDO.DUN | Bin 0 -> 1670 bytes test/fixtures/Levels/L2Data/Blind1.DUN | Bin 0 -> 4118 bytes test/fixtures/Levels/L4Data/diab1.DUN | Bin 0 -> 1228 bytes test/fixtures/Levels/L4Data/diab2a.DUN | Bin 0 -> 4492 bytes test/fixtures/Levels/L4Data/diab2b.DUN | Bin 0 -> 4492 bytes test/fixtures/Levels/L4Data/diab3a.DUN | Bin 0 -> 4118 bytes test/fixtures/Levels/L4Data/diab3b.DUN | Bin 0 -> 4118 bytes test/fixtures/Levels/L4Data/diab4a.DUN | Bin 0 -> 2758 bytes test/fixtures/Levels/L4Data/diab4b.DUN | Bin 0 -> 2758 bytes test/fixtures/diablo/10-879635115.dun | Bin 0 -> 54404 bytes test/fixtures/diablo/16-741281013.dun | Bin 0 -> 54404 bytes test/fixtures/diablo/7-1607627156.dun | Bin 0 -> 54404 bytes test/fixtures/hellfire/3-1512491184.dun | Bin 0 -> 54404 bytes test/fixtures/hellfire/4-1924296259.dun | Bin 0 -> 54404 bytes 22 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 test/fixtures/Levels/L1Data/Banner1.DUN create mode 100644 test/fixtures/Levels/L1Data/Banner2.DUN create mode 100644 test/fixtures/Levels/L1Data/SKngDO.DUN create mode 100644 test/fixtures/Levels/L2Data/Blind1.DUN create mode 100644 test/fixtures/Levels/L4Data/diab1.DUN create mode 100644 test/fixtures/Levels/L4Data/diab2a.DUN create mode 100644 test/fixtures/Levels/L4Data/diab2b.DUN create mode 100644 test/fixtures/Levels/L4Data/diab3a.DUN create mode 100644 test/fixtures/Levels/L4Data/diab3b.DUN create mode 100644 test/fixtures/Levels/L4Data/diab4a.DUN create mode 100644 test/fixtures/Levels/L4Data/diab4b.DUN create mode 100644 test/fixtures/diablo/10-879635115.dun create mode 100644 test/fixtures/diablo/16-741281013.dun create mode 100644 test/fixtures/diablo/7-1607627156.dun create mode 100644 test/fixtures/hellfire/3-1512491184.dun create mode 100644 test/fixtures/hellfire/4-1924296259.dun diff --git a/test/Fixtures.cmake b/test/Fixtures.cmake index 5a067bf8f..88dd52f27 100644 --- a/test/Fixtures.cmake +++ b/test/Fixtures.cmake @@ -10,8 +10,10 @@ set(devilutionx_fixtures diablo/5-1677631846.dun diablo/6-2034738122.dun diablo/7-680552750.dun + diablo/7-1607627156.dun diablo/8-1999936419.dun diablo/9-262005438.dun + diablo/10-879635115.dun diablo/10-1630062353.dun diablo/11-384626536.dun diablo/12-2104541047.dun @@ -19,10 +21,13 @@ set(devilutionx_fixtures diablo/14-717625719.dun diablo/15-1583642716-changed.dun diablo/15-1583642716.dun + diablo/16-741281013.dun hellfire/1-401921334.dun hellfire/2-128964898.dun + hellfire/3-1512491184.dun hellfire/3-1799396623.dun hellfire/4-1190318991.dun + hellfire/4-1924296259.dun hellfire/17-19770182.dun hellfire/18-1522546307.dun hellfire/19-125121312.dun @@ -31,6 +36,17 @@ set(devilutionx_fixtures hellfire/22-1191662129.dun hellfire/23-97055268.dun hellfire/24-1324803725.dun + Levels/L1Data/Banner1.DUN + Levels/L1Data/Banner2.DUN + Levels/L1Data/SKngDO.DUN + Levels/L2Data/Blind1.DUN + Levels/L4Data/diab1.DUN + Levels/L4Data/diab2a.DUN + Levels/L4Data/diab2b.DUN + Levels/L4Data/diab3a.DUN + Levels/L4Data/diab3b.DUN + Levels/L4Data/diab4a.DUN + Levels/L4Data/diab4b.DUN ) foreach(fixture ${devilutionx_fixtures}) diff --git a/test/drlg_l1_test.cpp b/test/drlg_l1_test.cpp index 69be04f57..39d0ac6e1 100644 --- a/test/drlg_l1_test.cpp +++ b/test/drlg_l1_test.cpp @@ -44,6 +44,7 @@ TEST(Drlg_l1, CreateL5Dungeon_diablo_2_1383137027) Quests[Q_PWATER]._qlevel = 2; Quests[Q_PWATER]._qactive = QUEST_INIT; + Quests[Q_BUTCHER]._qactive = QUEST_NOTAVAIL; TestCreateDungeon(2, 1383137027, ENTRY_MAIN); EXPECT_EQ(ViewPosition, Point(57, 74)); @@ -56,6 +57,7 @@ TEST(Drlg_l1, CreateL5Dungeon_diablo_3_844660068) LoadExpectedLevelData("diablo/3-844660068.dun"); MyPlayer->pOriginalCathedral = true; + Quests[Q_SKELKING]._qactive = QUEST_NOTAVAIL; TestCreateDungeon(3, 844660068, ENTRY_MAIN); EXPECT_EQ(ViewPosition, Point(67, 52)); @@ -68,6 +70,7 @@ TEST(Drlg_l1, CreateL5Dungeon_diablo_4_609325643) LoadExpectedLevelData("diablo/4-609325643.dun"); MyPlayer->pOriginalCathedral = true; + Quests[Q_LTBANNER]._qactive = QUEST_NOTAVAIL; TestCreateDungeon(4, 609325643, ENTRY_MAIN); EXPECT_EQ(ViewPosition, Point(85, 78)); @@ -93,6 +96,7 @@ TEST(Drlg_l1, CreateL5Dungeon_hellfire_2_128964898) MyPlayer->pOriginalCathedral = false; Quests[Q_PWATER]._qactive = QUEST_NOTAVAIL; + Quests[Q_BUTCHER]._qactive = QUEST_NOTAVAIL; TestCreateDungeon(2, 128964898, ENTRY_MAIN); EXPECT_EQ(ViewPosition, Point(55, 68)); @@ -105,6 +109,7 @@ TEST(Drlg_l1, CreateL5Dungeon_hellfire_3_1799396623) LoadExpectedLevelData("hellfire/3-1799396623.dun"); MyPlayer->pOriginalCathedral = false; + Quests[Q_SKELKING]._qactive = QUEST_NOTAVAIL; TestCreateDungeon(3, 1799396623, ENTRY_MAIN); EXPECT_EQ(ViewPosition, Point(59, 68)); @@ -112,11 +117,26 @@ TEST(Drlg_l1, CreateL5Dungeon_hellfire_3_1799396623) EXPECT_EQ(ViewPosition, Point(47, 55)); } +TEST(Drlg_l1, CreateL5Dungeon_hellfire_3_1512491184) +{ + LoadExpectedLevelData("hellfire/3-1512491184.dun"); + + MyPlayer->pOriginalCathedral = false; + Quests[Q_SKELKING]._qlevel = 3; + Quests[Q_SKELKING]._qactive = QUEST_INIT; + + TestCreateDungeon(3, 1512491184, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(47, 72)); + TestCreateDungeon(3, 1512491184, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(79, 45)); +} + TEST(Drlg_l1, CreateL5Dungeon_hellfire_4_1190318991) { LoadExpectedLevelData("hellfire/4-1190318991.dun"); MyPlayer->pOriginalCathedral = false; + Quests[Q_LTBANNER]._qactive = QUEST_NOTAVAIL; TestCreateDungeon(4, 1190318991, ENTRY_MAIN); EXPECT_EQ(ViewPosition, Point(67, 80)); @@ -124,6 +144,20 @@ TEST(Drlg_l1, CreateL5Dungeon_hellfire_4_1190318991) EXPECT_EQ(ViewPosition, Point(77, 45)); } +TEST(Drlg_l1, CreateL5Dungeon_hellfire_4_1924296259) +{ + LoadExpectedLevelData("hellfire/4-1924296259.dun"); + + MyPlayer->pOriginalCathedral = false; + Quests[Q_LTBANNER]._qlevel = 4; + Quests[Q_LTBANNER]._qactive = QUEST_INIT; + + TestCreateDungeon(4, 1924296259, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(83, 54)); + TestCreateDungeon(4, 1924296259, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(52, 88)); +} + TEST(Drlg_l1, CreateL5Dungeon_crypt_1_2122696790) { LoadExpectedLevelData("hellfire/21-2122696790.dun"); @@ -138,8 +172,6 @@ TEST(Drlg_l1, CreateL5Dungeon_crypt_2_1191662129) { LoadExpectedLevelData("hellfire/22-1191662129.dun"); - Quests[Q_PWATER]._qactive = QUEST_NOTAVAIL; - TestCreateDungeon(22, 1191662129, ENTRY_MAIN); EXPECT_EQ(ViewPosition, Point(71, 47)); TestCreateDungeon(22, 1191662129, ENTRY_PREV); diff --git a/test/drlg_l2_test.cpp b/test/drlg_l2_test.cpp index 55d8aba87..73c622f6c 100644 --- a/test/drlg_l2_test.cpp +++ b/test/drlg_l2_test.cpp @@ -3,6 +3,7 @@ #include "drlg_test.hpp" #include "gendung.h" +#include "quests.h" using namespace devilution; @@ -32,12 +33,27 @@ TEST(Drlg_l2, CreateL2Dungeon_diablo_7_680552750) { LoadExpectedLevelData("diablo/7-680552750.dun"); + Quests[Q_BLIND]._qactive = QUEST_NOTAVAIL; + TestCreateDungeon(7, 680552750, ENTRY_MAIN); EXPECT_EQ(ViewPosition, Point(27, 26)); TestCreateDungeon(7, 680552750, ENTRY_PREV); EXPECT_EQ(ViewPosition, Point(78, 52)); } +TEST(Drlg_l2, CreateL2Dungeon_diablo_7_1607627156) +{ + LoadExpectedLevelData("diablo/7-1607627156.dun"); + + Quests[Q_BLIND]._qlevel = 7; + Quests[Q_BLIND]._qactive = QUEST_INIT; + + TestCreateDungeon(7, 1607627156, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(53, 26)); + TestCreateDungeon(7, 1607627156, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(50, 88)); +} + TEST(Drlg_l2, CreateL2Dungeon_diablo_8_1999936419) { LoadExpectedLevelData("diablo/8-1999936419.dun"); diff --git a/test/drlg_l3_test.cpp b/test/drlg_l3_test.cpp index f924e8754..0b0469e35 100644 --- a/test/drlg_l3_test.cpp +++ b/test/drlg_l3_test.cpp @@ -31,6 +31,19 @@ TEST(Drlg_l3, CreateL3Dungeon_diablo_10_1630062353) EXPECT_EQ(ViewPosition, Point(19, 47)); } +TEST(Drlg_l3, CreateL3Dungeon_diablo_10_879635115) +{ + LoadExpectedLevelData("diablo/10-879635115.dun"); + + Quests[Q_ANVIL]._qlevel = 10; + Quests[Q_ANVIL]._qactive = QUEST_INIT; + + TestCreateDungeon(10, 879635115, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(75, 41)); + TestCreateDungeon(10, 879635115, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(27, 45)); +} + TEST(Drlg_l3, CreateL3Dungeon_diablo_11_384626536) { LoadExpectedLevelData("diablo/11-384626536.dun"); diff --git a/test/drlg_l4_test.cpp b/test/drlg_l4_test.cpp index 2c4a26b0b..53f1f6b6a 100644 --- a/test/drlg_l4_test.cpp +++ b/test/drlg_l4_test.cpp @@ -50,4 +50,12 @@ TEST(Drlg_l4, CreateL4Dungeon_diablo_15_1583642716) EXPECT_EQ(ViewPosition, Point(87, 69)); } +TEST(Drlg_l4, CreateL4Dungeon_diablo_16_741281013) +{ + LoadExpectedLevelData("diablo/16-741281013.dun"); + + TestCreateDungeon(16, 741281013, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(58, 42)); +} + } // namespace diff --git a/test/drlg_test.hpp b/test/drlg_test.hpp index 85199b7d8..8d01f6926 100644 --- a/test/drlg_test.hpp +++ b/test/drlg_test.hpp @@ -36,9 +36,11 @@ std::unique_ptr DunData; void LoadExpectedLevelData(const char *fixture) { + std::string dunPath = "test/fixtures/"; + paths::SetPrefPath(paths::BasePath()); + paths::SetAssetsPath(paths::BasePath() + "/" + dunPath); - std::string dunPath = "test/fixtures/"; dunPath.append(fixture); DunData = LoadFileInMem(dunPath.c_str()); ASSERT_NE(DunData, nullptr) << "Unable to load test fixture " << dunPath; diff --git a/test/fixtures/Levels/L1Data/Banner1.DUN b/test/fixtures/Levels/L1Data/Banner1.DUN new file mode 100644 index 0000000000000000000000000000000000000000..7349963d2a27f60060fc47c080769f910f2e3460 GIT binary patch literal 2180 zcmd;J;9#H*=s+{3ouQMV9SC8d4aOLyM?-+>As`Pn5keviN9V(2aEUW8;Ff{u9Sk%t U&=DX!3PwXFjPOp6b7K_p-8p` dFa$#F8Kp);U^E0qLtr!nMnhmU1V&N_007Po4XywH literal 0 HcmV?d00001 diff --git a/test/fixtures/Levels/L1Data/SKngDO.DUN b/test/fixtures/Levels/L1Data/SKngDO.DUN new file mode 100644 index 0000000000000000000000000000000000000000..33a6fece9823f20ea13bcb2b33a09c08fc5f4ccf GIT binary patch literal 1670 zcmZQ)U}xY(gQ5(=P#6M~5n>Pn!@~@5NW3Eql}J1>pxi{bN->6DhCYT+h5#rGWEcgb SAut*OqaiRF0;3^-Ed&6_O$g%v literal 0 HcmV?d00001 diff --git a/test/fixtures/Levels/L2Data/Blind1.DUN b/test/fixtures/Levels/L2Data/Blind1.DUN new file mode 100644 index 0000000000000000000000000000000000000000..ed1030d196db82e9c442a2e2447a0da1f7aa91c0 GIT binary patch literal 4118 zcmeH@Q3``F5JblYOvP(yq4vWIh#>yjdZ8Y+v!Sj*kKkkpI}Dr5@@mw$56;w|Nk6wjkVErL)gQLq@``RUM}e|*oL-5bfgVk zdER-gc=hyPw4s*V$7}=Yc?XVxv*NR%nmV36XXET>7f|7@nT6$85!@=oq74mExP76* z6;u?!6|@e$qSKC}SWR@f1oMRJxSChG(u1P|?K!W1so>S{!G<|t4wwTaIdGY5X8KmA zMrJ&5r(?}sK0b}MFn)u74Hkx{JP+vb=2tYT4;4bu!ItNxYN985LbZ%W{rh!bCjMWK0lkN-1^&RZ@%wIfX<8^qgPzE;fwr?d)7=RL3S<;H zZWJlb6fGkLE3pCi&Cn2jV9eCJF!+_u?vZ_hgsXrzUKCrdxuD`T!w!3jglQEk7|jMX zMcLI#*7hJbRNRTXA5@#;#N5_3;dR>JPP5fCUCPRSuO30S>VP_+4*bo5$E4DeGx7!O z>hH#>(~9Huf{w8a=I;H*p38;mAu^}&Yd-$Q;mnpf#N#^hSyst0L&W9!J6}gK!VU30 iFYaXfuxlJ^jaA1r4y7|Kc0m7!#nvfN9Z&~W>c9uy(-b!V literal 0 HcmV?d00001 diff --git a/test/fixtures/Levels/L4Data/diab3b.DUN b/test/fixtures/Levels/L4Data/diab3b.DUN new file mode 100644 index 0000000000000000000000000000000000000000..beb9fc28764783fe67d69550044a0e04245e3144 GIT binary patch literal 4118 zcmeH@O%8%E6ofx9AtA6Z#*6T`P&bA|cX%7)^_{*#dI*OJElj7cuU|_`Ej2u)iih+L zCwU!5h__~y--nm-MaiG_U!MFuGe!!&e56xkMuwPc&RnEJY#UTLS6o@7E;2n+tnNMJ z6Q<~-oR6{%SBVB{J(%lx_uG+j@$)gFFfC-p@37CKhn1BhGfC-p@3H&#K EADK%Fq5uE@ literal 0 HcmV?d00001 diff --git a/test/fixtures/Levels/L4Data/diab4a.DUN b/test/fixtures/Levels/L4Data/diab4a.DUN new file mode 100644 index 0000000000000000000000000000000000000000..8a6463a64a8e00def9d59ea8ee29c03ae76f705f GIT binary patch literal 2758 zcmeHD%MQXI5S;cv(v!dAt=gs@P5+=Z9@^*dq#)6F^mh= zWR^uWHaK9*)46wb=sy?=Re^s};2b^^QAiQYA&4lXRzZ4KjHgwOEyQX>-w8{SjuVo? pO6Y&%r+AzHzh7qo!pNT?&laY{`Cgdf^O@SI3aA3AfGUuyzzau76_Nk| literal 0 HcmV?d00001 diff --git a/test/fixtures/Levels/L4Data/diab4b.DUN b/test/fixtures/Levels/L4Data/diab4b.DUN new file mode 100644 index 0000000000000000000000000000000000000000..f03aa30090c839f258966c5db539db14ac5a43f6 GIT binary patch literal 2758 zcmeH@TMEK35Je9bgzl$>_$3Gx1S#&I?RR~)`v>Py!A0B&xm<2ClW=Nkt`rVr6?XLO zV`Va$Z@HMxJa{u$?B`y0UMx)Eo6sj8)-5?kGT2?;UOs0Gmy+-Nrsdp*%K8guI!^YR Xj@w^{tO$sJ2#A0Ph=2%)fC#`BLjVim literal 0 HcmV?d00001 diff --git a/test/fixtures/diablo/10-879635115.dun b/test/fixtures/diablo/10-879635115.dun new file mode 100644 index 0000000000000000000000000000000000000000..e75dd19eaae5f88dd5cbbe1ed8d88f0c5aba0e26 GIT binary patch literal 54404 zcmeI5-EZ7P6vc1SG)~wig(RdTG?3B;<$-S!-gt;8kBE{=v`8(ePyuz)*G5W3X&*`z zcmoOebGc`(r)$Ud*6a0p$LPe`_1DaqGrxQ1+DRX}E!#5Jf$h7T$6Ki@x1=X8$>+NL zB;Tj5m(8pv-)j5U#7+r&Y-eTGwe2~7vCPQbRNtN(`(`17hw`ettlK;K zIWH@!3_mj&wMfT0lhT`aWBW0)9*@<_w9e{KU2VwQvMz7vk?GB=bFhn^`?bDC!P;ci z=48sv?4fF{%Ug0uw~MZKPh*N$>?CSE`Bk3CBmF#)$9m`Bl;^DOvAij-%aufLL1PXr zc#d^Hqw)4}Ho|bcn9L%pWM>zY-b$i*+07Vgf6H(3k8@&b@cM~f2cg+yW<_e4^`g9@ ztz%hpGmd3f`<>|diCzW6L*3g3x*y9&srVFW&TE`koZgmfx>=eQ^sYN4%cLDuUXTyu zL*@CnFk@_8U`Fpcy^BumGd=%T{*>Q!zc1JH+J@s`K8IhKK|{ zk$fdz>XkK(JkD^$o9-Nnmb2yl5D!}? zh%)-k$W_(w^Fqd3G)&zxsH{f(;xg3wE~yrdW?amXXUGj?05lPIxJK0|cX#aOv#jeE zGd^%@!sqmY#_^FnO;&}`GpY+E(Y5SD)$+0P(eU&mdFEyd-#*J@9k+M|BQE!q-g)N_ z92z+vpwp^va6}6s@uATx3u1Dx@<%RGk%D<&zwQ@ z=H!C%T5=h^qTk!9wwZWE9otkrRFzrx!~&cC6Cvx%pP?G8sv_3h>hqQ5qhawt23cLi zb)1zyL$N+$tp}!HYuJuax53ZO5HaK@vZZ{+7U5VcAlgN)23~eL78&rfm4SK+Wwi27 z89&GL9{iBe7&S_wa7il-o+x1Xm%DE9KTwj3dS1TX=EV4!JB*Jg_zjUkrS|y*9q=h% zZ?@u~gOQC?_8aTLT*b+o$CUi&>O^{${bS@GGS#Yztpi*2ri*;>703I!Q@Gkp6aGQR zs)|)hDDCP8x%P*fAF^d|9q2nm=KJ>qtCm>%@NC@ueVmuA+rFAVx~dxXW&~Hr$!rv% zdN1>Cz7xuD|kObE>ve!rj)*Zry+M~ z&Eb!QKO{f`BtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr5HNv#^@dNlKViEAy|5il#@}A$ zglfv)o>U*RvN>(I*I0z%a2y`@o$5H0i#ZK9lDR8Z>R)Y+%y91d4qkjTKIIpW-Bt_C zG2D5Mx`L|Dta{7h$c);*Sk+%0U43)~@1?|_qQi3cyh8#_62NcreBw4ow0^3J;D1J-i8aD!MHiCddKXO6V@(2~{oN-$4ZNj?>@V##yyLKc$6;K<%b3&u62a$l zh%pM)6Ib+PBg4OvPnJJNZ<;_CpFiEGf^b>(7u=?!SWoXr>iw&Jz0uf<1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cx=CP4rh+z3f1`ybbbh1Fj=f2M1W14cNPq-LAZ!BD xG99$R(ESAskLE~#1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNFWdb{{bQd;b;H= literal 0 HcmV?d00001 diff --git a/test/fixtures/diablo/16-741281013.dun b/test/fixtures/diablo/16-741281013.dun new file mode 100644 index 0000000000000000000000000000000000000000..608aaec2df409903ff731cf68c76a2298182e846 GIT binary patch literal 54404 zcmeI4+m97R5XOt$WRpb&vr074;N9@%!p20ru@~4k)IY#vA%-UqMI^kQKi#gW>8a|T zneLgM8Rj70nVfT~r>nmD`Zu=&MsCmzy1vM^q0}ZlQyH7U)rR(Ir`pb|&(nHzOfvr1 zWpC)$YVR=}*Rx#lvwPoj?_=T|zisFe?IpH@N-v+IdS?l>J+gY&=q=~w*tue#ynJi;7ZtJHi+U(*-#u+s5*>Gg*GbgiQI6@5;h(WkZE~7J`O7SXPajQJ9*UZ>a#1_knlQk4nq%J+4+5Z zt{*viyuP{gJgeb)sb|Ao^2bB&3*EVPrTYAkr-**?`EaE<9#`CG$DJ!WuhE$22d`HM z`jxl8EepNB?7Q<+o>#~9eNeP6oE{(H{;f-I-<|7v-?;A-<(jxzxf6%`?hdfy-lx^` zXs78K>YcdGtQPiXMc%{b%Tav?v{x@*)BZ{g^?0w%^tzJ$uu_$MeDy!3Kk4sCzpdvx zy`&dzd$-a!sXiYxcW3GPg#My`>iesA(bkju4qpZDyG_((pWf}|ZugX)(eqkQtMm-q zRL=z8>3&69Sc<=E?s~V5FPv+B^X69-`s3%h%yXdxC8g%NE6Dx-i}qEbp!M@RWOt!M={C)$I*y~IbmKl4 zrwDW%@l^h+p8Iy@hSS%}j;5>3ysSpf^YY*9)W=QI)&$QglG{sjYd|ezBqo31`tZB- zb=X_jKhs+>`-HCc%xRyIJb}*KzkM^;>xmPZ%1_)ps@#b~-ZP)aDQj&zVUpy$PVpzJ zRBlr##w(oSE!1LfTaau2X*P(NJCMJMUf2(vw zyz1@#a|63u+o6){`t7&2yF8!u9d7s4rN3jg+b7(C00@8p2!H?xfB*=T63G1`UiTMa z&RyxM=cya-Zpz>AjP*R;-PjK8{NLNV+#dNG$Ihvaot!<7_s5mGe3JWDX#Gngzh_9t zKkDR1pP`##>`o#-u=*ef4`ge{v5j) zvtrHdKZ4%%&{eXg>RMi+Ab#8Xhw69bg+046bYK2Ss<~y6C+5FdMTwMX`eW?BOEge3 z2Z8?UWa=@V!`b1d>ijcrZ6AI8hqD`=+1CsEK>!3m00ck)1V8`;KmY_l00ck) z1YQRMM+=x-LURF|kOTn`009sH0T2KI5C8!X009sH0T2KI5CDNKBY?kI+p+@!J0Ji8 zAOHey1OYsM--yGEMS=hbfB*=900@8p2!H?xfWV9dE>ZbrZIr8AvNElBimp|jOD8rs zm+o9T@K-`Irl#W(HLaOnM-?T~UL}#Ll~iku>co-eltijlQmr+r6Gxg;5~*5AwbrOk z9BEETq-rJATBAB~q&X##s+Cl0jq1da=9EOLR#L4ssuM?=Qxd6KNwwCfP8?~@_{eIF zueKFdDU5B_dU5EFt>?*hwvNKsW~~>8p6qBnPqwpl6vj4dy*Tt_N9%dAovouVwpr`Np(i_9&y($J z9fh&Y8XL3H*qZMA(32f?=jZqC&`u?j&m59r9mVmG`Z$N2yY^O2Gxjun+;-=QPS>78 z0sf{@1V8YbMqr-m@I0JHa}JeV+O1@)zd3Yc4eqn{7JIVewY^Dy>nM!jZwP^qnH>$O zUOvY<3ghK_59ttkvZEo@%jZ}}VZ40rAss?bb~L1V`5fygjF;~{q(kV*j)qh(pJN?` z@$$WgbO=4!(U9upbF8BAKvkYUMK1^Qsd^>AKvks^v1%^Qsd^>AKvks^v1%^Qsd^>AKvks^v1%^Qsd^ z>AKvks^v1%^Qsd^>AKvks^v1%^Qsd^>AKvks^v1%^Qsd^>AKvks^v1%^Qsd^>AKvk zs^v1%^Qsd^>AKvks^v1%^Qsd^>AKvks^v1%^Qsd^>AKvks^v1%^Qsd^>AKvks^v1% Z^QzO1(v|61tCr48&srVCAh0HZ{{TS88j=72 literal 0 HcmV?d00001 diff --git a/test/fixtures/diablo/7-1607627156.dun b/test/fixtures/diablo/7-1607627156.dun new file mode 100644 index 0000000000000000000000000000000000000000..f79c22c51aa148be4a827c9a58387812b3c3c905 GIT binary patch literal 54404 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/hellfire/3-1512491184.dun b/test/fixtures/hellfire/3-1512491184.dun new file mode 100644 index 0000000000000000000000000000000000000000..281dfc9c75601946db083592993261a3936c8052 GIT binary patch literal 54404 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