diff --git a/test/drlg_l1_test.cpp b/test/drlg_l1_test.cpp index fb4bc154057..485fd529f5d 100644 --- a/test/drlg_l1_test.cpp +++ b/test/drlg_l1_test.cpp @@ -205,7 +205,6 @@ TEST(Drlg_l1, CreateL5Dungeon_crypt_1_2122696790) { LoadExpectedLevelData("hellfire/21-2122696790.dun"); - paths::SetAssetsPath(paths::BasePath() + "/assets"); TestInitGame(); TestCreateDungeon(21, 2122696790, ENTRY_TWARPDN); @@ -244,7 +243,6 @@ TEST(Drlg_l1, CreateL5Dungeon_crypt_4_1324803725) { LoadExpectedLevelData("hellfire/24-1324803725.dun"); - paths::SetAssetsPath(paths::BasePath() + "/assets"); TestInitGame(); TestCreateDungeon(24, 1324803725, ENTRY_MAIN); diff --git a/test/drlg_test.hpp b/test/drlg_test.hpp index 9906116c4ff..4bd348c3575 100644 --- a/test/drlg_test.hpp +++ b/test/drlg_test.hpp @@ -1,95 +1,94 @@ -/** - * @file drlg_test.hpp - * - * Helpers for dungeon related tests. - */ -#pragma once - -#include "engine/load_file.hpp" -#include "levels/themes.h" -#include "multi.h" -#include "player.h" -#include "quests.h" -#include "utils/paths.h" - -using namespace devilution; - -int GetTileCount(dungeon_type levelType) -{ - switch (levelType) { - case DTYPE_TOWN: - return 376; - case DTYPE_CATHEDRAL: - return 206; - case DTYPE_CATACOMBS: - return 160; - case DTYPE_CAVES: - return 206; - case DTYPE_HELL: - return 137; - case DTYPE_NEST: - return 166; - case DTYPE_CRYPT: - return 217; - default: - app_fatal("Invalid level type"); - } -} - -std::unique_ptr DunData; - -void LoadExpectedLevelData(const char *fixture) -{ - std::string dunPath = "test/fixtures/"; - - paths::SetPrefPath(paths::BasePath()); - paths::SetAssetsPath(paths::BasePath() + "/" + dunPath); - - dunPath.append(fixture); - DunData = LoadFileInMem(dunPath.c_str()); - ASSERT_NE(DunData, nullptr) << "Unable to load test fixture " << dunPath; - ASSERT_EQ(WorldTileSize(DMAXX, DMAXY), GetDunSize(DunData.get())); -} - -void TestInitGame(bool fullQuests = true, bool originalCathedral = true) -{ - Players.resize(1); - MyPlayer = &Players[0]; - MyPlayer->pOriginalCathedral = originalCathedral; - - sgGameInitInfo.fullQuests = fullQuests ? 1 : 0; - gbIsMultiplayer = !fullQuests; - - InitQuests(); -} - -void TestCreateDungeon(int level, uint32_t seed, lvl_entry entry) -{ - currlevel = level; - leveltype = GetLevelType(level); - - pMegaTiles = std::make_unique(GetTileCount(leveltype)); - - CreateDungeon(seed, entry); - CreateThemeRooms(); - - 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; - } - } -} +/** + * @file drlg_test.hpp + * + * Helpers for dungeon related tests. + */ +#pragma once + +#include + +#include "engine/load_file.hpp" +#include "levels/themes.h" +#include "multi.h" +#include "player.h" +#include "quests.h" +#include "utils/paths.h" + +using namespace devilution; + +int GetTileCount(dungeon_type levelType) +{ + switch (levelType) { + case DTYPE_TOWN: + return 376; + case DTYPE_CATHEDRAL: + return 206; + case DTYPE_CATACOMBS: + return 160; + case DTYPE_CAVES: + return 206; + case DTYPE_HELL: + return 137; + case DTYPE_NEST: + return 166; + case DTYPE_CRYPT: + return 217; + default: + app_fatal("Invalid level type"); + } +} + +std::unique_ptr DunData; + +void LoadExpectedLevelData(const char *fixture) +{ + // Set look up path to the location to load set pieces from later: + paths::SetPrefPath(paths::BasePath() + "test/fixtures/"); + DunData = LoadFileInMem(fixture); + ASSERT_NE(DunData, nullptr) << "Unable to load test fixture " << fixture; + ASSERT_EQ(WorldTileSize(DMAXX, DMAXY), GetDunSize(DunData.get())); +} + +void TestInitGame(bool fullQuests = true, bool originalCathedral = true) +{ + Players.resize(1); + MyPlayer = &Players[0]; + MyPlayer->pOriginalCathedral = originalCathedral; + + sgGameInitInfo.fullQuests = fullQuests ? 1 : 0; + gbIsMultiplayer = !fullQuests; + + InitQuests(); +} + +void TestCreateDungeon(int level, uint32_t seed, lvl_entry entry) +{ + LevelSeeds[level] = std::nullopt; + currlevel = level; + leveltype = GetLevelType(level); + + pMegaTiles = std::make_unique(GetTileCount(leveltype)); + + CreateDungeon(seed, entry); + CreateThemeRooms(); + + 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; + } + } +} diff --git a/test/main.cpp b/test/main.cpp index a0941846e57..b686818d428 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -2,6 +2,7 @@ #include "diablo.h" #include "options.h" +#include "utils/paths.h" int main(int argc, char **argv) { @@ -13,6 +14,11 @@ int main(int argc, char **argv) devilution::sgOptions.Graphics.hardwareCursor.SetValue(false); #endif +#ifdef __APPLE__ + devilution::paths::SetAssetsPath( + devilution::paths::BasePath() + "devilutionx.app/Contents/Resources/"); +#endif + testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } diff --git a/test/timedemo_test.cpp b/test/timedemo_test.cpp index afb60a00a46..ac04292e42f 100644 --- a/test/timedemo_test.cpp +++ b/test/timedemo_test.cpp @@ -33,9 +33,7 @@ void RunTimedemo(std::string timedemoFolderName) <= -1) { ErrSdl(); } - std::string unitTestFolderCompletePath = paths::BasePath() + "/test/fixtures/timedemo/" + timedemoFolderName; - paths::SetPrefPath(unitTestFolderCompletePath); - paths::SetConfigPath(unitTestFolderCompletePath); + LoadCoreArchives(); LoadGameArchives(); @@ -43,6 +41,10 @@ void RunTimedemo(std::string timedemoFolderName) // Please provide them so that the tests can run successfully ASSERT_TRUE(HaveSpawn() || HaveDiabdat()); + std::string unitTestFolderCompletePath = paths::BasePath() + "test/fixtures/timedemo/" + timedemoFolderName; + paths::SetPrefPath(unitTestFolderCompletePath); + paths::SetConfigPath(unitTestFolderCompletePath); + InitKeymapActions(); LoadOptions(); LuaInitialize(); diff --git a/test/writehero_test.cpp b/test/writehero_test.cpp index e2c483d1d87..09f147c44dc 100644 --- a/test/writehero_test.cpp +++ b/test/writehero_test.cpp @@ -369,8 +369,9 @@ TEST(Writehero, pfile_write_hero) // Please provide them so that the tests can run successfully ASSERT_TRUE(HaveSpawn() || HaveDiabdat()); - paths::SetPrefPath("."); - std::remove("multi_0.sv"); + const std::string savePath = paths::BasePath() + "multi_0.sv"; + paths::SetPrefPath(paths::BasePath()); + RemoveFile(savePath.c_str()); gbVanilla = true; gbIsHellfire = false; @@ -397,11 +398,10 @@ TEST(Writehero, pfile_write_hero) AssertPlayer(Players[0]); pfile_write_hero(); - const char *path = "multi_0.sv"; uintmax_t fileSize; - ASSERT_TRUE(GetFileSize(path, &fileSize)); + ASSERT_TRUE(GetFileSize(savePath.c_str(), &fileSize)); size_t size = static_cast(fileSize); - FILE *f = std::fopen(path, "rb"); + FILE *f = OpenFile(savePath.c_str(), "rb"); ASSERT_TRUE(f != nullptr); std::unique_ptr data { new char[size] }; ASSERT_EQ(std::fread(data.get(), size, 1, f), 1);