diff --git a/CMakeLists.txt b/CMakeLists.txt index 00762e0e5..337e81797 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -127,3 +127,26 @@ add_subdirectory(external/sol2) add_subdirectory(source/common) add_subdirectory(source/server) add_subdirectory(source/client) + +#------------------------------------------------------------------------------ +# Unit testing +#------------------------------------------------------------------------------ +find_package(CxxTest QUIET) + +if(CXXTEST_FOUND) + include_directories(${CXXTEST_INCLUDE_DIRS}) + enable_testing() + + file(GLOB_RECURSE HEADER_FILES source/*.hpp) + foreach(HEADER_FILE ${HEADER_FILES}) + get_filename_component(HEADER_DIRECTORY ${HEADER_FILE} DIRECTORY) + include_directories(${HEADER_DIRECTORY}) + endforeach(HEADER_FILE) + + file(GLOB_RECURSE TEST_FILES tests/*.hpp) + CXXTEST_ADD_TEST(${CMAKE_PROJECT_NAME}_tests unit-test.cpp ${TEST_FILES}) + target_link_libraries(${CMAKE_PROJECT_NAME}_tests ${CMAKE_PROJECT_NAME}_common ${CMAKE_PROJECT_NAME}_server_lib) +else() + message(WARNING "CxxTest not found!") +endif() + diff --git a/source/common/world/BlockParam.cpp b/source/common/world/BlockParam.cpp index 6eb76bead..07817f5d5 100644 --- a/source/common/world/BlockParam.cpp +++ b/source/common/world/BlockParam.cpp @@ -42,7 +42,7 @@ void BlockParam::deserialize(sf::Packet &packet) { void BlockParam::allocateBits(u8 type, u8 size) { auto it = m_allocatedBits.find(type); if (it != m_allocatedBits.end()) { - gkWarning() << "Can't allocate param type" << getTypeName(type) << "twice in block" << m_block->stringID(); + gkError() << "Can't allocate param type" << getTypeName(type) << "twice in block" << m_block->stringID(); } else if (m_totalSize + size <= 16) { m_allocatedBits.emplace(type, Param{m_totalSize, size}); @@ -63,7 +63,8 @@ void BlockParam::allocateBits(u8 type, u8 size) { u16 BlockParam::getParam(u8 type, u16 data) const { auto it = m_allocatedBits.find(type); if (it == m_allocatedBits.end()) { - gkWarning() << "Failed to get param" << getTypeName(type) << "in block" << m_block->stringID(); + gkError() << "Failed to get param" << getTypeName(type) << "in block" << m_block->stringID(); + gkError() << "Reason: This param type has not been allocated."; return 0; } @@ -73,7 +74,8 @@ u16 BlockParam::getParam(u8 type, u16 data) const { u16 BlockParam::setParam(u8 type, u16 data, u16 param) const { auto it = m_allocatedBits.find(type); if (it == m_allocatedBits.end()) { - gkWarning() << "Failed to set param" << getTypeName(type) << "in block" << m_block->stringID(); + gkError() << "Failed to set param" << getTypeName(type) << "in block" << m_block->stringID(); + gkError() << "Reason: This param type has not been allocated."; return 0; } diff --git a/source/common/world/BlockParam.hpp b/source/common/world/BlockParam.hpp index 506193453..3fe31d427 100644 --- a/source/common/world/BlockParam.hpp +++ b/source/common/world/BlockParam.hpp @@ -54,6 +54,7 @@ class BlockParam : public gk::ISerializable { }; void allocateBits(u8 type, u8 size); + u8 getAllocatedSize() const { return m_totalSize; } u16 getParam(u8 type, u16 data) const; u16 setParam(u8 type, u16 data, u16 param) const; diff --git a/tests/BlockParamTests.hpp b/tests/BlockParamTests.hpp new file mode 100644 index 000000000..ad206b978 --- /dev/null +++ b/tests/BlockParamTests.hpp @@ -0,0 +1,58 @@ +/* + * ===================================================================================== + * + * OpenMiner + * + * Copyright (C) 2018-2020 Unarelith, Quentin Bazin + * Copyright (C) 2019-2020 the OpenMiner contributors (see CONTRIBUTORS.md) + * + * This file is part of OpenMiner. + * + * OpenMiner is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * OpenMiner is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with OpenMiner; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * ===================================================================================== + */ +#ifndef BLOCKPARAMTESTS_HPP_ +#define BLOCKPARAMTESTS_HPP_ + +#include + +#include "Block.hpp" +#include "BlockParam.hpp" + +class BlockParamTests : public CxxTest::TestSuite { + public: + void testAllocation() { + Block m_block{1, "default:myblock"}; + + TS_ASSERT_EQUALS(m_block.param().getAllocatedSize(), 0); + + m_block.param().allocateBits(BlockParam::Rotation, 5); + m_block.param().allocateBits(BlockParam::State, 2); + + u16 blockParam = 0; + + blockParam = m_block.param().setParam(BlockParam::Rotation, blockParam, 16); + TS_ASSERT_EQUALS(blockParam, 16); + + blockParam = m_block.param().setParam(BlockParam::State, blockParam, 3); + TS_ASSERT_EQUALS(blockParam, 16 | (3 << 5)); + + TS_ASSERT_EQUALS(m_block.param().getParam(BlockParam::Rotation, blockParam), 16); + TS_ASSERT_EQUALS(m_block.param().getParam(BlockParam::State, blockParam), 3); + } +}; + +#endif // BLOCKPARAMTESTS_HPP_