Translated using Weblate (Russian)
[oweals/minetest.git] / src / unittest / test.cpp
index 1f3b31017b3c5068126a67451d89bc9f581ac9f4..a783ccd3293d7cbea5c6a06f8c8ae4a4f3465dda 100644 (file)
@@ -19,10 +19,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "test.h"
 
-#include "log.h"
+#include "client/sound.h"
 #include "nodedef.h"
 #include "itemdef.h"
 #include "gamedef.h"
+#include "modchannels.h"
+#include "content/mods.h"
+#include "util/numeric.h"
+#include "porting.h"
 
 content_t t_CONTENT_STONE;
 content_t t_CONTENT_GRASS;
@@ -43,12 +47,11 @@ public:
        ~TestGameDef();
 
        IItemDefManager *getItemDefManager() { return m_itemdef; }
-       INodeDefManager *getNodeDefManager() { return m_nodedef; }
+       const NodeDefManager *getNodeDefManager() { return m_nodedef; }
        ICraftDefManager *getCraftDefManager() { return m_craftdef; }
        ITextureSource *getTextureSource() { return m_texturesrc; }
        IShaderSource *getShaderSource() { return m_shadersrc; }
        ISoundManager *getSoundManager() { return m_soundmgr; }
-       MtEventManager *getEventManager() { return m_eventmgr; }
        scene::ISceneManager *getSceneManager() { return m_scenemgr; }
        IRollbackManager *getRollbackManager() { return m_rollbackmgr; }
        EmergeManager *getEmergeManager() { return m_emergemgr; }
@@ -59,21 +62,39 @@ public:
 
        void defineSomeNodes();
 
+       virtual const std::vector<ModSpec> &getMods() const
+       {
+               static std::vector<ModSpec> testmodspec;
+               return testmodspec;
+       }
+       virtual const ModSpec* getModSpec(const std::string &modname) const { return NULL; }
+       virtual std::string getModStoragePath() const { return "."; }
+       virtual bool registerModStorage(ModMetadata *meta) { return true; }
+       virtual void unregisterModStorage(const std::string &name) {}
+       bool joinModChannel(const std::string &channel);
+       bool leaveModChannel(const std::string &channel);
+       bool sendModChannelMessage(const std::string &channel, const std::string &message);
+       ModChannel *getModChannel(const std::string &channel)
+       {
+               return m_modchannel_mgr->getModChannel(channel);
+       }
+
 private:
-       IItemDefManager *m_itemdef;
-       INodeDefManager *m_nodedef;
-       ICraftDefManager *m_craftdef;
-       ITextureSource *m_texturesrc;
-       IShaderSource *m_shadersrc;
-       ISoundManager *m_soundmgr;
-       MtEventManager *m_eventmgr;
-       scene::ISceneManager *m_scenemgr;
-       IRollbackManager *m_rollbackmgr;
-       EmergeManager *m_emergemgr;
+       IItemDefManager *m_itemdef = nullptr;
+       const NodeDefManager *m_nodedef = nullptr;
+       ICraftDefManager *m_craftdef = nullptr;
+       ITextureSource *m_texturesrc = nullptr;
+       IShaderSource *m_shadersrc = nullptr;
+       ISoundManager *m_soundmgr = nullptr;
+       scene::ISceneManager *m_scenemgr = nullptr;
+       IRollbackManager *m_rollbackmgr = nullptr;
+       EmergeManager *m_emergemgr = nullptr;
+       std::unique_ptr<ModChannelMgr> m_modchannel_mgr;
 };
 
 
