summaryrefslogtreecommitdiffstats
path: root/tests/Generating
diff options
context:
space:
mode:
authorMattes D <github@xoft.cz>2017-02-26 23:03:24 +0100
committerMattes D <github@xoft.cz>2017-05-04 09:49:30 +0200
commit96fdd72d45221c03d9369c1edcddc83f27656fd4 (patch)
treefe96bbeaab2465924d4c613299c8002ba0b224e5 /tests/Generating
parentGen: Moved PiecePool into a separate file. (diff)
downloadcuberite-96fdd72d45221c03d9369c1edcddc83f27656fd4.tar
cuberite-96fdd72d45221c03d9369c1edcddc83f27656fd4.tar.gz
cuberite-96fdd72d45221c03d9369c1edcddc83f27656fd4.tar.bz2
cuberite-96fdd72d45221c03d9369c1edcddc83f27656fd4.tar.lz
cuberite-96fdd72d45221c03d9369c1edcddc83f27656fd4.tar.xz
cuberite-96fdd72d45221c03d9369c1edcddc83f27656fd4.tar.zst
cuberite-96fdd72d45221c03d9369c1edcddc83f27656fd4.zip
Diffstat (limited to 'tests/Generating')
-rw-r--r--tests/Generating/Bindings.h15
-rw-r--r--tests/Generating/CMakeLists.txt121
-rw-r--r--tests/Generating/LoadablePieces.cpp179
-rw-r--r--tests/Generating/LuaState_Declaration.inc4
-rw-r--r--tests/Generating/LuaState_Typedefs.inc19
-rw-r--r--tests/Generating/PieceRotationTest.cpp170
-rw-r--r--tests/Generating/Stubs.cpp290
-rw-r--r--tests/Generating/Test.cubeset155
-rw-r--r--tests/Generating/Test1.schematicbin0 -> 184 bytes
9 files changed, 953 insertions, 0 deletions
diff --git a/tests/Generating/Bindings.h b/tests/Generating/Bindings.h
new file mode 100644
index 000000000..490830ac3
--- /dev/null
+++ b/tests/Generating/Bindings.h
@@ -0,0 +1,15 @@
+
+// Bindings.h
+
+// Dummy include file needed for LuaState to compile successfully
+
+
+
+
+struct lua_State;
+
+int tolua_AllToLua_open(lua_State * a_LuaState);
+
+
+
+
diff --git a/tests/Generating/CMakeLists.txt b/tests/Generating/CMakeLists.txt
new file mode 100644
index 000000000..4efb9dbe2
--- /dev/null
+++ b/tests/Generating/CMakeLists.txt
@@ -0,0 +1,121 @@
+enable_testing()
+
+include_directories(${CMAKE_SOURCE_DIR}/src/)
+include_directories(SYSTEM ${CMAKE_SOURCE_DIR}/lib/)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR})
+
+add_definitions(-DTEST_GLOBALS=1)
+
+set (SHARED_SRCS
+ ${CMAKE_SOURCE_DIR}/src/BiomeDef.cpp
+ ${CMAKE_SOURCE_DIR}/src/BlockArea.cpp
+ ${CMAKE_SOURCE_DIR}/src/Cuboid.cpp
+ ${CMAKE_SOURCE_DIR}/src/ChunkData.cpp
+ ${CMAKE_SOURCE_DIR}/src/StringCompression.cpp
+ ${CMAKE_SOURCE_DIR}/src/StringUtils.cpp
+
+ ${CMAKE_SOURCE_DIR}/src/Bindings/LuaState.cpp
+
+ ${CMAKE_SOURCE_DIR}/src/Generating/ChunkDesc.cpp
+ ${CMAKE_SOURCE_DIR}/src/Generating/PiecePool.cpp
+ ${CMAKE_SOURCE_DIR}/src/Generating/Prefab.cpp
+ ${CMAKE_SOURCE_DIR}/src/Generating/PrefabPiecePool.cpp
+ ${CMAKE_SOURCE_DIR}/src/Generating/VerticalLimit.cpp
+ ${CMAKE_SOURCE_DIR}/src/Generating/VerticalStrategy.cpp
+
+ ${CMAKE_SOURCE_DIR}/src/Noise/Noise.cpp
+
+ ${CMAKE_SOURCE_DIR}/src/OSSupport/CriticalSection.cpp
+ ${CMAKE_SOURCE_DIR}/src/OSSupport/Event.cpp
+ ${CMAKE_SOURCE_DIR}/src/OSSupport/File.cpp
+ ${CMAKE_SOURCE_DIR}/src/OSSupport/GZipFile.cpp
+ ${CMAKE_SOURCE_DIR}/src/OSSupport/StackTrace.cpp
+
+ ${CMAKE_SOURCE_DIR}/src/WorldStorage/FastNBT.cpp
+ ${CMAKE_SOURCE_DIR}/src/WorldStorage/SchematicFileSerializer.cpp
+)
+
+set (SHARED_HDRS
+ ${CMAKE_SOURCE_DIR}/src/BiomeDef.h
+ ${CMAKE_SOURCE_DIR}/src/BlockArea.h
+ ${CMAKE_SOURCE_DIR}/src/Cuboid.h
+ ${CMAKE_SOURCE_DIR}/src/ChunkData.h
+ ${CMAKE_SOURCE_DIR}/src/Globals.h
+ ${CMAKE_SOURCE_DIR}/src/StringCompression.h
+ ${CMAKE_SOURCE_DIR}/src/StringUtils.h
+
+ ${CMAKE_SOURCE_DIR}/src/Bindings/LuaState.h
+
+ ${CMAKE_SOURCE_DIR}/src/Generating/ChunkDesc.h
+ ${CMAKE_SOURCE_DIR}/src/Generating/PiecePool.h
+ ${CMAKE_SOURCE_DIR}/src/Generating/Prefab.h
+ ${CMAKE_SOURCE_DIR}/src/Generating/PrefabPiecePool.h
+ ${CMAKE_SOURCE_DIR}/src/Generating/VerticalLimit.h
+ ${CMAKE_SOURCE_DIR}/src/Generating/VerticalStrategy.h
+
+ ${CMAKE_SOURCE_DIR}/src/Noise/Noise.h
+
+ ${CMAKE_SOURCE_DIR}/src/OSSupport/CriticalSection.h
+ ${CMAKE_SOURCE_DIR}/src/OSSupport/Event.h
+ ${CMAKE_SOURCE_DIR}/src/OSSupport/File.h
+ ${CMAKE_SOURCE_DIR}/src/OSSupport/GZipFile.h
+ ${CMAKE_SOURCE_DIR}/src/OSSupport/StackTrace.h
+
+ ${CMAKE_SOURCE_DIR}/src/WorldStorage/FastNBT.h
+ ${CMAKE_SOURCE_DIR}/src/WorldStorage/SchematicFileSerializer.h
+)
+
+set (STUBS
+ Stubs.cpp
+ LuaState_Typedefs.inc
+ LuaState_Declaration.inc
+ Bindings.h
+)
+
+
+if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ add_flags_cxx("-Wno-error=global-constructors")
+ add_flags_cxx("-Wno-error=switch-enum")
+endif()
+
+
+if (MSVC)
+ # Add the MSVC-specific LeakFinder sources:
+ list (APPEND SHARED_SRCS ${CMAKE_SOURCE_DIR}/src/LeakFinder.cpp ${CMAKE_SOURCE_DIR}/src/StackWalker.cpp)
+ list (APPEND SHARED_HDRS ${CMAKE_SOURCE_DIR}/src/LeakFinder.h ${CMAKE_SOURCE_DIR}/src/StackWalker.h)
+endif()
+
+add_library(GeneratorTestingSupport STATIC ${SHARED_SRCS} ${SHARED_HDRS} ${STUBS})
+target_link_libraries(GeneratorTestingSupport tolualib zlib)
+source_group("Stubs" FILES ${STUBS})
+
+
+
+
+
+# LoadablePieces test:
+source_group("Data files" FILES Test.cubeset Test1.schematic)
+add_executable(LoadablePieces LoadablePieces.cpp Test.cubeset Test1.schematic)
+target_link_libraries(LoadablePieces GeneratorTestingSupport)
+add_test(NAME LoadablePieces-test WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND LoadablePieces)
+
+
+
+
+
+# PieceRotation test:
+add_executable(PieceRotation PieceRotationTest.cpp)
+target_link_libraries(PieceRotation GeneratorTestingSupport)
+add_test(NAME PieceRotation-test WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND PieceRotation)
+
+
+
+
+
+# Put the projects into solution folders (MSVC):
+set_target_properties(
+ GeneratorTestingSupport
+ LoadablePieces
+ PieceRotation
+ PROPERTIES FOLDER Tests/Generating
+)
diff --git a/tests/Generating/LoadablePieces.cpp b/tests/Generating/LoadablePieces.cpp
new file mode 100644
index 000000000..58b65464d
--- /dev/null
+++ b/tests/Generating/LoadablePieces.cpp
@@ -0,0 +1,179 @@
+
+// LoadablePieces.cpp
+
+// Implements the LoadablePieces test main entrypoint
+
+#include "Globals.h"
+#ifdef _WIN32
+ #include <direct.h>
+ #define GetCurrentFolder _getcwd
+#else
+ #include <unistd.h>
+ #define GetCurrentFolder getcwd
+#endif
+#include "Generating/PrefabPiecePool.h"
+
+
+
+
+
+static int DoLoaderTest(void)
+{
+ cPrefabPiecePool test;
+ auto res = test.LoadFromFile("Test.cubeset", true);
+ if (!res)
+ {
+ LOGWARNING("Loading from file \"Test.cubeset\" failed.");
+ return 1;
+ }
+ LOG("Loaded %u regular pieces and %u starting pieces", static_cast<unsigned>(test.GetAllPiecesCount()), static_cast<unsigned>(test.GetStartingPiecesCount()));
+
+ // Check that we loaded all the pieces:
+ testassert(test.GetAllPiecesCount() == 1);
+ testassert(test.GetStartingPiecesCount() == 1);
+
+ return 0;
+}
+
+
+
+
+
+static int DoParserTest(void)
+{
+ // Create one static prefab to test the parser:
+ static const cPrefab::sDef testPrefabDef =
+ {
+ // Size:
+ 7, 6, 7, // SizeX = 7, SizeY = 6, SizeZ = 7
+
+ // Hitbox (relative to bounding box):
+ 0, 0, 0, // MinX, MinY, MinZ
+ 6, 5, 6, // MaxX, MaxY, MaxZ
+
+ // Block definitions:
+ ".: 0: 0\n" /* 0 */
+ "a:112: 0\n" /* netherbrick */
+ "b:113: 0\n" /* netherbrickfence */,
+
+ // Block data:
+ // Level 1
+ "aaaaaaa"
+ "aaaaaaa"
+ "aaaaaaa"
+ "aaaaaaa"
+ "aaaaaaa"
+ "aaaaaaa"
+ "aaaaaaa"
+
+ // Level 2
+ "aa...aa"
+ "a.....a"
+ "......."
+ "......."
+ "......."
+ "a.....a"
+ "aa...aa"
+
+ // Level 3
+ "aa...aa"
+ "a.....a"
+ "......."
+ "......."
+ "......."
+ "a.....a"
+ "aa...aa"
+
+ // Level 4
+ "aa...aa"
+ "a.....a"
+ "......."
+ "......."
+ "......."
+ "a.....a"
+ "aa...aa"
+
+ // Level 5
+ "aabbbaa"
+ "a.....a"
+ "b.....b"
+ "b.....b"
+ "b.....b"
+ "a.....a"
+ "aabbbaa"
+
+ // Level 6
+ "aaaaaaa"
+ "a.....a"
+ "a.....a"
+ "a.....a"
+ "a.....a"
+ "a.....a"
+ "aaaaaaa",
+
+ // Connections:
+ "0: 0, 3, 2: 4\n"
+ "0: 2, 3, 0: 2\n",
+
+ // AllowedRotations:
+ 7, /* 1, 2, 3 CCW rotations */
+
+ // Merge strategy:
+ cBlockArea::msImprint,
+
+ // ExtendFloorStrategy:
+ cPrefab::efsNone,
+
+ // DefaultWeight:
+ 10,
+
+ // DepthWeight:
+ "",
+
+ // AddWeightIfSame:
+ 1000,
+
+ // MoveToGround:
+ false,
+ };
+
+ cPrefab testPrefab(testPrefabDef);
+ cPiece & prefabAsPiece(testPrefab); // GetConnectors() is private in cPrefab, need to cast to parent cPiece where it is public
+ if (prefabAsPiece.GetConnectors().size() != 2)
+ {
+ LOGWARNING("Piece parsing failed, connectors not parsed properly. Expected 2 connectors, got %u", static_cast<unsigned>(prefabAsPiece.GetConnectors().size()));
+ }
+ return 0;
+}
+
+
+
+
+
+int main(int argc, char * argv[])
+{
+ LOGD("Test started");
+
+ // Print the current directory for reference:
+ char folder[FILENAME_MAX];
+ GetCurrentFolder(folder, sizeof(folder));
+ LOG("Running cPrefabPiecePool test from folder \"%s\".", folder);
+
+ // Run the Loader test:
+ int res = DoLoaderTest();
+ LOG("cPrefabPiecePool loading test done: %s", (res == 0) ? "success" : "failure");
+ if (res != 0)
+ {
+ return res;
+ }
+
+ // Run the Parser test:
+ res = DoParserTest();
+ LOG("cPrefab parser test done: %s", (res == 0) ? "success" : "failure");
+
+ return res;
+}
+
+
+
+
diff --git a/tests/Generating/LuaState_Declaration.inc b/tests/Generating/LuaState_Declaration.inc
new file mode 100644
index 000000000..4019b26c6
--- /dev/null
+++ b/tests/Generating/LuaState_Declaration.inc
@@ -0,0 +1,4 @@
+
+// LuaState_Declaration.inc
+
+// Dummy include file needed for LuaState to compile successfully
diff --git a/tests/Generating/LuaState_Typedefs.inc b/tests/Generating/LuaState_Typedefs.inc
new file mode 100644
index 000000000..5eba7c6f8
--- /dev/null
+++ b/tests/Generating/LuaState_Typedefs.inc
@@ -0,0 +1,19 @@
+
+// LuaState_Typedefs.inc
+
+// Dummy include file needed for LuaState to compile successfully
+
+
+
+
+
+// Forward-declare classes that are used in the API but never called:
+struct HTTPRequest;
+struct HTTPTemplateRequest;
+class cPluginLua;
+class cBoundingBox;
+template <typename T> class cItemCallback;
+class cEntity;
+
+
+
diff --git a/tests/Generating/PieceRotationTest.cpp b/tests/Generating/PieceRotationTest.cpp
new file mode 100644
index 000000000..ace3bd489
--- /dev/null
+++ b/tests/Generating/PieceRotationTest.cpp
@@ -0,0 +1,170 @@
+// PieceRotation.cpp
+
+// Implements the tests for cPiece::cConnector::eDirection rotations
+
+#include "Globals.h"
+#include <exception>
+#include <map>
+#include "Generating/PiecePool.h"
+
+
+
+
+
+static cPiece::cConnector::eDirection g_AllDirections[] =
+{
+ cPiece::cConnector::dirXM,
+ cPiece::cConnector::dirXP,
+ cPiece::cConnector::dirYM,
+ cPiece::cConnector::dirYP,
+ cPiece::cConnector::dirZM,
+ cPiece::cConnector::dirZP,
+ cPiece::cConnector::dirYM_XM_ZM,
+ cPiece::cConnector::dirYM_XM_ZP,
+ cPiece::cConnector::dirYM_XP_ZM,
+ cPiece::cConnector::dirYM_XP_ZP,
+ cPiece::cConnector::dirYP_XM_ZM,
+ cPiece::cConnector::dirYP_XM_ZP,
+ cPiece::cConnector::dirYP_XP_ZM,
+ cPiece::cConnector::dirYP_XP_ZP,
+};
+
+
+
+
+
+class cTestFailure: public std::exception
+{
+public:
+ cTestFailure(const char * a_Expression, const char * a_FileName, const int a_Line):
+ std::exception(),
+ m_Expression(a_Expression),
+ m_FileName(a_FileName),
+ m_Line(a_Line)
+ {
+ }
+
+ const std::string m_Expression;
+ const std::string m_FileName;
+ const int m_Line;
+};
+
+
+
+
+
+#define EXPECT(X) if (!(X)) \
+ { \
+ ASSERT(X); \
+ throw cTestFailure(#X, __FILE__, __LINE__); \
+ }
+
+
+
+
+
+/** Tests that rotating a direction in one way and then the opposite way produces the original direction. */
+static void testBackAndForth()
+{
+ for (size_t i = 0; i < ARRAYCOUNT(g_AllDirections); ++i)
+ {
+ auto rotated = cPiece::cConnector::RotateDirectionCW(g_AllDirections[i]);
+ auto back = cPiece::cConnector::RotateDirectionCCW(rotated);
+ EXPECT(back == g_AllDirections[i]);
+ }
+ for (size_t i = 0; i < ARRAYCOUNT(g_AllDirections); ++i)
+ {
+ auto rotated = cPiece::cConnector::RotateDirectionCCW(g_AllDirections[i]);
+ auto back = cPiece::cConnector::RotateDirectionCW(rotated);
+ EXPECT(back == g_AllDirections[i]);
+ }
+}
+
+
+
+
+
+/** Tests rotating the direction 360 degrees. */
+static void testFullRotation()
+{
+ // Rotate 90 degrees CCW four times:
+ for (size_t i = 0; i < ARRAYCOUNT(g_AllDirections); ++i)
+ {
+ auto d = g_AllDirections[i];
+ for (int j = 0; j < 4; ++j)
+ {
+ d = cPiece::cConnector::RotateDirectionCCW(d);
+ }
+ EXPECT(d == g_AllDirections[i]);
+ }
+
+ // Rotate 90 degrees CW four times:
+ for (size_t i = 0; i < ARRAYCOUNT(g_AllDirections); ++i)
+ {
+ auto d = g_AllDirections[i];
+ for (int j = 0; j < 4; ++j)
+ {
+ d = cPiece::cConnector::RotateDirectionCW(d);
+ }
+ EXPECT(d == g_AllDirections[i]);
+ }
+
+ // Rotate 180 degrees twice:
+ for (size_t i = 0; i < ARRAYCOUNT(g_AllDirections); ++i)
+ {
+ auto d = g_AllDirections[i];
+ d = cPiece::cConnector::RotateDirection(d);
+ d = cPiece::cConnector::RotateDirection(d);
+ EXPECT(d == g_AllDirections[i]);
+ }
+}
+
+
+
+
+
+/** Tests that no two values are rotated onto the same destination value. */
+template <class Fn>
+static void testPermutation(Fn & a_Fn)
+{
+ std::map<cPiece::cConnector::eDirection, int> numDest;
+ for (size_t i = 0; i < ARRAYCOUNT(g_AllDirections); ++i)
+ {
+ auto d = a_Fn(g_AllDirections[i]);
+ EXPECT(numDest[d] == 0);
+ numDest[d] = 1;
+ }
+}
+
+
+
+
+
+int main(void)
+{
+ LOG("PieceRotation test starting.");
+ try
+ {
+ testBackAndForth();
+ testFullRotation();
+ testPermutation(cPiece::cConnector::RotateDirection);
+ testPermutation(cPiece::cConnector::RotateDirectionCW);
+ testPermutation(cPiece::cConnector::RotateDirectionCCW);
+ }
+ catch (const cTestFailure & f)
+ {
+ LOGERROR("Test failed:\tExpression: %s\n\tFile: %s (%d)", f.m_Expression.c_str(), f.m_FileName.c_str(), f.m_Line);
+ return 1;
+ }
+ catch (const std::exception & exc)
+ {
+ LOGERROR("Exception caught: %s", exc.what());
+ return 2;
+ }
+ LOG("PieceRotation test succeeded.");
+ return 0;
+}
+
+
+
+
diff --git a/tests/Generating/Stubs.cpp b/tests/Generating/Stubs.cpp
new file mode 100644
index 000000000..0ad3eb365
--- /dev/null
+++ b/tests/Generating/Stubs.cpp
@@ -0,0 +1,290 @@
+
+// Stubs.cpp
+
+// Implements stubs of various Cuberite methods that are needed for linking but not for runtime
+// This is required so that we don't bring in the entire Cuberite via dependencies
+
+#include "Globals.h"
+#include "BlockInfo.h"
+#include "Bindings.h"
+#include "Bindings/DeprecatedBindings.h"
+#include "Bindings/LuaJson.h"
+#include "Bindings/ManualBindings.h"
+#include "BlockEntities/BlockEntity.h"
+#include "Blocks/BlockHandler.h"
+#include "Generating/ChunkDesc.h"
+#include "DeadlockDetect.h"
+
+
+
+
+
+// fwd:
+struct lua_State;
+
+
+
+
+
+// Prototypes, needed by clang:
+extern "C" int luaopen_lsqlite3(lua_State * a_LuaState);
+extern "C" int luaopen_lxp(lua_State * a_LuaState);
+
+
+
+
+
+void cManualBindings::Bind(lua_State * a_LuaState)
+{
+}
+
+
+
+
+
+void DeprecatedBindings::Bind(lua_State * a_LuaState)
+{
+}
+
+
+
+
+
+void cLuaJson::Bind(cLuaState & a_LuaState)
+{
+}
+
+
+
+
+
+int tolua_AllToLua_open(lua_State * a_LuaState)
+{
+ return 0;
+}
+
+
+
+
+
+extern "C" int luaopen_lsqlite3(lua_State * a_LuaState)
+{
+ return 0;
+}
+
+
+
+
+
+extern "C" int luaopen_lxp(lua_State * a_LuaState)
+{
+ return 0;
+}
+
+
+
+
+
+cBlockInfo::~cBlockInfo()
+{
+}
+
+
+
+
+
+void cBlockInfo::Initialize(cBlockInfo::cBlockInfoArray & a_BlockInfos)
+{
+ // The piece-loading code uses the handlers for rotations, so we need valid handlers
+ // Insert dummy handlers:
+ for (size_t i = 0; i < ARRAYCOUNT(a_BlockInfos); i++)
+ {
+ a_BlockInfos[i].m_Handler = new cBlockHandler(static_cast<BLOCKTYPE>(i));
+ }
+}
+
+
+
+
+
+cBlockHandler::cBlockHandler(BLOCKTYPE a_BlockType)
+{
+}
+
+
+
+
+
+bool cBlockHandler::GetPlacementBlockTypeMeta(
+ cChunkInterface & a_ChunkInterface, cPlayer * a_Player,
+ int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace,
+ int a_CursorX, int a_CursorY, int a_CursorZ,
+ BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta
+)
+{
+ return true;
+}
+
+
+
+
+
+void cBlockHandler::OnUpdate(cChunkInterface & cChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_PluginInterface, cChunk & a_Chunk, int a_BlockX, int a_BlockY, int a_BlockZ)
+{
+}
+
+
+
+
+
+void cBlockHandler::OnPlacedByPlayer(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, const sSetBlock & a_BlockChange)
+{
+}
+
+
+
+
+
+void cBlockHandler::OnDestroyedByPlayer(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ)
+{
+}
+
+
+
+
+
+void cBlockHandler::OnPlaced(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
+{
+}
+
+
+
+
+
+void cBlockHandler::OnDestroyed(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, int a_BlockX, int a_BlockY, int a_BlockZ)
+{
+}
+
+
+
+
+
+void cBlockHandler::NeighborChanged(cChunkInterface & a_ChunkInterface, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_WhichNeighbor)
+{
+}
+
+
+
+
+
+void cBlockHandler::ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta)
+{
+}
+
+
+
+
+
+void cBlockHandler::DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ, bool a_CanDrop)
+{
+}
+
+
+
+
+
+bool cBlockHandler::CanBeAt(cChunkInterface & a_ChunkInterface, int a_BlockX, int a_BlockY, int a_BlockZ, const cChunk & a_Chunk)
+{
+ return true;
+}
+
+
+
+
+
+bool cBlockHandler::IsUseable()
+{
+ return false;
+}
+
+
+
+
+
+bool cBlockHandler::IsClickedThrough(void)
+{
+ return false;
+}
+
+
+
+
+
+bool cBlockHandler::DoesIgnoreBuildCollision(void)
+{
+ return (m_BlockType == E_BLOCK_AIR);
+}
+
+
+
+
+
+bool cBlockHandler::DoesDropOnUnsuitable(void)
+{
+ return true;
+}
+
+
+
+
+
+void cBlockHandler::Check(cChunkInterface & a_ChunkInterface, cBlockPluginInterface & a_PluginInterface, int a_RelX, int a_RelY, int a_RelZ, cChunk & a_Chunk)
+{
+}
+
+
+
+
+
+ColourID cBlockHandler::GetMapBaseColourID(NIBBLETYPE a_Meta)
+{
+ return 0;
+}
+
+
+
+
+
+bool cBlockHandler::IsInsideBlock(const Vector3d & a_Position, const BLOCKTYPE a_BlockType, const NIBBLETYPE a_BlockMeta)
+{
+ return true;
+}
+
+
+
+
+
+cBlockEntity * cBlockEntity::CreateByBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World)
+{
+ return nullptr;
+}
+
+
+
+
+
+void cDeadlockDetect::TrackCriticalSection(cCriticalSection & a_CS, const AString & a_Name)
+{
+}
+
+
+
+
+
+void cDeadlockDetect::UntrackCriticalSection(cCriticalSection & a_CS)
+{
+}
+
+
+
+
diff --git a/tests/Generating/Test.cubeset b/tests/Generating/Test.cubeset
new file mode 100644
index 000000000..956e6684e
--- /dev/null
+++ b/tests/Generating/Test.cubeset
@@ -0,0 +1,155 @@
+
+-- Test.cubeset
+
+-- This simple cubeset file is used for testing the cPrefabPiecePool loader.
+
+
+
+
+
+Cubeset =
+{
+ Metadata =
+ {
+ CubesetFormatVersion = 1,
+ },
+
+ Pieces =
+ {
+ -- One piece with inline definition:
+ {
+ Size =
+ {
+ x = 4,
+ y = 4,
+ z = 4,
+ },
+ Hitbox =
+ {
+ MinX = 0,
+ MinY = 0,
+ MinZ = 0,
+ MaxX = 3,
+ MaxY = 3,
+ MaxZ = 3,
+ },
+ BlockDefinitions =
+ {
+ ".: 0: 0", -- air
+ "a: 1: 0", -- stone
+ "b: 24: 0", -- sandstone
+ "c: 8: 0", -- water
+ "d: 85: 0", -- fence
+ "m: 19: 0", -- sponge
+ },
+ BlockData =
+ {
+ -- Level 0
+ "aaaa", -- 0
+ "aaaa", -- 1
+ "aaaa", -- 2
+ "aaaa", -- 3
+
+ -- Level 1
+ "bbbb", -- 0
+ "bccb", -- 1
+ "bccb", -- 2
+ "bbbb", -- 3
+
+ -- Level 2
+ "bbbb", -- 0
+ "bccb", -- 1
+ "bccb", -- 2
+ "bbbb", -- 3
+
+ -- Level 3
+ "bbbb", -- 0
+ "bccb", -- 1
+ "bccb", -- 2
+ "bbbb", -- 3
+ },
+ Connectors =
+ {
+ {
+ Type = 2,
+ RelX = 2,
+ RelY = 2,
+ RelZ = 0,
+ Direction = 2, -- Z-
+ },
+ {
+ Type = 2,
+ RelX = 0,
+ RelY = 2,
+ RelZ = 1,
+ Direction = 4, -- X-
+ },
+ {
+ Type = 2,
+ RelX = 1,
+ RelY = 2,
+ RelZ = 3,
+ Direction = 3, -- Z+
+ },
+ {
+ Type = 2,
+ RelX = 3,
+ RelY = 2,
+ RelZ = 2,
+ Direction = 5, -- X+
+ },
+ },
+ Metadata =
+ {
+ ["DefaultWeight"] = "100",
+ ["AllowedRotations"] = "7",
+ ["MergeStrategy"] = "msSpongePrint",
+ ["IsStarting"] = "1",
+ ["DepthWeight"] = "",
+ ["ExpandFloorStrategy"] = "None",
+ ["MoveToGround"] = "1",
+ ["AddWeightIfSame"] = "0",
+ ["VerticalStrategy"] = "Fixed|150",
+ },
+ },
+
+ -- One piece with external definition:
+ {
+ Hitbox =
+ {
+ MinX = 0,
+ MinY = 0,
+ MinZ = 0,
+ MaxX = 3,
+ MaxY = 3,
+ MaxZ = 3,
+ },
+ SchematicFileName = "Test1.schematic",
+ Connectors =
+ {
+ {
+ Type = 2,
+ RelX = 2,
+ RelY = 2,
+ RelZ = 0,
+ Direction = 2, -- Z-
+ },
+ },
+ Metadata =
+ {
+ ["DefaultWeight"] = "100",
+ ["AllowedRotations"] = "7",
+ ["MergeStrategy"] = "msSpongePrint",
+ ["IsStarting"] = "0",
+ ["DepthWeight"] = "",
+ ["ExpandFloorStrategy"] = "None",
+ ["MoveToGround"] = "0",
+ ["AddWeightIfSame"] = "0",
+ },
+ },
+ }, -- Pieces
+}
+
+
+
+
diff --git a/tests/Generating/Test1.schematic b/tests/Generating/Test1.schematic
new file mode 100644
index 000000000..6fe19e9db
--- /dev/null
+++ b/tests/Generating/Test1.schematic
Binary files differ