diff --git a/core/libs/prx/libc/CMakeLists.txt b/core/libs/prx/libc/CMakeLists.txt index e4c0758f24e..d38b9e1c9cd 100644 --- a/core/libs/prx/libc/CMakeLists.txt +++ b/core/libs/prx/libc/CMakeLists.txt @@ -406,6 +406,16 @@ if(BUILD_TESTING) set_tests_properties(guest_wide_conversion PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() + add_test_executable(guest_wmemmove_snapshot_tests ${LIBS_INCLUDE_DIR}/tests/GuestWmemmoveSnapshot.cpp) + target_include_directories(guest_wmemmove_snapshot_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_wmemmove_snapshot_tests PRIVATE libc) + configure_windows_unwind(guest_wmemmove_snapshot_tests) + add_test(NAME guest_wmemmove_snapshot COMMAND guest_wmemmove_snapshot_tests) + set_tests_properties(guest_wmemmove_snapshot PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_wmemmove_snapshot PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() add_test_executable(guest_one_runs_tests ${LIBS_INCLUDE_DIR}/tests/GuestOneRuns.cpp) target_include_directories(guest_one_runs_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(guest_one_runs_tests PRIVATE libc) diff --git a/core/libs/tests/GuestWmemmoveSnapshot.cpp b/core/libs/tests/GuestWmemmoveSnapshot.cpp new file mode 100644 index 00000000000..3cdd7cb9b65 --- /dev/null +++ b/core/libs/tests/GuestWmemmoveSnapshot.cpp @@ -0,0 +1,33 @@ +#include "prx/libc/include/Api.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void Require(bool condition) { + if (!condition) { + std::fputs("GuestWmemmoveSnapshot check failed\n", stderr); + std::abort(); + } +} + +int main() { + constexpr std::array values = {0, 1, 0xff, 0xff00, 0xd800, 0xdc00, 0xffff, 0x1234}; + for (std::size_t count = 0; count <= 96; ++count) { + for (std::size_t source = 16; source <= 48; ++source) { + for (std::size_t destination = 16; destination <= 48; ++destination) { + std::array original{}; + for (std::size_t i = 0; i < original.size(); ++i) original[i] = values[(i + count) % values.size()]; + auto actual = original, expected = original; + for (std::size_t i = 0; i < count; ++i) expected[destination + i] = original[source + i]; + Require(wmemmove_nid_postfix(actual.data() + destination, actual.data() + source, count) == actual.data() + destination); + Require(actual == expected); + } + } + } +}