-TestGameDef::TestGameDef()
+TestGameDef::TestGameDef() :
+       m_modchannel_mgr(new ModChannelMgr())
 {
        m_itemdef = createItemDefManager();
        m_nodedef = createNodeDefManager();
@@ -92,7 +113,7 @@ TestGameDef::~TestGameDef()
 void TestGameDef::defineSomeNodes()
 {
        IWritableItemDefManager *idef = (IWritableItemDefManager *)m_itemdef;
-       IWritableNodeDefManager *ndef = (IWritableNodeDefManager *)m_nodedef;
+       NodeDefManager *ndef = (NodeDefManager *)m_nodedef;
 
        ItemDefinition itemdef;
        ContentFeatures f;
@@ -109,8 +130,8 @@ void TestGameDef::defineSomeNodes()
                "{default_stone.png";
        f = ContentFeatures();
        f.name = itemdef.name;
-       for(int i = 0; i < 6; i++)
-               f.tiledef[i].name = "default_stone.png";
+       for (TileDef &tiledef : f.tiledef)
+               tiledef.name = "default_stone.png";
        f.is_ground_content = true;
        idef->registerItem(itemdef);
        t_CONTENT_STONE = ndef->set(f.name, f);
@@ -164,8 +185,8 @@ void TestGameDef::defineSomeNodes()
        f.liquid_viscosity = 4;
        f.is_ground_content = true;
        f.groups["liquids"] = 3;
-       for(int i = 0; i < 6; i++)
-               f.tiledef[i].name = "default_water.png";
+       for (TileDef &tiledef : f.tiledef)
+               tiledef.name = "default_water.png";
        idef->registerItem(itemdef);
        t_CONTENT_WATER = ndef->set(f.name, f);
 
@@ -186,8 +207,8 @@ void TestGameDef::defineSomeNodes()
        f.light_source = LIGHT_MAX-1;
        f.is_ground_content = true;
        f.groups["liquids"] = 3;
-       for(int i = 0; i < 6; i++)
-               f.tiledef[i].name = "default_lava.png";
+       for (TileDef &tiledef : f.tiledef)
+               tiledef.name = "default_lava.png";
        idef->registerItem(itemdef);
        t_CONTENT_LAVA = ndef->set(f.name, f);
 
@@ -204,22 +225,39 @@ void TestGameDef::defineSomeNodes()
                "{default_brick.png";
        f = ContentFeatures();
        f.name = itemdef.name;
-       for(int i = 0; i < 6; i++)
-               f.tiledef[i].name = "default_brick.png";
+       for (TileDef &tiledef : f.tiledef)
+               tiledef.name = "default_brick.png";
        f.is_ground_content = true;
        idef->registerItem(itemdef);
        t_CONTENT_BRICK = ndef->set(f.name, f);
 }
 
+bool TestGameDef::joinModChannel(const std::string &channel)
+{
+       return m_modchannel_mgr->joinChannel(channel, PEER_ID_SERVER);
+}
+
+bool TestGameDef::leaveModChannel(const std::string &channel)
+{
+       return m_modchannel_mgr->leaveChannel(channel, PEER_ID_SERVER);
+}
+
+bool TestGameDef::sendModChannelMessage(const std::string &channel,
+       const std::string &message)
+{
+       if (!m_modchannel_mgr->channelRegistered(channel))
+               return false;
+
+       return true;
+}
+
 ////
 //// run_tests
 ////
 
-void run_tests()
+bool run_tests()
 {
-       DSTACK(FUNCTION_NAME);
-
-       u32 t1 = porting::getTime(PRECISION_MILLI);
+       u64 t1 = porting::getTimeMs();
        TestGameDef gamedef;
 
        g_logger.setLevelSilenced(LL_ERROR, true);
@@ -236,7 +274,7 @@ void run_tests()
                num_total_tests_run += testmods[i]->num_tests_run;
        }
 
-       u32 tdiff = porting::getTime(PRECISION_MILLI) - t1;
+       u64 tdiff = porting::getTimeMs() - t1;
 
        g_logger.setLevelSilenced(LL_ERROR, false);
 
@@ -253,8 +291,7 @@ void run_tests()
                << "++++++++++++++++++++++++++++++++++++++++"
                << "++++++++++++++++++++++++++++++++++++++++" << std::endl;
 
-       if (num_modules_failed)
-               abort();
+       return num_modules_failed;
 }
 
 ////
@@ -264,12 +301,12 @@ void run_tests()
 bool TestBase::testModule(IGameDef *gamedef)
 {
        rawstream << "======== Testing module " << getName() << std::endl;
-       u32 t1 = porting::getTime(PRECISION_MILLI);
+       u64 t1 = porting::getTimeMs();
 
 
        runTests(gamedef);
 
-       u32 tdiff = porting::getTime(PRECISION_MILLI) - t1;
+       u64 tdiff = porting::getTimeMs() - t1;
        rawstream << "======== Module " << getName() << " "
                << (num_tests_failed ? "failed" : "passed") << " (" << num_tests_failed
                << " failures / " << num_tests_run << " tests) - " << tdiff
@@ -287,7 +324,7 @@ std::string TestBase::getTestTempDirectory()
                return m_test_dir;
 
        char buf[32];
-       snprintf(buf, sizeof(buf), "%08X", myrand());
+       porting::mt_snprintf(buf, sizeof(buf), "%08X", myrand());
 
        m_test_dir = fs::TempPath() + DIR_DELIM "mttest_" + buf;
        if (!fs::CreateDir(m_test_dir))
@@ -299,7 +336,7 @@ std::string TestBase::getTestTempDirectory()
 std::string TestBase::getTestTempFile()
 {
        char buf[32];
-       snprintf(buf, sizeof(buf), "%08X", myrand());
+       porting::mt_snprintf(buf, sizeof(buf), "%08X", myrand());
 
        return getTestTempDirectory() + DIR_DELIM + buf + ".tmp";
 }
@@ -613,12 +650,12 @@ struct TestMapSector: public TestBase
                // Create one with no heightmaps
                ServerMapSector sector(&parent, v2s16(1,1));
 
-               UASSERT(sector.getBlockNoCreateNoEx(0) == 0);
-               UASSERT(sector.getBlockNoCreateNoEx(1) == 0);
+               UASSERT(sector.getBlockNoCreateNoEx(0) == nullptr);
+               UASSERT(sector.getBlockNoCreateNoEx(1) == nullptr);
 
                MapBlock * bref = sector.createBlankBlock(-2);
 
-               UASSERT(sector.getBlockNoCreateNoEx(0) == 0);
+               UASSERT(sector.getBlockNoCreateNoEx(0) == nullptr);
                UASSERT(sector.getBlockNoCreateNoEx(-2) == bref);
 
                //TODO: Check for AlreadyExistsException