From 0a71f1ffb39d3a3b8ae4e5c21f2fa96076b4daf6 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Fri, 3 Jun 2022 06:15:52 +0200 Subject: [PATCH] Test basic Hell levels --- test/CMakeLists.txt | 1 + test/Fixtures.cmake | 4 + test/drlg_l4_test.cpp | 86 ++++++++++++++++++ test/fixtures/diablo/13-428074402.dun | Bin 0 -> 54404 bytes test/fixtures/diablo/14-717625719.dun | Bin 0 -> 54404 bytes .../fixtures/diablo/15-1583642716-changed.dun | Bin 0 -> 54404 bytes test/fixtures/diablo/15-1583642716.dun | Bin 0 -> 54404 bytes 7 files changed, 91 insertions(+) create mode 100644 test/drlg_l4_test.cpp create mode 100644 test/fixtures/diablo/13-428074402.dun create mode 100644 test/fixtures/diablo/14-717625719.dun create mode 100644 test/fixtures/diablo/15-1583642716-changed.dun create mode 100644 test/fixtures/diablo/15-1583642716.dun diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index f3cfd1a3f..0c3676bbf 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -21,6 +21,7 @@ set(tests drlg_common_test drlg_l1_test drlg_l2_test + drlg_l4_test effects_test file_util_test inv_test diff --git a/test/Fixtures.cmake b/test/Fixtures.cmake index 107dcb47f..560f91b78 100644 --- a/test/Fixtures.cmake +++ b/test/Fixtures.cmake @@ -11,6 +11,10 @@ set(devilutionx_fixtures diablo/6-2034738122.dun diablo/7-680552750.dun diablo/8-1999936419.dun + diablo/13-428074402.dun + diablo/14-717625719.dun + diablo/15-1583642716.dun + diablo/15-1583642716-changed.dun hellfire/1-401921334.dun hellfire/2-128964898.dun hellfire/3-1799396623.dun diff --git a/test/drlg_l4_test.cpp b/test/drlg_l4_test.cpp new file mode 100644 index 000000000..6fa2c94d0 --- /dev/null +++ b/test/drlg_l4_test.cpp @@ -0,0 +1,86 @@ +#include +#include + +#include "drlg_l4.h" +#include "engine/load_file.hpp" +#include "gendung.h" +#include "quests.h" +#include "utils/paths.h" + +using namespace devilution; + +namespace { + +void TestCreateL4Dungeon(bool changed, int level, uint32_t seed, lvl_entry entry) +{ + pMegaTiles = std::make_unique(137); + leveltype = DTYPE_HELL; + + currlevel = level; + CreateL4Dungeon(seed, entry); + + std::string path = paths::BasePath(); + + paths::SetPrefPath(path); + std::string dunPath; + if (changed) + dunPath = fmt::format("test/fixtures/diablo/{}-{}-changed.dun", level, seed); + else + dunPath = fmt::format("test/fixtures/diablo/{}-{}.dun", level, seed); + auto dunData = LoadFileInMem(dunPath.c_str()); + ASSERT_NE(dunData, nullptr) << "Unable to load test fixture " << dunPath; + ASSERT_EQ(Size(DMAXX, DMAXY), Size(dunData[0], dunData[1])); + + const uint16_t *tileLayer = &dunData[2]; + + for (int y = 0; y < DMAXY; y++) { + for (int x = 0; x < DMAXX; x++) { + auto tileId = static_cast(SDL_SwapLE16(*tileLayer)); + tileLayer++; + ASSERT_EQ(dungeon[x][y], tileId) << "Tiles don't match at " << x << "x" << y; + } + } + + const uint16_t *transparentLayer = &dunData[2 + DMAXX * DMAXY * 13]; + + for (int y = 16; y < 16 + DMAXY * 2; y++) { + for (int x = 16; x < 16 + DMAXX * 2; x++) { + auto sectorId = static_cast(SDL_SwapLE16(*transparentLayer)); + transparentLayer++; + ASSERT_EQ(dTransVal[x][y], sectorId) << "Room/region indexes don't match at " << x << "x" << y; + } + } +} + +TEST(Drlg_l1, CreateL4Dungeon_diablo_13_428074402) +{ + TestCreateL4Dungeon(false, 13, 428074402, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(26, 64)); + TestCreateL4Dungeon(false, 13, 428074402, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(47, 79)); +} + +TEST(Drlg_l1, CreateL4Dungeon_diablo_14_717625719) +{ + TestCreateL4Dungeon(false, 14, 717625719, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(90, 64)); + TestCreateL4Dungeon(false, 14, 717625719, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(49, 31)); +} + +TEST(Drlg_l1, CreateL4Dungeon_diablo_15_1583642716) +{ + Quests[Q_DIABLO]._qactive = QUEST_INIT; + TestCreateL4Dungeon(false, 15, 1583642716, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(44, 26)); + TestCreateL4Dungeon(false, 15, 1583642716, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(87, 69)); + + Quests[Q_DIABLO]._qactive = QUEST_ACTIVE; + TestCreateL4Dungeon(true, 15, 1583642716, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(44, 26)); + TestCreateL4Dungeon(true, 15, 1583642716, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(87, 69)); +} + +} // namespace diff --git a/test/fixtures/diablo/13-428074402.dun b/test/fixtures/diablo/13-428074402.dun new file mode 100644 index 0000000000000000000000000000000000000000..d36a6dcd6f5049caaa28edda35259d14d7e5adad GIT binary patch literal 54404 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 Xg&Atmwp0Fd`_jy~cP_TYvjYDIH6}w3 literal 0 HcmV?d00001 diff --git a/test/fixtures/diablo/14-717625719.dun b/test/fixtures/diablo/14-717625719.dun new file mode 100644 index 0000000000000000000000000000000000000000..fad074639ba4c3e0452b495220028a94c28315ac GIT binary patch literal 54404 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/diablo/15-1583642716-changed.dun b/test/fixtures/diablo/15-1583642716-changed.dun new file mode 100644 index 0000000000000000000000000000000000000000..01237911169b68a6e4cd38ad95fde108344a0aec GIT binary patch literal 54404 zcmeHQX^-5-5$%zU0qn?0U}J3q4wO6aw`6zX$VVhaPUKv+5ga;)S7h@lSw zlAoP^U973@Cc9bWaE9F38e*4yRKNG?^}(5uAieG0c6au0J$LE#lDpMh_x=5Q4dZhs z?dbm|8^y{b?!Nmd;M{iWaGm?#XYSQ4-h-wcy+3!~agTiTBllq#^I^oha;Ht?WkA@t zpSYj7ABXZf!b99e6A4W4(Y0~Ea90iQOYXK;0i^X7_owbh?uYINzU4f@qtR!fow4W+ zz2pq3+jvaGow%p&yB_z_ec#vCZqtDW7bx=6NH0gOLhrf9K-8<=JDc3$bvH9Q(fe!21se=z_j8ht_q&33Qqv>` z95N&i5y|U-awdHb0^W&xEnIJgRlu$zAMU|u)VU9%-wI=>hfg-jm#}drVqIXJ@Sfow zUN6vsi`#i6@ya3}r1y?r&rhT4&E{Myw-Zx5zg#ALIM?s{bN5j=uha7$XEI&f4t;Ts zI3sYn(i&s+lvCWp`SR=`BVL*JqWML>I9-YLo8TYT4qei7%b(-i3U8r+pHS38o{@jF z&arqeG_*2ZGV?2!ozyO#rt>d=l7!7RT#HPaMs%%I@ht1KXaeE zzk3AMht&*jI`P-;OZP2Ddkr4E(X7m;z7=)q`D&ZRg?sFtxPL}?$dz{p_V1OWGXko4 zRmnWjdd8W-qyFap;rZK8j(tcpqR4*t_&mJ0cNQb-wQ-gQ>J(eJy>b?Zdxe`>N0F=@l~Ll=5_zfPYPO&2#`w#T4v+3qb{9nZf;Wo`f0`j}(i_nL-U-@bKe@Ry-) z87fMCrSFwAE4GAW?dE_vaQqIu=Tm%tWSV2gjig)5FnD%dUjN;*&@bGxJu~bIzni|3 zUFj9$$0^Zk`la*8TQAK;C+~lD){_I!E}3JmcdM7;bv`@DX$JdyXj$osEH zl>GGPs@9y+Nv|C*aW{KyiVs#A?f|d<{F}k)RwrrFes0Tk4A00$%;x|;fzI=(Z@!${ z%wwOAAG`mx!L}{$ZcEppFwf^G+aOMEX5@Mp*zytZP8d`kE@2Od$M0%HX2s3A-LX8G9v zF6*dCvq9#7IbaUV;=sz4uP#BiT>0vX-?go*4n6HxS>3I6u%e~T-`CqFsOjtLYooc! z?Dc6I?q8q2E{8QL$}#PX`!&=e+IVGdO-~!I#@^SLqiGb>V{$}S*}Z-0s6R%mb8C8I zG%D*<)S?8lrhs-%-~JISF4dXQ+vhPO>9}h-3_bsNf7Wu~7^u{6Yhom0oj0bBU5%Zi zvc?-t4A7XR`%Zk_ecVbh@ox>cCI*_gz@K`_bBdmAL6- zr1(+{wF_pMH)Srz2^N>i+#I1h!x3HLjeBZwX%@s^(^u|`dkCk-8|#CHQXX^ZOZAw( zcy{&gU)aUezjR&5TH#X6g*K_jWod1f7%AmtHTfOU-1dTdAq?iaAW4b&IF{>(;Bx&g zSjubB) zZb|cCZ(@bHpB$4blJ>Zi;^(zElFE5RT5rdrC01L0esqsb@$*`HOdgTe+wo{QW_|S) z)#XR(SX%3f-_5^n#A#c1nco*(`RY z^N*h!>8GAL-_TylD4ox|CRvN3v?LL(vO9)q6ZdjOX zoLp_^7g?2^>F&wLlpIUj`~A!Hp`LSfE0R`l=3`PFrCJyke#JUUWdxS{L=TnnvsN?! zM{2baBI#A)P20=*(vyfV%gm-P^%b@D%lyk-x;g8Qc1Yhoku{S$mDV+J62qm^`s04w zOEJ_gk*S`%Msay-S{E!X)wne=<m?iy}Q3=mVUyhfaPYg!jwT+(oBVt|)& zr8VYDTk{%6$-TzSQMDL8BN3ak4X-n!-0R$$Ucnl!Cm$hLT+%40$1oDzbH-uy6brRF zcfFV2-^8fH^yJYo5|!%;`g+@VIpeT;8?R46y}yk&Oiv!&#;f!9^|tZqySU!V@4;f! onu7k-86)Y+xnpU)jZxDVpKa}tV_Q;1X{`&hrm!pC+NO8l|6qJbMF0Q* literal 0 HcmV?d00001 diff --git a/test/fixtures/diablo/15-1583642716.dun b/test/fixtures/diablo/15-1583642716.dun new file mode 100644 index 0000000000000000000000000000000000000000..d516a8ba9a50da036e56fdfa12ffade5565af650 GIT binary patch literal 54404 zcmeHQYi}h-5p8dxDvV&kGg)0{=j|3J@L^`-1}k9`w{PvJLw`X1Hzg6 zuKT|GPN;7pJj7jek-!8WJ!kHR?yBQ`$=&rTfVA1-e$Rc|ean5*_naqqH2XC4GZvN5 zOU{tGGmnY5WB1g3)#F~eZ}`^6oeki@1&aJQ(#w%YVf5T%AnH}`@=-tn*5v@+iSGjw zA|Lzm#OH7k`pD^{kn3fatKh*Y%#`&wiX6i_J$JwG<$#eN`F}6FFNZVvj{B*5yQ|}5 zr@gQE$n+t+2VE~5J@Y&C)II7r&$g=~=T>UuCStITvQv>SXS#8(`}6inXw#0o2)m2w zh(m_tAtHGnP|l?9QNTNPuZ8E0unX9Af%FbC{I`lug~h{8WSf+vXS`w}?|-s3QfKkLMiwA(2X z`g3IbaT$1LlA^U=ElA=72e14wwVxfH`0em;>g3IbaT$1LlA^U=ElA=72e1 z4wwVxfH`0em;>g3IbaT$1LnYub>Nc)GyAm3jfi$s6J}z-r%LXn6fVW9w{!gp<6M?J z3$YHX!+}HWoj!+l4`}a(<<_#F+j3frd0q#!yR^)@J3<+IjuFu(wHB^EvW3(h|HK`V zt*yr*mT_R2U4XaGT=)AvGMGyn)^zPBZ6E%P+siGt=U2##bMC`&IqRZXr!IQ`QS-0F z{xuteIZ$)J_H@l18#4#Y0druy1IvAOp-KmV(etA zK1N>)YwmHnOL@(>oSS7AJh(^uYMIs3X=jDH=ru+y`CiqWkk(sYgOU2K+3i40&q#_f zzNOcx+wXcjomM@bPM?NV~p@XjA2`lL2L%T&ZQYLZ;mt&VkSRMu{m+8A@}yR2!b zjqO{P27ev;)}f;07j9-zsM)b4BNlz&k$0cPFMfb>2j})l7qD*X8HGdlvec zd$wnWUEz1rcf2dTV*WIRhfvlQ|4}={B9spNP8rt<1I}+-L5qyPw+QQcNcXWSwG&ty zTaPOmCBLi&-JCqDX^tMOyXO4=OYgX!`{Tlu(Jhrqn2BM(o;Yt!(|)xkF{WjN1Bcyx zweu@?!C^IxFl*<~4|YZv12E=Pj)@(kVaeFJz9;|Y07*O>@jZ4QpW@mnK69V7gJzFd z_T4;tItIA21JnLmQM!5mv$LKYfKJI0XC+rM)P^qHHPc)iLY%vAy~^g!^fuzwjbFAnf`$Q-=3W5;|;_%H{a(4GTh z0_~(JYyZpgP5=Bi6Y!qcIxQbt-C6f>~2QC#Q9O1dD5RW{kExW+WYVEr+r9AD_=!4jcoO8g5OD zWUTYX^s%e4b5z%Oqlp0;vkaHSH$29@6chi}aBE_K$t=Squ?~-MZ>)^!8g5Mt(3oYo zB);J>?xmRcw}x92159QaE{Sz`jC*5cRM&88Vt~dh!zJ+zk8v->#J@G%niya*%Wx^I z!{g}f|CG4tW~BI14D}0UnKxxF#|akK%G?~GyTcJ(;*CdYacLIBU(;6}i$@5j#vAK{ zhEg6&=}YyPzIb)@pI_L;)W39J$X?-E%!NK_$93uL*BB|~Wi@$;XzqK#y$~jITacv2 zd>qSdL~y-c3KsL!O7P6})OGQw=_~oo4%N$>(iO!b9J_^bIlA^bN&B;7!n1 zGQZ}>(41QQZvOFmBmLG>=Nmgp8Kvu)wu}zVs#{%rdj-OMOMF|6~5;F5RB}M<=9pPGryIPNi*4 zoWyXgwEuV}P1}OSwHmi3ru_XfW#+S)_oi)Tl(MFexiv9BOu6zF zapt{gTXbx${UdolXh%xU?+pJ1T4Ywu+h$&azBF?-wZHq3hX}C2pz)QLE7BS|% zX`59^so~bd05RptTf~|7rft#1H4V2W26!n~-Xg}lH*K>jDK*@h7$Bxxd5bvn-n1>c zxTfLO!~ielN?XjA_U0{)lCs9lQMDMpBN3akjc+rflyz>+s9=rPlg|(=u4xq1V;G6b zoN-(`#X_sjT_5GoH!Kr-6ts6|jHIjQj-~BBMonLQxAkXE?MW4-ts%^s!l8KUo8N)|1211k^Z)<= literal 0 HcmV?d00001