aboutsummaryrefslogtreecommitdiff
path: root/src/unittest
diff options
context:
space:
mode:
Diffstat (limited to 'src/unittest')
-rw-r--r--src/unittest/test.cpp4
-rw-r--r--src/unittest/test_clientactiveobjectmgr.cpp1
-rw-r--r--src/unittest/test_connection.cpp35
-rw-r--r--src/unittest/test_map_settings_manager.cpp86
-rw-r--r--src/unittest/test_noderesolver.cpp2
-rw-r--r--src/unittest/test_schematic.cpp40
-rw-r--r--src/unittest/test_settings.cpp73
-rw-r--r--src/unittest/test_utilities.cpp19
8 files changed, 194 insertions, 66 deletions
diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp
index 0f6b36649..d4841d559 100644
--- a/src/unittest/test.cpp
+++ b/src/unittest/test.cpp
@@ -182,7 +182,7 @@ void TestGameDef::defineSomeNodes()
"{default_water.png";
f = ContentFeatures();
f.name = itemdef.name;
- f.alpha = 128;
+ f.alpha = ALPHAMODE_BLEND;
f.liquid_type = LIQUID_SOURCE;
f.liquid_viscosity = 4;
f.is_ground_content = true;
@@ -203,7 +203,7 @@ void TestGameDef::defineSomeNodes()
"{default_lava.png";
f = ContentFeatures();
f.name = itemdef.name;
- f.alpha = 128;
+ f.alpha = ALPHAMODE_OPAQUE;
f.liquid_type = LIQUID_SOURCE;
f.liquid_viscosity = 7;
f.light_source = LIGHT_MAX-1;
diff --git a/src/unittest/test_clientactiveobjectmgr.cpp b/src/unittest/test_clientactiveobjectmgr.cpp
index 4d2846c8d..2d508cf32 100644
--- a/src/unittest/test_clientactiveobjectmgr.cpp
+++ b/src/unittest/test_clientactiveobjectmgr.cpp
@@ -29,6 +29,7 @@ public:
TestClientActiveObject() : ClientActiveObject(0, nullptr, nullptr) {}
~TestClientActiveObject() = default;
ActiveObjectType getType() const { return ACTIVEOBJECT_TYPE_TEST; }
+ virtual void addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr) {}
};
class TestClientActiveObjectMgr : public TestBase
diff --git a/src/unittest/test_connection.cpp b/src/unittest/test_connection.cpp
index c5e4085e1..c3aacc536 100644
--- a/src/unittest/test_connection.cpp
+++ b/src/unittest/test_connection.cpp
@@ -39,6 +39,7 @@ public:
void runTests(IGameDef *gamedef);
+ void testNetworkPacketSerialize();
void testHelpers();
void testConnectSendReceive();
};
@@ -47,6 +48,7 @@ static TestConnection g_test_instance;
void TestConnection::runTests(IGameDef *gamedef)
{
+ TEST(testNetworkPacketSerialize);
TEST(testHelpers);
TEST(testConnectSendReceive);
}
@@ -78,6 +80,39 @@ struct Handler : public con::PeerHandler
const char *name;
};
+void TestConnection::testNetworkPacketSerialize()
+{
+ const static u8 expected[] = {
+ 0x00, 0x7b,
+ 0x00, 0x02, 0xd8, 0x42, 0xdf, 0x9a
+ };
+
+ if (sizeof(wchar_t) == 2)
+ warningstream << __func__ << " may fail on this platform." << std::endl;
+
+ {
+ NetworkPacket pkt(123, 0);
+
+ // serializing wide strings should do surrogate encoding, we test that here
+ pkt << std::wstring(L"\U00020b9a");
+
+ SharedBuffer<u8> buf = pkt.oldForgePacket();
+ UASSERTEQ(int, buf.getSize(), sizeof(expected));
+ UASSERT(!memcmp(expected, &buf[0], buf.getSize()));
+ }
+
+ {
+ NetworkPacket pkt;
+ pkt.putRawPacket(expected, sizeof(expected), 0);
+
+ // same for decoding
+ std::wstring pkt_s;
+ pkt >> pkt_s;
+
+ UASSERT(pkt_s == L"\U00020b9a");
+ }
+}
+
void TestConnection::testHelpers()
{
// Some constants for testing
diff --git a/src/unittest/test_map_settings_manager.cpp b/src/unittest/test_map_settings_manager.cpp
index 3d642a9b4..81ca68705 100644
--- a/src/unittest/test_map_settings_manager.cpp
+++ b/src/unittest/test_map_settings_manager.cpp
@@ -30,7 +30,7 @@ public:
TestMapSettingsManager() { TestManager::registerTestModule(this); }
const char *getName() { return "TestMapSettingsManager"; }
- void makeUserConfig(Settings *conf);
+ void makeUserConfig();
std::string makeMetaFile(bool make_corrupt);
void runTests(IGameDef *gamedef);
@@ -65,8 +65,11 @@ void check_noise_params(const NoiseParams *np1, const NoiseParams *np2)
}
-void TestMapSettingsManager::makeUserConfig(Settings *conf)
+void TestMapSettingsManager::makeUserConfig()
{
+ delete Settings::getLayer(SL_GLOBAL);
+ Settings *conf = Settings::createLayer(SL_GLOBAL);
+
conf->set("mg_name", "v7");
conf->set("seed", "5678");
conf->set("water_level", "20");
@@ -103,12 +106,11 @@ std::string TestMapSettingsManager::makeMetaFile(bool make_corrupt)
void TestMapSettingsManager::testMapSettingsManager()
{
- Settings user_settings;
- makeUserConfig(&user_settings);
+ makeUserConfig();
std::string test_mapmeta_path = makeMetaFile(false);
- MapSettingsManager mgr(&user_settings, test_mapmeta_path);
+ MapSettingsManager mgr(test_mapmeta_path);
std::string value;
UASSERT(mgr.getMapSetting("mg_name", &value));
@@ -140,6 +142,12 @@ void TestMapSettingsManager::testMapSettingsManager()
mgr.setMapSettingNoiseParams("mgv5_np_height", &script_np_height);
mgr.setMapSettingNoiseParams("mgv5_np_factor", &script_np_factor);
+ {
+ NoiseParams dummy;
+ mgr.getMapSettingNoiseParams("mgv5_np_factor", &dummy);
+ check_noise_params(&dummy, &script_np_factor);
+ }
+
// Now make our Params and see if the values are correctly sourced
MapgenParams *params = mgr.makeMapgenParams();
UASSERT(params->mgtype == MAPGEN_V5);
@@ -188,50 +196,66 @@ void TestMapSettingsManager::testMapSettingsManager()
void TestMapSettingsManager::testMapMetaSaveLoad()
{
- Settings conf;
std::string path = getTestTempDirectory()
+ DIR_DELIM + "foobar" + DIR_DELIM + "map_meta.txt";
+ makeUserConfig();
+ Settings &conf = *Settings::getLayer(SL_GLOBAL);
+
+ // There cannot be two MapSettingsManager
+ // copy the mapgen params to compare them
+ MapgenParams params1, params2;
// Create a set of mapgen params and save them to map meta
- conf.set("seed", "12345");
- conf.set("water_level", "5");
- MapSettingsManager mgr1(&conf, path);
- MapgenParams *params1 = mgr1.makeMapgenParams();
- UASSERT(params1);
- UASSERT(mgr1.saveMapMeta());
+ {
+ conf.set("seed", "12345");
+ conf.set("water_level", "5");
+ MapSettingsManager mgr(path);
+ MapgenParams *params = mgr.makeMapgenParams();
+ UASSERT(params);
+ params1 = *params;
+ params1.bparams = nullptr; // No double-free
+ UASSERT(mgr.saveMapMeta());
+ }
// Now try loading the map meta to mapgen params
- conf.set("seed", "67890");
- conf.set("water_level", "32");
- MapSettingsManager mgr2(&conf, path);
- UASSERT(mgr2.loadMapMeta());
- MapgenParams *params2 = mgr2.makeMapgenParams();
- UASSERT(params2);
+ {
+ conf.set("seed", "67890");
+ conf.set("water_level", "32");
+ MapSettingsManager mgr(path);
+ UASSERT(mgr.loadMapMeta());
+ MapgenParams *params = mgr.makeMapgenParams();
+ UASSERT(params);
+ params2 = *params;
+ params2.bparams = nullptr; // No double-free
+ }
// Check that both results are correct
- UASSERTEQ(u64, params1->seed, 12345);
- UASSERTEQ(s16, params1->water_level, 5);
- UASSERTEQ(u64, params2->seed, 12345);
- UASSERTEQ(s16, params2->water_level, 5);
+ UASSERTEQ(u64, params1.seed, 12345);
+ UASSERTEQ(s16, params1.water_level, 5);
+ UASSERTEQ(u64, params2.seed, 12345);
+ UASSERTEQ(s16, params2.water_level, 5);
}
void TestMapSettingsManager::testMapMetaFailures()
{
std::string test_mapmeta_path;
- Settings conf;
// Check to see if it'll fail on a non-existent map meta file
- test_mapmeta_path = "woobawooba/fgdfg/map_meta.txt";
- UASSERT(!fs::PathExists(test_mapmeta_path));
+ {
+ test_mapmeta_path = "woobawooba/fgdfg/map_meta.txt";
+ UASSERT(!fs::PathExists(test_mapmeta_path));
- MapSettingsManager mgr1(&conf, test_mapmeta_path);
- UASSERT(!mgr1.loadMapMeta());
+ MapSettingsManager mgr1(test_mapmeta_path);
+ UASSERT(!mgr1.loadMapMeta());
+ }
// Check to see if it'll fail on a corrupt map meta file
- test_mapmeta_path = makeMetaFile(true);
- UASSERT(fs::PathExists(test_mapmeta_path));
+ {
+ test_mapmeta_path = makeMetaFile(true);
+ UASSERT(fs::PathExists(test_mapmeta_path));
- MapSettingsManager mgr2(&conf, test_mapmeta_path);
- UASSERT(!mgr2.loadMapMeta());
+ MapSettingsManager mgr2(test_mapmeta_path);
+ UASSERT(!mgr2.loadMapMeta());
+ }
}
diff --git a/src/unittest/test_noderesolver.cpp b/src/unittest/test_noderesolver.cpp
index 28da43620..ed66093a9 100644
--- a/src/unittest/test_noderesolver.cpp
+++ b/src/unittest/test_noderesolver.cpp
@@ -56,6 +56,8 @@ void TestNodeResolver::runTests(IGameDef *gamedef)
class Foobar : public NodeResolver {
public:
+ friend class TestNodeResolver; // m_ndef
+
void resolveNodeNames();
content_t test_nr_node1;
diff --git a/src/unittest/test_schematic.cpp b/src/unittest/test_schematic.cpp
index da4ce50d2..d2f027eb4 100644
--- a/src/unittest/test_schematic.cpp
+++ b/src/unittest/test_schematic.cpp
@@ -66,13 +66,14 @@ void TestSchematic::testMtsSerializeDeserialize(const NodeDefManager *ndef)
std::stringstream ss(std::ios_base::binary |
std::ios_base::in | std::ios_base::out);
- std::vector<std::string> names;
- names.emplace_back("foo");
- names.emplace_back("bar");
- names.emplace_back("baz");
- names.emplace_back("qux");
-
- Schematic schem, schem2;
+ Schematic schem;
+ {
+ std::vector<std::string> &names = schem.m_nodenames;
+ names.emplace_back("foo");
+ names.emplace_back("bar");
+ names.emplace_back("baz");
+ names.emplace_back("qux");
+ }
schem.flags = 0;
schem.size = size;
@@ -83,18 +84,21 @@ void TestSchematic::testMtsSerializeDeserialize(const NodeDefManager *ndef)
for (s16 y = 0; y != size.Y; y++)
schem.slice_probs[y] = MTSCHEM_PROB_ALWAYS;
- UASSERT(schem.serializeToMts(&ss, names));
+ UASSERT(schem.serializeToMts(&ss));
ss.seekg(0);
- names.clear();
- UASSERT(schem2.deserializeFromMts(&ss, &names));
+ Schematic schem2;
+ UASSERT(schem2.deserializeFromMts(&ss));
- UASSERTEQ(size_t, names.size(), 4);
- UASSERTEQ(std::string, names[0], "foo");
- UASSERTEQ(std::string, names[1], "bar");
- UASSERTEQ(std::string, names[2], "baz");
- UASSERTEQ(std::string, names[3], "qux");
+ {
+ std::vector<std::string> &names = schem2.m_nodenames;
+ UASSERTEQ(size_t, names.size(), 4);
+ UASSERTEQ(std::string, names[0], "foo");
+ UASSERTEQ(std::string, names[1], "bar");
+ UASSERTEQ(std::string, names[2], "baz");
+ UASSERTEQ(std::string, names[3], "qux");
+ }
UASSERT(schem2.size == size);
for (size_t i = 0; i != volume; i++)
@@ -120,14 +124,14 @@ void TestSchematic::testLuaTableSerialize(const NodeDefManager *ndef)
for (s16 y = 0; y != size.Y; y++)
schem.slice_probs[y] = MTSCHEM_PROB_ALWAYS;
- std::vector<std::string> names;
+ std::vector<std::string> &names = schem.m_nodenames;
names.emplace_back("air");
names.emplace_back("default:lava_source");
names.emplace_back("default:glass");
std::ostringstream ss(std::ios_base::binary);
- UASSERT(schem.serializeToLua(&ss, names, false, 0));
+ UASSERT(schem.serializeToLua(&ss, false, 0));
UASSERTEQ(std::string, ss.str(), expected_lua_output);
}
@@ -159,6 +163,8 @@ void TestSchematic::testFileSerializeDeserialize(const NodeDefManager *ndef)
schem1.slice_probs[0] = 80;
schem1.slice_probs[1] = 160;
schem1.slice_probs[2] = 240;
+ // Node resolving happened manually.
+ schem1.m_resolve_done = true;
for (size_t i = 0; i != volume; i++) {
content_t c = content_map[test_schem2_data[i]];
diff --git a/src/unittest/test_settings.cpp b/src/unittest/test_settings.cpp
index f91ba5b67..6b493c9e4 100644
--- a/src/unittest/test_settings.cpp
+++ b/src/unittest/test_settings.cpp
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <cmath>
#include "settings.h"
+#include "defaultsettings.h"
#include "noise.h"
class TestSettings : public TestBase {
@@ -31,6 +32,7 @@ public:
void runTests(IGameDef *gamedef);
void testAllSettings();
+ void testDefaults();
void testFlagDesc();
static const char *config_text_before;
@@ -42,6 +44,7 @@ static TestSettings g_test_instance;
void TestSettings::runTests(IGameDef *gamedef)
{
TEST(testAllSettings);
+ TEST(testDefaults);
TEST(testFlagDesc);
}
@@ -70,7 +73,8 @@ const char *TestSettings::config_text_before =
" with leading whitespace!\n"
"\"\"\"\n"
"np_terrain = 5, 40, (250, 250, 250), 12341, 5, 0.7, 2.4\n"
- "zoop = true";
+ "zoop = true\n"
+ "[dummy_eof_end_tag]\n";
const std::string TestSettings::config_text_after =
"leet = 1337\n"
@@ -111,12 +115,34 @@ const std::string TestSettings::config_text_after =
" animals = cute\n"
" num_apples = 4\n"
" num_oranges = 53\n"
- "}\n";
+ "}\n"
+ "[dummy_eof_end_tag]";
+
+void compare_settings(const std::string &name, Settings *a, Settings *b)
+{
+ auto keys = a->getNames();
+ Settings *group1, *group2;
+ std::string value1, value2;
+ for (auto &key : keys) {
+ if (a->getGroupNoEx(key, group1)) {
+ UASSERT(b->getGroupNoEx(key, group2));
+
+ compare_settings(name + "->" + key, group1, group2);
+ continue;
+ }
+
+ UASSERT(b->getNoEx(key, value1));
+ // For identification
+ value1 = name + "->" + key + "=" + value1;
+ value2 = name + "->" + key + "=" + a->get(key);
+ UASSERTCMP(std::string, ==, value2, value1);
+ }
+}
void TestSettings::testAllSettings()
{
try {
- Settings s;
+ Settings s("[dummy_eof_end_tag]");
// Test reading of settings
std::istringstream is(config_text_before);
@@ -197,21 +223,44 @@ void TestSettings::testAllSettings()
is.clear();
is.seekg(0);
- UASSERT(s.updateConfigObject(is, os, "", 0) == true);
- //printf(">>>> expected config:\n%s\n", TEST_CONFIG_TEXT_AFTER);
- //printf(">>>> actual config:\n%s\n", os.str().c_str());
-#if __cplusplus < 201103L
- // This test only works in older C++ versions than C++11 because we use unordered_map
- UASSERT(os.str() == config_text_after);
-#endif
+ UASSERT(s.updateConfigObject(is, os, 0) == true);
+
+ {
+ // Confirm settings
+ Settings s2("[dummy_eof_end_tag]");
+ std::istringstream is(config_text_after, std::ios_base::binary);
+ UASSERT(s2.parseConfigLines(is) == true);
+
+ compare_settings("(main)", &s, &s2);
+ }
+
} catch (SettingNotFoundException &e) {
UASSERT(!"Setting not found!");
}
}
+void TestSettings::testDefaults()
+{
+ Settings *game = Settings::createLayer(SL_GAME);
+ Settings *def = Settings::getLayer(SL_DEFAULTS);
+
+ def->set("name", "FooBar");
+ UASSERT(def->get("name") == "FooBar");
+ UASSERT(game->get("name") == "FooBar");
+
+ game->set("name", "Baz");
+ UASSERT(game->get("name") == "Baz");
+
+ delete game;
+
+ // Restore default settings
+ delete Settings::getLayer(SL_DEFAULTS);
+ set_default_settings();
+}
+
void TestSettings::testFlagDesc()
{
- Settings s;
+ Settings &s = *Settings::createLayer(SL_GAME);
FlagDesc flagdesc[] = {
{ "biomes", 0x01 },
{ "trees", 0x02 },
@@ -242,4 +291,6 @@ void TestSettings::testFlagDesc()
// Enabled: tables
s.set("test_flags", "16");
UASSERT(s.getFlagStr("test_flags", flagdesc, nullptr) == 0x10);
+
+ delete &s;
}
diff --git a/src/unittest/test_utilities.cpp b/src/unittest/test_utilities.cpp
index 447b591e1..93ba3f844 100644
--- a/src/unittest/test_utilities.cpp
+++ b/src/unittest/test_utilities.cpp
@@ -247,8 +247,8 @@ void TestUtilities::testStartsWith()
void TestUtilities::testStrEqual()
{
- UASSERT(str_equal(narrow_to_wide("abc"), narrow_to_wide("abc")));
- UASSERT(str_equal(narrow_to_wide("ABC"), narrow_to_wide("abc"), true));
+ UASSERT(str_equal(utf8_to_wide("abc"), utf8_to_wide("abc")));
+ UASSERT(str_equal(utf8_to_wide("ABC"), utf8_to_wide("abc"), true));
}
@@ -302,9 +302,18 @@ void TestUtilities::testAsciiPrintableHelper()
void TestUtilities::testUTF8()
{
- UASSERT(wide_to_utf8(utf8_to_wide("")) == "");
- UASSERT(wide_to_utf8(utf8_to_wide("the shovel dug a crumbly node!"))
- == "the shovel dug a crumbly node!");
+ UASSERT(utf8_to_wide("¤") == L"¤");
+
+ UASSERT(wide_to_utf8(L"¤") == "¤");
+
+ UASSERTEQ(std::string, wide_to_utf8(utf8_to_wide("")), "");
+ UASSERTEQ(std::string, wide_to_utf8(utf8_to_wide("the shovel dug a crumbly node!")),
+ "the shovel dug a crumbly node!");
+ UASSERTEQ(std::string, wide_to_utf8(utf8_to_wide("-ä-")),
+ "-ä-");
+ UASSERTEQ(std::string, wide_to_utf8(utf8_to_wide("-\xF0\xA0\x80\x8B-")),
+ "-\xF0\xA0\x80\x8B-");
+
}
void TestUtilities::testRemoveEscapes()