Files
AnyPS5/core/libs/tests/SystemServiceLanguageLocale.cpp
T
MarcZX10 238bf96bcc test(libSceSystemService): cover the BCP-47 locale tag parser
Adds a host-only test, system_service_language_locale, for ParseTag: case
normalisation of the language, script and region subtags, the three-digit
region of es-419, variants and extensions that are ignored, and the inputs it
must reject (empty and oversized subtags, one-letter and long languages, the
POSIX underscore and codeset forms) without touching the output tag.
2026-10-29 08:51:16 +00:00

60 lines
2.0 KiB
C++

#include "prx/libSceSystemService/LanguageLocale.hpp"
#include <cstdio>
#include <cstdlib>
#include <string>
#include <string_view>
namespace {
void Require(bool value, std::string_view what) {
if (value) return;
std::fprintf(stderr, "check failed: %.*s\n", static_cast<int>(what.size()), what.data());
std::abort();
}
struct ParsedTag {
std::string_view text;
std::string_view language;
std::string_view script;
std::string_view region;
};
void RequireBcp47Parsing() {
constexpr ParsedTag accepted[] = {
{"en", "en", "", ""},
{"en-US", "en", "", "US"},
{"EN-us", "en", "", "US"},
{"pt-BR", "pt", "", "BR"},
{"es-419", "es", "", "419"},
{"zh-Hant-TW", "zh", "Hant", "TW"},
{"zh-hans-cn", "zh", "Hans", "CN"},
{"ZH-HANT", "zh", "Hant", ""},
{"sr-Latn-RS", "sr", "Latn", "RS"},
{"fil", "fil", "", ""},
{"en-US-u-ca-gregory", "en", "", "US"},
{"de-DE-1996", "de", "", "DE"},
{"ca-ES-valencia", "ca", "", "ES"},
{"en-x-private", "en", "", ""},
{"en-Latn-US-x-a", "en", "Latn", "US"},
};
for (const auto& expected : accepted) {
SystemServiceLocale::Tag tag;
Require(SystemServiceLocale::ParseTag(expected.text, tag), expected.text);
Require(tag.language == expected.language, expected.text);
Require(tag.script == expected.script, expected.text);
Require(tag.region == expected.region, expected.text);
}
for (std::string_view rejected : {"", "-", "en-", "-en", "en--US", "e", "english", "e1", "12", "en_US", "en-US.UTF-8", "en US", "en-U$", "en-abcdefghi", "C", "x-foo"}) {
SystemServiceLocale::Tag tag{"keep", "keep", "keep"};
const bool parsed = SystemServiceLocale::ParseTag(rejected, tag);
Require(!parsed, rejected);
Require(tag.language == "keep" && tag.script == "keep" && tag.region == "keep", rejected);
}
}
}
int main() {
RequireBcp47Parsing();
}