diff --git a/CMakeLists.txt b/CMakeLists.txt index 40ef5b1..f5a9ed0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,9 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) project(IACore) +# Default to ON if root, OFF if dependency +option(IACore_BUILD_TESTS "Build unit tests" ${PROJECT_IS_TOP_LEVEL}) + message(STATUS "Detected Compiler ID: ${CMAKE_CXX_COMPILER_ID}") # Check if the compiler is MSVC (cl.exe), but allow Clang acting like MSVC (clang-cl) if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") @@ -42,6 +45,6 @@ add_subdirectory(Vendor/) add_subdirectory(Src/) -if(IA_BUILD_TESTS) - add_subdirectory(Tests/) +if(IACore_BUILD_TESTS) + add_subdirectory(Tests) endif() diff --git a/Src/IACore/inc/IACore/BinaryReader.hpp b/Src/IACore/inc/IACore/BinaryReader.hpp index 3415f6a..e7c4c3b 100644 --- a/Src/IACore/inc/IACore/BinaryReader.hpp +++ b/Src/IACore/inc/IACore/BinaryReader.hpp @@ -37,11 +37,11 @@ namespace IACore { // Generic Primitive Reader (Read(), Read(), etc.) template NO_DISCARD("Check for EOF") - tl::expected Read() { + Expected Read() { constexpr SIZE_T size = sizeof(T); if B_UNLIKELY((m_cursor + size > m_span.size())) { - return tl::make_unexpected(String("Unexpected EOF reading type")); + return MakeUnexpected(String("Unexpected EOF reading type")); } T value; diff --git a/Src/IACore/inc/IACore/PCH.hpp b/Src/IACore/inc/IACore/PCH.hpp index 4d59eb3..af89d51 100644 --- a/Src/IACore/inc/IACore/PCH.hpp +++ b/Src/IACore/inc/IACore/PCH.hpp @@ -220,11 +220,12 @@ // Templates and Aliases #ifdef __cplusplus -# define ALIAS_FUNCTION(alias, function) \ - template auto alias(Args &&...args) -> decltype(f(std::forward(args)...)) \ - { \ - return function(std::forward(args)...); \ - } +#define ALIAS_FUNCTION(alias, function) \ + template \ + auto alias(Args &&...args) -> decltype(function(std::forward(args)...)) \ + { \ + return function(std::forward(args)...); \ + } # define ALIAS_TEMPLATE_FUNCTION(t, alias, function) \ template \ @@ -513,6 +514,10 @@ template using UnorderedSet = ankerl::unordered_dense::set<_ template using UnorderedMap = ankerl::unordered_dense::map<_key_type, _value_type>; +template +using Expected = tl::expected<_expected_type, _unexpected_type>; +ALIAS_FUNCTION(MakeUnexpected, tl::make_unexpected); + using String = std::string; using StringView = std::string_view; using StringStream = std::stringstream; diff --git a/Tests/Unit/BinaryReader.cpp b/Tests/Unit/BinaryReader.cpp index 1e7f1d0..6e14057 100644 --- a/Tests/Unit/BinaryReader.cpp +++ b/Tests/Unit/BinaryReader.cpp @@ -38,7 +38,7 @@ IAT_BEGIN_BLOCK(Core, BinaryReader) auto val1 = reader.Read(); IAT_CHECK(val1.has_value()); IAT_CHECK_EQ(*val1, 0xAA); - IAT_CHECK_EQ(reader.Cursor(), 1); + IAT_CHECK_EQ(reader.Cursor(), (SIZE_T)1); // Read Second Byte auto val2 = reader.Read(); @@ -61,9 +61,9 @@ IAT_BEGIN_BLOCK(Core, BinaryReader) // Assuming standard x86/ARM Little Endian for this test // If your engine supports Big Endian, you'd check architecture here - IAT_CHECK_EQ(*val, 0x04030201); + IAT_CHECK_EQ(*val, (UINT32)0x04030201); - IAT_CHECK_EQ(reader.Cursor(), 4); + IAT_CHECK_EQ(reader.Cursor(), (SIZE_T)4); IAT_CHECK(reader.IsEOF()); return TRUE; @@ -100,7 +100,7 @@ IAT_BEGIN_BLOCK(Core, BinaryReader) auto str = reader.ReadString(5); IAT_CHECK(str.has_value()); IAT_CHECK_EQ(*str, String("Hello")); - IAT_CHECK_EQ(reader.Cursor(), 5); + IAT_CHECK_EQ(reader.Cursor(), (SIZE_T)5); // Read remaining "IA" auto str2 = reader.ReadString(2); @@ -128,7 +128,7 @@ IAT_BEGIN_BLOCK(Core, BinaryReader) IAT_CHECK_EQ(dst[2], 3); // Verify cursor - IAT_CHECK_EQ(reader.Cursor(), 3); + IAT_CHECK_EQ(reader.Cursor(), (SIZE_T)3); return TRUE; } @@ -141,22 +141,22 @@ IAT_BEGIN_BLOCK(Core, BinaryReader) UINT8 data[10] = { 0 }; // Zero init BinaryReader reader(data); - IAT_CHECK_EQ(reader.Remaining(), 10); + IAT_CHECK_EQ(reader.Remaining(), (SIZE_T)10); // Skip reader.Skip(5); - IAT_CHECK_EQ(reader.Cursor(), 5); - IAT_CHECK_EQ(reader.Remaining(), 5); + IAT_CHECK_EQ(reader.Cursor(), (SIZE_T)5); + IAT_CHECK_EQ(reader.Remaining(), (SIZE_T)5); // Skip clamping reader.Skip(100); // Should clamp to 10 - IAT_CHECK_EQ(reader.Cursor(), 10); + IAT_CHECK_EQ(reader.Cursor(), (SIZE_T)10); IAT_CHECK(reader.IsEOF()); // Seek reader.Seek(2); - IAT_CHECK_EQ(reader.Cursor(), 2); - IAT_CHECK_EQ(reader.Remaining(), 8); + IAT_CHECK_EQ(reader.Cursor(), (SIZE_T)2); + IAT_CHECK_EQ(reader.Remaining(), (SIZE_T)8); IAT_CHECK_NOT(reader.IsEOF()); return TRUE; diff --git a/Tests/Unit/BinaryWriter.cpp b/Tests/Unit/BinaryWriter.cpp index 3fb8c58..9378aa6 100644 --- a/Tests/Unit/BinaryWriter.cpp +++ b/Tests/Unit/BinaryWriter.cpp @@ -37,14 +37,14 @@ IAT_BEGIN_BLOCK(Core, BinaryWriter) // Write 1 Byte writer.Write(0xAA); - IAT_CHECK_EQ(buffer.size(), 1); + IAT_CHECK_EQ(buffer.size(), (SIZE_T)1); IAT_CHECK_EQ(buffer[0], 0xAA); // Write 4 Bytes (UINT32) // 0xDDCCBBAA -> Little Endian: AA BB CC DD writer.Write(0xDDCCBBAA); - IAT_CHECK_EQ(buffer.size(), 5); + IAT_CHECK_EQ(buffer.size(), (SIZE_T)5); // Verify Memory Layout IAT_CHECK_EQ(buffer[1], 0xAA); @@ -67,7 +67,7 @@ IAT_BEGIN_BLOCK(Core, BinaryWriter) // Should append to end, not overwrite 0x01 writer.Write(0x03); - IAT_CHECK_EQ(buffer.size(), 3); + IAT_CHECK_EQ(buffer.size(), (SIZE_T)3); IAT_CHECK_EQ(buffer[0], 0x01); IAT_CHECK_EQ(buffer[2], 0x03); @@ -112,7 +112,7 @@ IAT_BEGIN_BLOCK(Core, BinaryWriter) writer.WriteBytes((PVOID)msg, 2); writer.Write(0x00); // Null term - IAT_CHECK_EQ(buffer.size(), 3); + IAT_CHECK_EQ(buffer.size(), (SIZE_T)3); IAT_CHECK_EQ(buffer[0], 'I'); IAT_CHECK_EQ(buffer[1], 'A'); IAT_CHECK_EQ(buffer[2], 0x00); @@ -157,7 +157,7 @@ IAT_BEGIN_BLOCK(Core, BinaryWriter) FLOAT32 val = 1.234f; writer.Write(val); - IAT_CHECK_EQ(buffer.size(), 4); + IAT_CHECK_EQ(buffer.size(), (SIZE_T)4); // Read it back via memcpy to verify FLOAT32 readBack; diff --git a/Tests/Unit/CMakeLists.txt b/Tests/Unit/CMakeLists.txt index 38e02d2..cffabe3 100644 --- a/Tests/Unit/CMakeLists.txt +++ b/Tests/Unit/CMakeLists.txt @@ -1,62 +1,64 @@ +set(TEST_NAME_PREFIX "IACore_Test_Unit_") + # ------------------------------------------------ # C Compile Test # ------------------------------------------------ enable_language(C) -add_executable(Test_Unit_CCompile "CCompile.c") +add_executable(${TEST_NAME_PREFIX}CCompile "CCompile.c") -set_target_properties(Test_Unit_CCompile PROPERTIES +set_target_properties(${TEST_NAME_PREFIX}CCompile PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED ON LINKER_LANGUAGE C ) -target_link_libraries(Test_Unit_CCompile PRIVATE IACore) +target_link_libraries(${TEST_NAME_PREFIX}CCompile PRIVATE IACore) # ------------------------------------------------ # Unit: BinaryReader # ------------------------------------------------ -add_executable(Test_Unit_BinaryReader "BinaryReader.cpp") -target_link_libraries(Test_Unit_BinaryReader PRIVATE IACore) -target_compile_options(Test_Unit_BinaryReader PRIVATE -fexceptions) -set_target_properties(Test_Unit_BinaryReader PROPERTIES USE_EXCEPTIONS ON) +add_executable(${TEST_NAME_PREFIX}BinaryReader "BinaryReader.cpp") +target_link_libraries(${TEST_NAME_PREFIX}BinaryReader PRIVATE IACore) +target_compile_options(${TEST_NAME_PREFIX}BinaryReader PRIVATE -fexceptions) +set_target_properties(${TEST_NAME_PREFIX}BinaryReader PROPERTIES USE_EXCEPTIONS ON) # ------------------------------------------------ # Unit: BinaryWriter # ------------------------------------------------ -add_executable(Test_Unit_BinaryWriter "BinaryWriter.cpp") -target_link_libraries(Test_Unit_BinaryWriter PRIVATE IACore) -target_compile_options(Test_Unit_BinaryWriter PRIVATE -fexceptions) -set_target_properties(Test_Unit_BinaryWriter PROPERTIES USE_EXCEPTIONS ON) +add_executable(${TEST_NAME_PREFIX}BinaryWriter "BinaryWriter.cpp") +target_link_libraries(${TEST_NAME_PREFIX}BinaryWriter PRIVATE IACore) +target_compile_options(${TEST_NAME_PREFIX}BinaryWriter PRIVATE -fexceptions) +set_target_properties(${TEST_NAME_PREFIX}BinaryWriter PROPERTIES USE_EXCEPTIONS ON) # ------------------------------------------------ # Unit: Environment # ------------------------------------------------ -add_executable(Test_Unit_Environment "Environment.cpp") -target_link_libraries(Test_Unit_Environment PRIVATE IACore) -target_compile_options(Test_Unit_Environment PRIVATE -fexceptions) -set_target_properties(Test_Unit_Environment PROPERTIES USE_EXCEPTIONS ON) +add_executable(${TEST_NAME_PREFIX}Environment "Environment.cpp") +target_link_libraries(${TEST_NAME_PREFIX}Environment PRIVATE IACore) +target_compile_options(${TEST_NAME_PREFIX}Environment PRIVATE -fexceptions) +set_target_properties(${TEST_NAME_PREFIX}Environment PROPERTIES USE_EXCEPTIONS ON) # ------------------------------------------------ # Unit: File # ------------------------------------------------ -add_executable(Test_Unit_File "File.cpp") -target_link_libraries(Test_Unit_File PRIVATE IACore) -target_compile_options(Test_Unit_File PRIVATE -fexceptions) -set_target_properties(Test_Unit_File PROPERTIES USE_EXCEPTIONS ON) +add_executable(${TEST_NAME_PREFIX}File "File.cpp") +target_link_libraries(${TEST_NAME_PREFIX}File PRIVATE IACore) +target_compile_options(${TEST_NAME_PREFIX}File PRIVATE -fexceptions) +set_target_properties(${TEST_NAME_PREFIX}File PROPERTIES USE_EXCEPTIONS ON) # ------------------------------------------------ # Unit: Process # ------------------------------------------------ -add_executable(Test_Unit_Process "Process.cpp") -target_link_libraries(Test_Unit_Process PRIVATE IACore) -target_compile_options(Test_Unit_Process PRIVATE -fexceptions) -set_target_properties(Test_Unit_Process PROPERTIES USE_EXCEPTIONS ON) +add_executable(${TEST_NAME_PREFIX}Process "Process.cpp") +target_link_libraries(${TEST_NAME_PREFIX}Process PRIVATE IACore) +target_compile_options(${TEST_NAME_PREFIX}Process PRIVATE -fexceptions) +set_target_properties(${TEST_NAME_PREFIX}Process PROPERTIES USE_EXCEPTIONS ON) # ------------------------------------------------ # Unit: Utils # ------------------------------------------------ -add_executable(Test_Unit_Utils "Utils.cpp") -target_link_libraries(Test_Unit_Utils PRIVATE IACore) -target_compile_options(Test_Unit_Utils PRIVATE -fexceptions) -set_target_properties(Test_Unit_Utils PROPERTIES USE_EXCEPTIONS ON) +add_executable(${TEST_NAME_PREFIX}Utils "Utils.cpp") +target_link_libraries(${TEST_NAME_PREFIX}Utils PRIVATE IACore) +target_compile_options(${TEST_NAME_PREFIX}Utils PRIVATE -fexceptions) +set_target_properties(${TEST_NAME_PREFIX}Utils PROPERTIES USE_EXCEPTIONS ON) diff --git a/Tests/Unit/File.cpp b/Tests/Unit/File.cpp index 1df7110..223822d 100644 --- a/Tests/Unit/File.cpp +++ b/Tests/Unit/File.cpp @@ -107,7 +107,7 @@ IAT_BEGIN_BLOCK(Core, File) IAT_CHECK(result.has_value()); Vector& vec = *result; - IAT_CHECK_EQ(vec.size(), 4); + IAT_CHECK_EQ(vec.size(), (SIZE_T)4); IAT_CHECK_EQ(vec[0], 0xDE); IAT_CHECK_EQ(vec[3], 0xEF); @@ -152,7 +152,7 @@ IAT_BEGIN_BLOCK(Core, File) SIZE_T bytesRead = f.Read(&magicRead, sizeof(magicRead)); IAT_CHECK_EQ(bytesRead, sizeof(UINT32)); - IAT_CHECK_EQ(magicRead, 12345); + IAT_CHECK_EQ(magicRead, (UINT32)12345); } std::filesystem::remove(path); diff --git a/Tests/Unit/Utils.cpp b/Tests/Unit/Utils.cpp index 3a38ffa..7230320 100644 --- a/Tests/Unit/Utils.cpp +++ b/Tests/Unit/Utils.cpp @@ -96,7 +96,7 @@ IAT_BEGIN_BLOCK(Core, Utils) // Empty string is valid (empty vector) auto empty = IACore::Utils::HexStringToBinary(""); IAT_CHECK(empty.has_value()); - IAT_CHECK_EQ(empty->size(), 0); + IAT_CHECK_EQ(empty->size(), (SIZE_T)0); return TRUE; } diff --git a/Tools/Builder/Build.py b/Tools/Builder/Build.py index 4417f53..3b39396 100644 --- a/Tools/Builder/Build.py +++ b/Tools/Builder/Build.py @@ -20,7 +20,7 @@ import os import sys def main(args: list[str]): - os.system("cmake -S. -B./Build/Linux -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Debug -DIA_BUILD_TESTS=ON") + os.system("cmake -S. -B./Build/Linux -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Debug") os.system("cmake --build ./Build/Linux") main(sys.argv) diff --git a/Vendor/CMakeLists.txt b/Vendor/CMakeLists.txt index c4c49d0..52d1203 100644 --- a/Vendor/CMakeLists.txt +++ b/Vendor/CMakeLists.txt @@ -1,6 +1,8 @@ +set(EXPECTED_BUILD_TESTS OFF) add_subdirectory(expected/) +set(MI_BUILD_TESTS OFF) set(MI_BUILD_STATIC ON) set(MI_BUILD_SHARED ON) add_subdirectory(mimalloc/)