Skip to content

Commit

Permalink
Test paths fixes
Browse files Browse the repository at this point in the history
1. Load assets from the bundle on Mac.
2. In timedemo_test, load MPQs before overriding pref path,
   so that they can also be loaded from the user/system location.
3. Fix various double directory separators ("build//assets" etc).
  • Loading branch information
glebm committed Dec 12, 2024
1 parent f798556 commit 05d5c88
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 99 deletions.
190 changes: 95 additions & 95 deletions test/drlg_test.hpp
Original file line number Diff line number Diff line change
@@ -1,95 +1,95 @@
/**
* @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<uint16_t[]> 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<uint16_t>(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<MegaTile[]>(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<uint8_t>(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<uint8_t>(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 "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<uint16_t[]> 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<uint16_t>(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<MegaTile[]>(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<uint8_t>(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<uint8_t>(SDL_SwapLE16(*transparentLayer));
transparentLayer++;
ASSERT_EQ(dTransVal[x][y], sectorId) << "Room/region indexes don't match at " << x << "x" << y;
}
}
}
6 changes: 6 additions & 0 deletions test/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include "diablo.h"
#include "options.h"
#include "utils/paths.h"

int main(int argc, char **argv)
{
Expand All @@ -13,6 +14,11 @@ int main(int argc, char **argv)
devilution::sgOptions.Graphics.hardwareCursor.SetValue(false);
#endif

#if __APPLE__
devilution::paths::SetAssetsPath(
devilution::paths::BasePath() + "devilutionx.app/Contents/Resources/");
#endif

testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
8 changes: 5 additions & 3 deletions test/timedemo_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,18 @@ void RunTimedemo(std::string timedemoFolderName)
<= -1) {
ErrSdl();
}
std::string unitTestFolderCompletePath = paths::BasePath() + "/test/fixtures/timedemo/" + timedemoFolderName;
paths::SetPrefPath(unitTestFolderCompletePath);
paths::SetConfigPath(unitTestFolderCompletePath);

LoadCoreArchives();
LoadGameArchives();

// The tests need spawn.mpq or diabdat.mpq
// 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();
Expand Down
2 changes: 1 addition & 1 deletion test/writehero_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ TEST(Writehero, pfile_write_hero)
// Please provide them so that the tests can run successfully
ASSERT_TRUE(HaveSpawn() || HaveDiabdat());

paths::SetPrefPath(".");
paths::SetPrefPath(paths::BasePath());
std::remove("multi_0.sv");

gbVanilla = true;
Expand Down

0 comments on commit 05d5c88

Please sign in to comment.