From 3cc38e5923e5fc46b84eb04f1d5acd185a82cd0c Mon Sep 17 00:00:00 2001 From: BunnyFl <166477956+BunnyFl@users.noreply.github.com> Date: Thu, 29 Oct 2026 13:28:21 +0100 Subject: [PATCH] test(libSceConvertKeycode): cover both sides of each SDK threshold on PS4 and PS5 Adds the boundary rows suggested in review: PS5 SDK 0x03FFFFFF/0x04000000 for Y/Z, 0x05FFFFFF/0x06000000 for layout 38, 0x07FFFFFF/0x08000000 for 39, and a PS4 run of the cusa title case for 0x04FFFFFF/0x05000000, 0x08FFFFFF/0x09000000, 0x0FFFFFFF/0x10000000 and layout 39. Every expected value matches firmware 13.42's module. Co-Authored-By: Claude Opus 5.5 --- .../prx/libSceConvertKeycode/CMakeLists.txt | 2 +- core/libs/tests/GuestConvertKeycode.cpp | 17 +++++++++++ core/libs/tests/GuestConvertKeycodeTitle.cpp | 30 ++++++++++++++++++- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/core/libs/prx/libSceConvertKeycode/CMakeLists.txt b/core/libs/prx/libSceConvertKeycode/CMakeLists.txt index 341ff705b0..fc616fe47b 100644 --- a/core/libs/prx/libSceConvertKeycode/CMakeLists.txt +++ b/core/libs/prx/libSceConvertKeycode/CMakeLists.txt @@ -32,7 +32,7 @@ if(BUILD_TESTING) elseif(titleCase STREQUAL "malformed-json") file(WRITE ${titleRun}/app0/sce_sys/param.json "{") endif() - add_test(NAME guest_convert_keycode_title_${titleCase} COMMAND guest_convert_keycode_title_tests WORKING_DIRECTORY ${titleRun}) + add_test(NAME guest_convert_keycode_title_${titleCase} COMMAND guest_convert_keycode_title_tests $,ps4,ps5> WORKING_DIRECTORY ${titleRun}) if(WIN32) set_tests_properties(guest_convert_keycode_title_${titleCase} PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") diff --git a/core/libs/tests/GuestConvertKeycode.cpp b/core/libs/tests/GuestConvertKeycode.cpp index e381eb60b3..70ba11927f 100644 --- a/core/libs/tests/GuestConvertKeycode.cpp +++ b/core/libs/tests/GuestConvertKeycode.cpp @@ -160,6 +160,23 @@ int main() { Require(sceConvertKeycodeGetVirtualKeycode(28, layout, &virtualKey) == static_cast(0x80BC001Du) && virtualKey == 0xABCD); Require(sceConvertKeycodeGetCharacter(28, 0, layout, &rejectedCharacter) == static_cast(0x80BC001Du) && rejectedCharacter == u'?'); } + const auto setSdkVersion = [&](std::uint32_t version) { std::memcpy(process.data() + 16, &version, sizeof(version)); }; + setSdkVersion(0x03FFFFFFu); + Require(sceConvertKeycodeGetVirtualKeycode(28, 2, &virtualKey) == 0 && virtualKey == 89); + setSdkVersion(0x04000000u); + Require(sceConvertKeycodeGetVirtualKeycode(28, 2, &virtualKey) == 0 && virtualKey == 90); + setSdkVersion(0x05FFFFFFu); + KeyboardData oldKeyData{}; + oldKeyData.length = 1; + oldKeyData.key_code[0] = 4; + Require(sceConvertKeycodeGetCharacterFromKeyboardData(&oldKeyData, 0, 0, 38, &rejectedCharacter) == static_cast(0x80BC001Du) && rejectedCharacter == u'?'); + setSdkVersion(0x06000000u); + Require(sceConvertKeycodeGetVirtualKeycode(28, 38, &virtualKey) == 0 && virtualKey == 89); + Require(sceConvertKeycodeGetVirtualKeycode(28, 39, &virtualKey) == static_cast(0x80BC001Du)); + setSdkVersion(0x07FFFFFFu); + Require(sceConvertKeycodeGetVirtualKeycode(28, 39, &virtualKey) == static_cast(0x80BC001Du)); + setSdkVersion(0x08000000u); + Require(sceConvertKeycodeGetVirtualKeycode(28, 39, &virtualKey) == 0 && virtualKey == 89); std::memcpy(process.data() + 16, &sdkVersion, sizeof(sdkVersion)); } diff --git a/core/libs/tests/GuestConvertKeycodeTitle.cpp b/core/libs/tests/GuestConvertKeycodeTitle.cpp index 0ee595de20..267ff00453 100644 --- a/core/libs/tests/GuestConvertKeycodeTitle.cpp +++ b/core/libs/tests/GuestConvertKeycodeTitle.cpp @@ -7,7 +7,7 @@ #include #include -int main() { +int main(int argc, char** argv) { #ifdef _WIN32 if (_putenv_s("ANYPS5_LANGUAGE", "") != 0) return 2; #else @@ -27,5 +27,33 @@ int main() { if (sceConvertKeycodeGetCharacter(0, 0, 0, &character) != static_cast(0x80BC001Du)) return 1; if (sceConvertKeycodeGetCharacter(0, 0, 40, &character) != static_cast(0x80BC001Du)) return 1; if (sceConvertKeycodeGetImeKeyboardType(0x10000000, nullptr) != static_cast(0x80BC0031u)) return 1; + if (argc > 1 && std::strcmp(argv[1], "ps4") == 0) { + constexpr int rejected = static_cast(0x80BC001Du); + KeyboardData keyData{}; + keyData.length = 1; + keyData.key_code[0] = 4; + const auto setSdkVersion = [](std::uint32_t version) { std::memcpy(process.data() + 16, &version, sizeof(version)); }; + setSdkVersion(0x04FFFFFFu); + virtualKey = 0xABCD; + character = u'?'; + if (sceConvertKeycodeGetVirtualKeycode(28, 31, &virtualKey) != rejected || virtualKey != 0xABCD) return 1; + if (sceConvertKeycodeGetCharacter(28, 0, 31, &character) != rejected || character != u'?') return 1; + if (sceConvertKeycodeGetCharacterFromKeyboardData(&keyData, 0, 0, 31, &character) != rejected || character != u'?') return 1; + setSdkVersion(0x05000000u); + if (sceConvertKeycodeGetVirtualKeycode(28, 31, &virtualKey) != 0 || virtualKey != 89) return 1; + if (sceConvertKeycodeGetVirtualKeycode(28, 38, &virtualKey) != rejected) return 1; + setSdkVersion(0x08FFFFFFu); + if (sceConvertKeycodeGetVirtualKeycode(28, 2, &virtualKey) != 0 || virtualKey != 89) return 1; + setSdkVersion(0x09000000u); + if (sceConvertKeycodeGetVirtualKeycode(28, 2, &virtualKey) != 0 || virtualKey != 90) return 1; + setSdkVersion(0x0FFFFFFFu); + if (sceConvertKeycodeGetVirtualKeycode(28, 38, &virtualKey) != rejected) return 1; + setSdkVersion(0x10000000u); + if (sceConvertKeycodeGetVirtualKeycode(28, 38, &virtualKey) != 0 || virtualKey != 89) return 1; + setSdkVersion(0xFFFFFFFFu); + if (sceConvertKeycodeGetVirtualKeycode(28, 39, &virtualKey) != rejected) return 1; + if (sceConvertKeycodeGetCharacter(28, 0, 39, &character) != rejected) return 1; + setSdkVersion(sdkVersion); + } return sceConvertKeycodeGetImeKeyboardType(0x10000000, &type) == 0 && type == 4 ? 0 : 1; }