mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Mapgen: Add rudimentary unittests
This commit is contained in:
parent
c7fe2ee5c9
commit
50928b9759
5 changed files with 162 additions and 58 deletions
114
src/unittest/test_mapgen.cpp
Normal file
114
src/unittest/test_mapgen.cpp
Normal file
|
@ -0,0 +1,114 @@
|
|||
// Luanti
|
||||
// SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
// Copyright (C) 2024 Minetest core developers & community
|
||||
|
||||
#include "test.h"
|
||||
|
||||
#include "emerge.h"
|
||||
#include "mapgen/mapgen.h"
|
||||
#include "mapgen/mg_biome.h"
|
||||
#include "mock_server.h"
|
||||
|
||||
class TestMapgen : public TestBase
|
||||
{
|
||||
public:
|
||||
TestMapgen() { TestManager::registerTestModule(this); }
|
||||
const char *getName() { return "TestMapgen"; }
|
||||
|
||||
void runTests(IGameDef *gamedef);
|
||||
|
||||
void testBiomeGen(IGameDef *gamedef);
|
||||
};
|
||||
|
||||
static TestMapgen g_test_instance;
|
||||
|
||||
namespace {
|
||||
class MockBiomeManager : public BiomeManager {
|
||||
public:
|
||||
MockBiomeManager(Server *server) : BiomeManager(server) {}
|
||||
|
||||
void setNodeDefManager(const NodeDefManager *ndef)
|
||||
{
|
||||
m_ndef = ndef;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
void TestMapgen::runTests(IGameDef *gamedef)
|
||||
{
|
||||
TEST(testBiomeGen, gamedef);
|
||||
}
|
||||
|
||||
void TestMapgen::testBiomeGen(IGameDef *gamedef)
|
||||
{
|
||||
MockServer server(getTestTempDirectory());
|
||||
MockBiomeManager bmgr(&server);
|
||||
bmgr.setNodeDefManager(gamedef->getNodeDefManager());
|
||||
|
||||
{
|
||||
// Add some biomes (equivalent to l_register_biome)
|
||||
// Taken from minetest_game/mods/default/mapgen.lua
|
||||
size_t bmgr_count = bmgr.getNumObjects(); // this is 1 ?
|
||||
|
||||
Biome *b = BiomeManager::create(BIOMETYPE_NORMAL);
|
||||
b->name = "deciduous_forest";
|
||||
b->c_top = t_CONTENT_GRASS;
|
||||
b->depth_top = 1;
|
||||
b->c_filler = t_CONTENT_BRICK; // dirt
|
||||
b->depth_filler = 3;
|
||||
b->c_stone = t_CONTENT_STONE;
|
||||
b->min_pos.Y = 1;
|
||||
b->heat_point = 60.0f;
|
||||
b->humidity_point = 68.0f;
|
||||
UASSERT(bmgr.add(b) != OBJDEF_INVALID_HANDLE);
|
||||
|
||||
b = BiomeManager::create(BIOMETYPE_NORMAL);
|
||||
b->name = "deciduous_forest_shore";
|
||||
b->c_top = t_CONTENT_BRICK; // dirt
|
||||
b->depth_top = 1;
|
||||
b->c_filler = t_CONTENT_BRICK; // dirt
|
||||
b->depth_filler = 3;
|
||||
b->c_stone = t_CONTENT_STONE;
|
||||
b->max_pos.Y = 0;
|
||||
b->heat_point = 60.0f;
|
||||
b->humidity_point = 68.0f;
|
||||
UASSERT(bmgr.add(b) != OBJDEF_INVALID_HANDLE);
|
||||
UASSERT(bmgr.getNumObjects() - bmgr_count == 2);
|
||||
}
|
||||
|
||||
|
||||
std::unique_ptr<BiomeParams> params(BiomeManager::createBiomeParams(BIOMEGEN_ORIGINAL));
|
||||
|
||||
constexpr v3s16 CSIZE(16, 16, 16); // misleading name. measured in nodes.
|
||||
std::unique_ptr<BiomeGen> biomegen(
|
||||
bmgr.createBiomeGen(BIOMEGEN_ORIGINAL, params.get(), CSIZE)
|
||||
);
|
||||
|
||||
{
|
||||
// Test biome transitions
|
||||
// getBiomeAtIndex (Y only)
|
||||
// getNextTransitionY
|
||||
const struct {
|
||||
s16 check_y;
|
||||
const char *name;
|
||||
s16 next_y;
|
||||
} expected_biomes[] = {
|
||||
{ MAX_MAP_GENERATION_LIMIT, "deciduous_forest", 1 },
|
||||
// ^ FIXME: next_y should be 0 (min_pos.Y - 1)
|
||||
{ 1, "deciduous_forest", 0 },
|
||||
{ 0, "deciduous_forest_shore", -MAX_MAP_GENERATION_LIMIT },
|
||||
{ -100, "deciduous_forest_shore", -MAX_MAP_GENERATION_LIMIT },
|
||||
};
|
||||
for (const auto expected : expected_biomes) {
|
||||
Biome *biome = biomegen->getBiomeAtIndex(
|
||||
(1 * CSIZE.X) + 1, // index in CSIZE 2D noise map
|
||||
v3s16(2000, expected.check_y, -1000) // absolute coordinates
|
||||
);
|
||||
s16 next_y = biomegen->getNextTransitionY(expected.check_y);
|
||||
|
||||
UASSERTEQ(auto, biome->name, expected.name);
|
||||
UASSERTEQ(auto, next_y, expected.next_y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue