diff --git a/CMakeLists.txt b/CMakeLists.txt index c212a1e..dae907d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,3 +41,5 @@ install( PUBLIC_HEADER DESTINATION include/mimir ) + +add_subdirectory(tests) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..1ebdca1 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,28 @@ +# ----====---- GoogleTest ----====--- +include(FetchContent) +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip +) +# For Windows: Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) + +# ----====---- End: GoogleTest ----====--- + +enable_testing() + +add_executable( + mimir_test + "region_test.cpp" +) +target_link_libraries( + mimir_test + GTest::gtest_main + mimir +) + +target_include_directories(mimir_test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../include) + +include(GoogleTest) +gtest_discover_tests(mimir_test) diff --git a/tests/region_test.cpp b/tests/region_test.cpp new file mode 100644 index 0000000..41d5328 --- /dev/null +++ b/tests/region_test.cpp @@ -0,0 +1,55 @@ +#include +#include "mimir.h" + +void writeData(std::byte* dest, size_t count, int seed) +{ + for (int i = 0; i < count; i++) { + dest[i] = std::byte((seed * 3162 + i * 63163) % 0xff); + } +} + +bool checkData(std::byte* src, size_t count, int seed) +{ + for (int i = 0; i < count; i++) { + if (src[i] != std::byte((seed * 3162 + i * 63163) % 0xff)) { + return false; + } + } + return true; +} + +TEST(Mimir_Region, Uninitialized) { + mimir::init(); + mimir::Region region; + EXPECT_TRUE(region.getAddress() == nullptr); + EXPECT_TRUE(region.getMaxSize() == 0); + EXPECT_TRUE(region.getSize() == 0); +} + +TEST(Mimir_Region, Resizing) +{ + mimir::init(); + mimir::Region region; + + EXPECT_TRUE(region.init(1 << 10ULL)); + EXPECT_NE(region.getAddress(), nullptr); + EXPECT_GT(region.getMaxSize(), 0); + EXPECT_EQ(region.getSize(), 0); + EXPECT_TRUE(region.resize(0)); + EXPECT_EQ(region.getSize(), 0); + EXPECT_FALSE(region.resize(1 << 20ULL)); + EXPECT_EQ(region.getSize(), 0); + EXPECT_TRUE(region.resize(100)); + EXPECT_GE(region.getSize(), 100); + writeData(region.getAddress(), 100, 1); + EXPECT_TRUE(checkData(region.getAddress(), 100, 1)); + EXPECT_TRUE(region.resize(1 << 9ULL)); + writeData(region.getAddress() + 100, 900, 2); + EXPECT_TRUE(checkData(region.getAddress(), 100, 1)); + EXPECT_TRUE(checkData(region.getAddress() + 100, 900, 2)); + + EXPECT_TRUE(region.resize(1 << 10ULL)); + EXPECT_TRUE(region.resize(1 << 5ULL)); + EXPECT_TRUE(region.resize(1 << 0ULL)); + EXPECT_TRUE(region.resize(1 << 9ULL)); +}