#include "SceTypes.hpp" #include #include #include extern "C" { int APS5_VABI sceNpAuthCreateRequest(); int APS5_VABI sceNpAuthDeleteRequest(int); int APS5_VABI sceNpAuthGetAuthorizedAppCode(std::int32_t, const NpAuthAuthorizedAppCodeParameter*, char*, std::int32_t*, bool*); } static void Require(bool condition) { if (!condition) std::abort(); } int main() { constexpr auto invalidArgument = static_cast(0x80550301u); constexpr auto invalidSize = static_cast(0x80550302u); constexpr auto requestNotFound = static_cast(0x80550306u); std::array client{}; std::array code{}; code.fill('x'); const auto original = code; bool authorizationRequired = true; NpAuthAuthorizedAppCodeParameter parameter{40, 1, reinterpret_cast(client.data()), "", 0}; Require(sceNpAuthGetAuthorizedAppCode(0, nullptr, code.data(), nullptr, &authorizationRequired) == invalidArgument); parameter.size = 39; Require(sceNpAuthGetAuthorizedAppCode(0, ¶meter, code.data(), nullptr, &authorizationRequired) == invalidSize); parameter.size = 40; Require(sceNpAuthGetAuthorizedAppCode(0, ¶meter, nullptr, nullptr, &authorizationRequired) == invalidArgument); Require(sceNpAuthGetAuthorizedAppCode(0, ¶meter, code.data(), nullptr, nullptr) == invalidArgument); parameter.option = 2; Require(sceNpAuthGetAuthorizedAppCode(0, ¶meter, code.data(), nullptr, &authorizationRequired) == invalidArgument); parameter.option = 0; parameter.userId = -1; Require(sceNpAuthGetAuthorizedAppCode(0, ¶meter, code.data(), nullptr, &authorizationRequired) == invalidArgument); parameter.userId = 1; Require(sceNpAuthGetAuthorizedAppCode(0, ¶meter, code.data(), nullptr, &authorizationRequired) == requestNotFound); const auto requestId = sceNpAuthCreateRequest(); Require(requestId > 0); bool threw = false; try { sceNpAuthGetAuthorizedAppCode(requestId, ¶meter, code.data(), nullptr, &authorizationRequired); } catch (const std::logic_error&) { threw = true; } Require(threw && code == original && authorizationRequired); Require(sceNpAuthDeleteRequest(requestId) == 0); }