1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-09-30 19:22:14 +00:00

Minor refactor to the Plural-Forms parser (#16489)

This commit is contained in:
y5nw 2025-09-14 22:56:40 +02:00 committed by GitHub
parent 053ca6287a
commit cc6b56b034
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 158 additions and 174 deletions

View file

@ -25,40 +25,59 @@ TEST_CASE("test translations")
{
SECTION("Plural-Forms function for translations")
{
#define REQUIRE_FORM_SIZE(x) {REQUIRE(form); REQUIRE(form->size() == (x));}
// Test cases from https://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
auto form = GettextPluralForm::parseHeaderLine(L"Plural-Forms: nplurals=2; plural=n != 1;");
#define REQUIRE_FORM_SIZE(x) {REQUIRE(form); REQUIRE(form.size() == (x));}
// Basic test cases
auto form = GettextPluralForm(L"Plural-Forms: nplurals=2; plural=1;");
REQUIRE_FORM_SIZE(2);
CHECK((*form)(0) == 1);
CHECK((*form)(1) == 0);
CHECK((*form)(2) == 1);
CHECK(form(0) == 1);
form = GettextPluralForm::parseHeaderLine(L"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;");
form = GettextPluralForm(L"");
REQUIRE(form.size() == 0);
CHECK(form(0) == 0);
// Test cases from https://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
form = GettextPluralForm(L"Plural-Forms: nplurals=2; plural=n != 1;");
REQUIRE_FORM_SIZE(2);
CHECK(form(0) == 1);
CHECK(form(1) == 0);
CHECK(form(2) == 1);
form = GettextPluralForm(L"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;");
REQUIRE_FORM_SIZE(3);
CHECK((*form)(0) == 2);
CHECK((*form)(1) == 0);
CHECK((*form)(102) == 1);
CHECK((*form)(111) == 1);
CHECK(form(0) == 2);
CHECK(form(1) == 0);
CHECK(form(102) == 1);
CHECK(form(111) == 1);
form = GettextPluralForm::parseHeaderLine(L"Plural-Forms: nplurals=3; "
form = GettextPluralForm(L"Plural-Forms: nplurals=3; "
"plural=n%10==1 && n%100!=11 ? 0 : "
"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");
REQUIRE_FORM_SIZE(3);
CHECK((*form)(0) == 2);
CHECK((*form)(1) == 0);
CHECK((*form)(102) == 1);
CHECK((*form)(104) == 1);
CHECK((*form)(111) == 2);
CHECK((*form)(112) == 2);
CHECK((*form)(121) == 0);
CHECK((*form)(122) == 1);
CHECK(form(0) == 2);
CHECK(form(1) == 0);
CHECK(form(102) == 1);
CHECK(form(104) == 1);
CHECK(form(111) == 2);
CHECK(form(112) == 2);
CHECK(form(121) == 0);
CHECK(form(122) == 1);
// Edge cases
form = GettextPluralForm::parseHeaderLine(L"Plural-Forms: nplurals=3; plural= (n-1+1)<=1 ? n||1?0:1 : 1?(!!2):2;");
form = GettextPluralForm(L"Plural-Forms: nplurals=3; plural= (n-1+1)<=1 ? n||1?0:1 : 1?(!!2):2;");
REQUIRE_FORM_SIZE(3);
CHECK((*form)(0) == 0);
CHECK((*form)(1) == 0);
CHECK((*form)(2) == 1);
CHECK(form(0) == 0);
CHECK(form(1) == 0);
CHECK(form(2) == 1);
form = GettextPluralForm(L"Plural-Forms: nplurals=2; plural=4/n;");
REQUIRE_FORM_SIZE(2);
CHECK(form(1) == 4);
CHECK(form(0) == 0);
form = GettextPluralForm(L"Plural-Forms: nplurals=2; plural=7%n;");
REQUIRE_FORM_SIZE(2);
CHECK(form(3) == 1);
CHECK(form(0) == 0);
#undef REQUIRE_FORM_SIZE
}