Browse Source

Test paths fixes

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).
pull/7594/head
Gleb Mazovetskiy 1 year ago committed by Anders Jenbo
parent
commit
2b6ba8c853
  1. 2
      test/drlg_l1_test.cpp
  2. 188
      test/drlg_test.hpp
  3. 6
      test/main.cpp
  4. 7
      test/timedemo_test.cpp
  5. 13
      test/writehero_test.cpp

2
test/drlg_l1_test.cpp

@ -205,7 +205,6 @@ TEST(Drlg_l1, CreateL5Dungeon_crypt_1_2122696790)
{ {
LoadExpectedLevelData("hellfire/21-2122696790.dun"); LoadExpectedLevelData("hellfire/21-2122696790.dun");
paths::SetAssetsPath(paths::BasePath() + "/assets");
TestInitGame(); TestInitGame();
TestCreateDungeon(21, 2122696790, ENTRY_TWARPDN); TestCreateDungeon(21, 2122696790, ENTRY_TWARPDN);
@ -244,7 +243,6 @@ TEST(Drlg_l1, CreateL5Dungeon_crypt_4_1324803725)
{ {
LoadExpectedLevelData("hellfire/24-1324803725.dun"); LoadExpectedLevelData("hellfire/24-1324803725.dun");
paths::SetAssetsPath(paths::BasePath() + "/assets");
TestInitGame(); TestInitGame();
TestCreateDungeon(24, 1324803725, ENTRY_MAIN); TestCreateDungeon(24, 1324803725, ENTRY_MAIN);

188
test/drlg_test.hpp

@ -1,95 +1,93 @@
/** /**
* @file drlg_test.hpp * @file drlg_test.hpp
* *
* Helpers for dungeon related tests. * Helpers for dungeon related tests.
*/ */
#pragma once #pragma once
#include "engine/load_file.hpp" #include <gtest/gtest.h>
#include "levels/themes.h"
#include "multi.h" #include "engine/load_file.hpp"
#include "player.h" #include "levels/themes.h"
#include "quests.h" #include "multi.h"
#include "utils/paths.h" #include "player.h"
#include "quests.h"
using namespace devilution; #include "utils/paths.h"
int GetTileCount(dungeon_type levelType) using namespace devilution;
{
switch (levelType) { int GetTileCount(dungeon_type levelType)
case DTYPE_TOWN: {
return 376; switch (levelType) {
case DTYPE_CATHEDRAL: case DTYPE_TOWN:
return 206; return 376;
case DTYPE_CATACOMBS: case DTYPE_CATHEDRAL:
return 160; return 206;
case DTYPE_CAVES: case DTYPE_CATACOMBS:
return 206; return 160;
case DTYPE_HELL: case DTYPE_CAVES:
return 137; return 206;
case DTYPE_NEST: case DTYPE_HELL:
return 166; return 137;
case DTYPE_CRYPT: case DTYPE_NEST:
return 217; return 166;
default: case DTYPE_CRYPT:
app_fatal("Invalid level type"); return 217;
} default:
} app_fatal("Invalid level type");
}
std::unique_ptr<uint16_t[]> DunData; }
void LoadExpectedLevelData(const char *fixture) std::unique_ptr<uint16_t[]> DunData;
{
std::string dunPath = "test/fixtures/"; void LoadExpectedLevelData(const char *fixture)
{
paths::SetPrefPath(paths::BasePath()); // Set look up path to the location to load set pieces from later:
paths::SetAssetsPath(paths::BasePath() + "/" + dunPath); paths::SetPrefPath(paths::BasePath() + "test/fixtures/");
DunData = LoadFileInMem<uint16_t>(fixture);
dunPath.append(fixture); ASSERT_NE(DunData, nullptr) << "Unable to load test fixture " << fixture;
DunData = LoadFileInMem<uint16_t>(dunPath.c_str()); ASSERT_EQ(Size(DMAXX, DMAXY), Size(SDL_SwapLE16(DunData[0]), SDL_SwapLE16(DunData[1])));
ASSERT_NE(DunData, nullptr) << "Unable to load test fixture " << dunPath; }
ASSERT_EQ(Size(DMAXX, DMAXY), Size(SDL_SwapLE16(DunData[0]), SDL_SwapLE16(DunData[1])));
} void TestInitGame(bool fullQuests = true, bool originalCathedral = true)
{
void TestInitGame(bool fullQuests = true, bool originalCathedral = true) Players.resize(1);
{ MyPlayer = &Players[0];
Players.resize(1); MyPlayer->pOriginalCathedral = originalCathedral;
MyPlayer = &Players[0];
MyPlayer->pOriginalCathedral = originalCathedral; sgGameInitInfo.fullQuests = fullQuests ? 1 : 0;
gbIsMultiplayer = !fullQuests;
sgGameInitInfo.fullQuests = fullQuests ? 1 : 0;
gbIsMultiplayer = !fullQuests; InitQuests();
}
InitQuests();
} void TestCreateDungeon(int level, uint32_t seed, lvl_entry entry)
{
void TestCreateDungeon(int level, uint32_t seed, lvl_entry entry) currlevel = level;
{ leveltype = GetLevelType(level);
currlevel = level;
leveltype = GetLevelType(level); pMegaTiles = std::make_unique<MegaTile[]>(GetTileCount(leveltype));
pMegaTiles = std::make_unique<MegaTile[]>(GetTileCount(leveltype)); CreateDungeon(seed, entry);
CreateThemeRooms();
CreateDungeon(seed, entry);
CreateThemeRooms(); const uint16_t *tileLayer = &DunData[2];
const uint16_t *tileLayer = &DunData[2]; for (int y = 0; y < DMAXY; y++) {
for (int x = 0; x < DMAXX; x++) {
for (int y = 0; y < DMAXY; y++) { auto tileId = static_cast<uint8_t>(SDL_SwapLE16(*tileLayer));
for (int x = 0; x < DMAXX; x++) { tileLayer++;
auto tileId = static_cast<uint8_t>(SDL_SwapLE16(*tileLayer)); ASSERT_EQ(dungeon[x][y], tileId) << "Tiles don't match at " << x << "x" << y;
tileLayer++; }
ASSERT_EQ(dungeon[x][y], tileId) << "Tiles don't match at " << x << "x" << y; }
}
} const uint16_t *transparentLayer = &DunData[2 + DMAXX * DMAXY * 13];
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++) {
for (int y = 16; y < 16 + DMAXY * 2; y++) { auto sectorId = static_cast<uint8_t>(SDL_SwapLE16(*transparentLayer));
for (int x = 16; x < 16 + DMAXX * 2; x++) { transparentLayer++;
auto sectorId = static_cast<uint8_t>(SDL_SwapLE16(*transparentLayer)); ASSERT_EQ(dTransVal[x][y], sectorId) << "Room/region indexes don't match at " << x << "x" << y;
transparentLayer++; }
ASSERT_EQ(dTransVal[x][y], sectorId) << "Room/region indexes don't match at " << x << "x" << y; }
} }
}
}

6
test/main.cpp

@ -2,6 +2,7 @@
#include "diablo.h" #include "diablo.h"
#include "options.h" #include "options.h"
#include "utils/paths.h"
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
@ -13,6 +14,11 @@ int main(int argc, char **argv)
devilution::sgOptions.Graphics.hardwareCursor.SetValue(false); devilution::sgOptions.Graphics.hardwareCursor.SetValue(false);
#endif #endif
#ifdef __APPLE__
devilution::paths::SetAssetsPath(
devilution::paths::BasePath() + "devilutionx.app/Contents/Resources/");
#endif
testing::InitGoogleTest(&argc, argv); testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS(); return RUN_ALL_TESTS();
} }

7
test/timedemo_test.cpp

@ -20,9 +20,6 @@ bool Dummy_GetHeroInfo(_uiheroinfo *pInfo)
void RunTimedemo(std::string timedemoFolderName) void RunTimedemo(std::string timedemoFolderName)
{ {
std::string unitTestFolderCompletePath = paths::BasePath() + "/test/fixtures/timedemo/" + timedemoFolderName;
paths::SetPrefPath(unitTestFolderCompletePath);
paths::SetConfigPath(unitTestFolderCompletePath);
LoadCoreArchives(); LoadCoreArchives();
LoadGameArchives(); LoadGameArchives();
@ -30,6 +27,10 @@ void RunTimedemo(std::string timedemoFolderName)
// Please provide them so that the tests can run successfully // Please provide them so that the tests can run successfully
ASSERT_TRUE(HaveSpawn() || HaveDiabdat()); ASSERT_TRUE(HaveSpawn() || HaveDiabdat());
std::string unitTestFolderCompletePath = paths::BasePath() + "test/fixtures/timedemo/" + timedemoFolderName;
paths::SetPrefPath(unitTestFolderCompletePath);
paths::SetConfigPath(unitTestFolderCompletePath);
InitKeymapActions(); InitKeymapActions();
LoadOptions(); LoadOptions();

13
test/writehero_test.cpp

@ -359,8 +359,9 @@ void AssertPlayer(Player &player)
TEST(Writehero, pfile_write_hero) TEST(Writehero, pfile_write_hero)
{ {
paths::SetPrefPath("."); const std::string savePath = paths::BasePath() + "multi_0.sv";
std::remove("multi_0.sv"); paths::SetPrefPath(paths::BasePath());
RemoveFile(savePath.c_str());
gbVanilla = true; gbVanilla = true;
gbIsHellfire = false; gbIsHellfire = false;
@ -382,10 +383,10 @@ TEST(Writehero, pfile_write_hero)
AssertPlayer(Players[0]); AssertPlayer(Players[0]);
pfile_write_hero(); pfile_write_hero();
const char *path = "multi_0.sv"; uintmax_t fileSize;
uintmax_t size; ASSERT_TRUE(GetFileSize(savePath.c_str(), &fileSize));
ASSERT_TRUE(GetFileSize(path, &size)); size_t size = static_cast<size_t>(fileSize);
FILE *f = std::fopen(path, "rb"); FILE *f = OpenFile(savePath.c_str(), "rb");
ASSERT_TRUE(f != nullptr); ASSERT_TRUE(f != nullptr);
std::unique_ptr<char[]> data { new char[size] }; std::unique_ptr<char[]> data { new char[size] };
ASSERT_EQ(std::fread(data.get(), size, 1, f), 1); ASSERT_EQ(std::fread(data.get(), size, 1, f), 1);

Loading…
Cancel
Save