From ec1c381e041f5bbd31d01418b4e9280eaca11877 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Mon, 6 Sep 2021 18:04:23 +0200 Subject: Test and fix support for plural/definite form for ordinals MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- swedish.c | 2 +- swedish.test.c | 208 +++++++++++++++++++++++++++++---------------------------- 2 files changed, 108 insertions(+), 102 deletions(-) diff --git a/swedish.c b/swedish.c index d539793..08d46af 100644 --- a/swedish.c +++ b/swedish.c @@ -238,7 +238,7 @@ libnumtext_num2text_swedish__(char *outbuf, size_t outbuf_size, const char *num, if (INVALID_BITS(flags) || X_INVALID_TRIPLETS(flags)) goto einval; if (PLURAL_FORM(flags) || DEFINITE_FORM(flags)) - if (!ORDINAL(flags) || !DENOMINATOR(flags)) + if (!ORDINAL(flags) && !DENOMINATOR(flags)) goto einval; state.outbuf = outbuf; diff --git a/swedish.test.c b/swedish.test.c index 6b53841..09d82af 100644 --- a/swedish.test.c +++ b/swedish.test.c @@ -5,6 +5,12 @@ #define ORD F(ORDINAL) +#define ORDS(N, Z, E, FLAGS, ERR)\ + {N, Z, E, (FLAGS) | ORD, ERR},\ + {N, Z, E, (FLAGS) | ORD | F(PLURAL_FORM), ERR},\ + {N, Z, E, (FLAGS) | ORD | F(DEFINITE_FORM), ERR},\ + {N, Z, E, (FLAGS) | ORD | F(PLURAL_FORM) | F(DEFINITE_FORM), ERR} + static struct test { const char *num; size_t zeroes; @@ -18,155 +24,155 @@ static struct test { {"+0", 0, "plus noll", 0, 0}, {"-0", 0, "minus noll", 0, 0}, {UNICODE_MINUS"0", 0, "minus noll", 0, 0}, - {"0", 0, "nollte", ORD, 0}, - {"+0", 0, "plus-nollte", ORD, 0}, - {"-0", 0, "minus-nollte", ORD, 0}, - {UNICODE_MINUS"0", 0, "minus-nollte", ORD, 0}, + ORDS("0", 0, "nollte", 0, 0), + ORDS("+0", 0, "plus-nollte", 0, 0), + ORDS("-0", 0, "minus-nollte", 0, 0), + ORDS(UNICODE_MINUS"0", 0, "minus-nollte", 0, 0), {"1", 0, "ett", 0, 0}, {"+1", 0, "plus ett", 0, 0}, {"-1", 0, "minus ett", 0, 0}, {UNICODE_MINUS"1", 0, "minus ett", 0, 0}, - {"1", 0, "första", ORD, 0}, - {"+1", 0, "plus-första", ORD, 0}, - {"-1", 0, "minus-första", ORD, 0}, - {UNICODE_MINUS"1", 0, "minus-första", ORD, 0}, + ORDS("1", 0, "första", 0, 0), + ORDS("+1", 0, "plus-första", 0, 0), + ORDS("-1", 0, "minus-första", 0, 0), + ORDS(UNICODE_MINUS"1", 0, "minus-första", 0, 0), {"2", 0, "två", 0, 0}, {"+2", 0, "plus två", 0, 0}, {"-2", 0, "minus två", 0, 0}, {UNICODE_MINUS"2", 0, "minus två", 0, 0}, - {"2", 0, "andra", ORD, 0}, - {"+2", 0, "plus-andra", ORD, 0}, - {"-2", 0, "minus-andra", ORD, 0}, - {UNICODE_MINUS"2", 0, "minus-andra", ORD, 0}, + ORDS("2", 0, "andra", 0, 0), + ORDS("+2", 0, "plus-andra", 0, 0), + ORDS("-2", 0, "minus-andra", 0, 0), + ORDS(UNICODE_MINUS"2", 0, "minus-andra", 0, 0), {"3", 0, "tre", 0, 0}, {"+3", 0, "plus tre", 0, 0}, {"-3", 0, "minus tre", 0, 0}, {UNICODE_MINUS"3", 0, "minus tre", 0, 0}, - {"3", 0, "tredje", ORD, 0}, - {"+3", 0, "plus-tredje", ORD, 0}, - {"-3", 0, "minus-tredje", ORD, 0}, - {UNICODE_MINUS"3", 0, "minus-tredje", ORD, 0}, + ORDS("3", 0, "tredje", 0, 0), + ORDS("+3", 0, "plus-tredje", 0, 0), + ORDS("-3", 0, "minus-tredje", 0, 0), + ORDS(UNICODE_MINUS"3", 0, "minus-tredje", 0, 0), {"4", 0, "fyra", 0, 0}, - {"4", 0, "fjärde", ORD, 0}, + ORDS("4", 0, "fjärde", 0, 0), {"5", 0, "fem", 0, 0}, - {"5", 0, "femte", ORD, 0}, + ORDS("5", 0, "femte", 0, 0), {"6", 0, "sex", 0, 0}, - {"6", 0, "sjätte", ORD, 0}, + ORDS("6", 0, "sjätte", 0, 0), {"7", 0, "sju", 0, 0}, - {"7", 0, "sjunde", ORD, 0}, + ORDS("7", 0, "sjunde", 0, 0), {"8", 0, "åtta", 0, 0}, - {"8", 0, "åttonde", ORD, 0}, + ORDS("8", 0, "åttonde", 0, 0), {"9", 0, "nio", 0, 0}, - {"9", 0, "nionde", ORD, 0}, + ORDS("9", 0, "nionde", 0, 0), {"00009", 0, "nio", 0, 0}, {"10", 0, "tio", 0, 0}, - {"10", 0, "tionde", ORD, 0}, + ORDS("10", 0, "tionde", 0, 0), {"11", 0, "elva", 0, 0}, - {"11", 0, "elfte", ORD, 0}, + ORDS("11", 0, "elfte", 0, 0), {"12", 0, "tolv", 0, 0}, - {"12", 0, "tolfte", ORD, 0}, + ORDS("12", 0, "tolfte", 0, 0), {"13", 0, "tretton", 0, 0}, - {"13", 0, "trettonde", ORD, 0}, + ORDS("13", 0, "trettonde", 0, 0), {"14", 0, "fjorton", 0, 0}, - {"14", 0, "fjortonde", ORD, 0}, + ORDS("14", 0, "fjortonde", 0, 0), {"15", 0, "femton", 0, 0}, - {"15", 0, "femtonde", ORD, 0}, + ORDS("15", 0, "femtonde", 0, 0), {"16", 0, "sexton", 0, 0}, - {"16", 0, "sextonde", ORD, 0}, + ORDS("16", 0, "sextonde", 0, 0), {"17", 0, "sjutton", 0, 0}, - {"17", 0, "sjuttonde", ORD, 0}, + ORDS("17", 0, "sjuttonde", 0, 0), {"18", 0, "arton", 0, 0}, - {"18", 0, "artonde", ORD, 0}, + ORDS("18", 0, "artonde", 0, 0), {"19", 0, "nitton", 0, 0}, - {"19", 0, "nittonde", ORD, 0}, + ORDS("19", 0, "nittonde", 0, 0), {"20", 0, "tjugo", 0, 0}, - {"20", 0, "tjugonde", ORD, 0}, + ORDS("20", 0, "tjugonde", 0, 0), {"21", 0, "tjugoett", 0, 0}, - {"21", 0, "tjugoförsta", ORD, 0}, + ORDS("21", 0, "tjugoförsta", 0, 0), {"22", 0, "tjugotvå", 0, 0}, - {"22", 0, "tjugoandra", ORD, 0}, + ORDS("22", 0, "tjugoandra", 0, 0), {"23", 0, "tjugotre", 0, 0}, - {"23", 0, "tjugotredje", ORD, 0}, + ORDS("23", 0, "tjugotredje", 0, 0), {"28", 0, "tjugoåtta", 0, 0}, - {"28", 0, "tjugoåttonde", ORD, 0}, + ORDS("28", 0, "tjugoåttonde", 0, 0), {"29", 0, "tjugonio", 0, 0}, - {"29", 0, "tjugonionde", ORD, 0}, + ORDS("29", 0, "tjugonionde", 0, 0), {"30", 0, "trettio", 0, 0}, - {"30", 0, "trettionde", ORD, 0}, + ORDS("30", 0, "trettionde", 0, 0), {"31", 0, "trettioett", 0, 0}, - {"31", 0, "trettioförsta", ORD, 0}, + ORDS("31", 0, "trettioförsta", 0, 0), {"32", 0, "trettiotvå", 0, 0}, - {"32", 0, "trettioandra", ORD, 0}, + ORDS("32", 0, "trettioandra", 0, 0), {"40", 0, "fyrtio", 0, 0}, - {"40", 0, "fyrtionde", ORD, 0}, + ORDS("40", 0, "fyrtionde", 0, 0), {"43", 0, "fyrtiotre", 0, 0}, - {"43", 0, "fyrtiotredje", ORD, 0}, + ORDS("43", 0, "fyrtiotredje", 0, 0), {"50", 0, "femtio", 0, 0}, - {"50", 0, "femtionde", ORD, 0}, + ORDS("50", 0, "femtionde", 0, 0), {"54", 0, "femtiofyra", 0, 0}, - {"54", 0, "femtiofjärde", ORD, 0}, + ORDS("54", 0, "femtiofjärde", 0, 0), {"60", 0, "sextio", 0, 0}, - {"60", 0, "sextionde", ORD, 0}, + ORDS("60", 0, "sextionde", 0, 0), {"65", 0, "sextiofem", 0, 0}, - {"65", 0, "sextiofemte", ORD, 0}, + ORDS("65", 0, "sextiofemte", 0, 0), {"70", 0, "sjuttio", 0, 0}, - {"70", 0, "sjuttionde", ORD, 0}, + ORDS("70", 0, "sjuttionde", 0, 0), {"76", 0, "sjuttiosex", 0, 0}, - {"76", 0, "sjuttiosjätte", ORD, 0}, + ORDS("76", 0, "sjuttiosjätte", 0, 0), {"80", 0, "åttio", 0, 0}, - {"80", 0, "åttionde", ORD, 0}, + ORDS("80", 0, "åttionde", 0, 0), {"87", 0, "åttiosju", 0, 0}, - {"87", 0, "åttiosjunde", ORD, 0}, + ORDS("87", 0, "åttiosjunde", 0, 0), {"90", 0, "nittio", 0, 0}, - {"90", 0, "nittionde", ORD, 0}, + ORDS("90", 0, "nittionde", 0, 0), {"98", 0, "nittioåtta", 0, 0}, - {"98", 0, "nittioåttonde", ORD, 0}, + ORDS("98", 0, "nittioåttonde", 0, 0), {"99", 0, "nittionio", 0, 0}, - {"99", 0, "nittionionde", ORD, 0}, + ORDS("99", 0, "nittionionde", 0, 0), {"100", 0, "etthundra", 0, 0}, - {"100", 0, "etthundrade", ORD, 0}, + ORDS("100", 0, "etthundrade", 0, 0), {"101", 0, "etthundraett", 0, 0}, - {"101", 0, "etthundraförsta", ORD, 0}, + ORDS("101", 0, "etthundraförsta", 0, 0), {"110", 0, "etthundratio", 0, 0}, - {"110", 0, "etthundrationde", ORD, 0}, + ORDS("110", 0, "etthundrationde", 0, 0), {"111", 0, "etthundraelva", 0, 0}, - {"111", 0, "etthundraelfte", ORD, 0}, + ORDS("111", 0, "etthundraelfte", 0, 0), {"120", 0, "etthundratjugo", 0, 0}, - {"120", 0, "etthundratjugonde", ORD, 0}, + ORDS("120", 0, "etthundratjugonde", 0, 0), {"121", 0, "etthundratjugoett", 0, 0}, - {"121", 0, "etthundratjugoförsta", ORD, 0}, + ORDS("121", 0, "etthundratjugoförsta", 0, 0), {"999", 0, "niohundranittionio", 0, 0}, - {"999", 0, "niohundranittionionde", ORD, 0}, + ORDS("999", 0, "niohundranittionionde", 0, 0), {"1000", 0, "ettusen", 0, 0}, - {"1000", 0, "ettusende", ORD, 0}, + ORDS("1000", 0, "ettusende", 0, 0), {"1001", 0, "ettusenett", 0, 0}, - {"1001", 0, "ettusenförsta", ORD, 0}, + ORDS("1001", 0, "ettusenförsta", 0, 0), {"1002", 0, "ettusentvå", 0, 0}, - {"1002", 0, "ettusenandra", ORD, 0}, + ORDS("1002", 0, "ettusenandra", 0, 0), {"1100", 0, "ettusenetthundra", 0, 0}, - {"1100", 0, "ettusenetthundrade", ORD, 0}, + ORDS("1100", 0, "ettusenetthundrade", 0, 0), {"1101", 0, "ettusenetthundraett", 0, 0}, - {"1101", 0, "ettusenetthundraförsta", ORD, 0}, + ORDS("1101", 0, "ettusenetthundraförsta", 0, 0), {"1123", 0, "ettusenetthundratjugotre", 0, 0}, - {"1123", 0, "ettusenetthundratjugotredje", ORD, 0}, + ORDS("1123", 0, "ettusenetthundratjugotredje", 0, 0), {"2000", 0, "tvåtusen", 0, 0}, - {"2000", 0, "tvåtusende", ORD, 0}, + ORDS("2000", 0, "tvåtusende", 0, 0), {"3000", 0, "tretusen", 0, 0}, - {"3000", 0, "tretusende", ORD, 0}, + ORDS("3000", 0, "tretusende", 0, 0), {"4000", 0, "fyratusen", 0, 0}, - {"4000", 0, "fyratusende", ORD, 0}, + ORDS("4000", 0, "fyratusende", 0, 0), {"5000", 0, "femtusen", 0, 0}, - {"5000", 0, "femtusende", ORD, 0}, + ORDS("5000", 0, "femtusende", 0, 0), {"8000", 0, "åttatusen", 0, 0}, - {"8000", 0, "åttatusende", ORD, 0}, + ORDS("8000", 0, "åttatusende", 0, 0), {"9000", 0, "niotusen", 0, 0}, - {"9000", 0, "niotusende", ORD, 0}, + ORDS("9000", 0, "niotusende", 0, 0), {"10000", 0, "tiotusen", 0, 0}, - {"10000", 0, "tiotusende", ORD, 0}, + ORDS("10000", 0, "tiotusende", 0, 0), {"11000", 0, "elvatusen", 0, 0}, - {"11000", 0, "elvatusende", ORD, 0}, + ORDS("11000", 0, "elvatusende", 0, 0), {"20000", 0, "tjugotusen", 0, 0}, - {"20000", 0, "tjugotusende", ORD, 0}, + ORDS("20000", 0, "tjugotusende", 0, 0), {"21000", 0, "tjugoettusen", 0, 0}, /* "tjugoentusen" is actually incorrect (it's colloquial) */ {"30000", 0, "trettiotusen", 0, 0}, {"31000", 0, "trettioettusen", 0, 0}, @@ -213,51 +219,51 @@ static struct test { {"300000", 0, "trehundratusen", 0, 0}, {"300000", 0, "trehundratusende", ORD, 0}, {"1""000000", 0, "enmiljon", 0, 0}, - {"1""000000", 0, "enmiljonte", ORD, 0}, + ORDS("1""000000", 0, "enmiljonte", 0, 0), {"1""200000", 0, "enmiljontvåhundratusen", 0, 0}, - {"1""200000", 0, "enmiljontvåhundratusende", ORD, 0}, + ORDS("1""200000", 0, "enmiljontvåhundratusende", 0, 0), {"2""000000", 0, "tvåmiljoner", 0, 0}, - {"2""000000", 0, "tvåmiljonte", ORD, 0}, + ORDS("2""000000", 0, "tvåmiljonte", 0, 0), {"3""000000", 0, "tremiljoner", 0, 0}, {"5""000000", 0, "femmiljoner", 0, 0}, - {"5""000000", 0, "femmiljonte", ORD, 0}, + ORDS("5""000000", 0, "femmiljonte", 0, 0), {"5""010000", 0, "femmiljonertiotusen", 0, 0}, - {"5""010000", 0, "femmiljonertiotusende", ORD, 0}, + ORDS("5""010000", 0, "femmiljonertiotusende", 0, 0), {"5""010100", 0, "femmiljonertiotusenetthundra", 0, 0}, - {"5""010100", 0, "femmiljonertiotusenetthundrade", ORD, 0}, + ORDS("5""010100", 0, "femmiljonertiotusenetthundrade", 0, 0), {"5""010111", 0, "femmiljonertiotusenetthundraelva", 0, 0}, - {"5""010111", 0, "femmiljonertiotusenetthundraelfte", ORD, 0}, + ORDS("5""010111", 0, "femmiljonertiotusenetthundraelfte", 0, 0), {"9""999999", 0, "niomiljonerniohundranittioniotusenniohundranittionio", 0, 0}, - {"9""999999", 0, "niomiljonerniohundranittioniotusenniohundranittionionde", ORD, 0}, + ORDS("9""999999", 0, "niomiljonerniohundranittioniotusenniohundranittionionde", 0, 0), {"10""000000", 0, "tiomiljoner", 0, 0}, - {"10""000000", 0, "tiomiljonte", ORD, 0}, + ORDS("10""000000", 0, "tiomiljonte", 0, 0), {"11""000000", 0, "elvamiljoner", 0, 0}, - {"11""000000", 0, "elvamiljonte", ORD, 0}, + ORDS("11""000000", 0, "elvamiljonte", 0, 0), {"20""000000", 0, "tjugomiljoner", 0, 0}, - {"20""000000", 0, "tjugomiljonte", ORD, 0}, + ORDS("20""000000", 0, "tjugomiljonte", 0, 0), {"100""000000", 0, "etthundramiljoner", 0, 0}, - {"100""000000", 0, "etthundramiljonte", ORD, 0}, + ORDS("100""000000", 0, "etthundramiljonte", 0, 0), {"101""000000", 0, "etthundraenmiljoner", 0, 0}, {"102""000000", 0, "etthundratvåmiljoner", 0, 0}, {"112""000000", 0, "etthundratolvmiljoner", 0, 0}, {"160""000000", 0, "etthundrasextiomiljoner", 0, 0}, {"169""000000", 0, "etthundrasextioniomiljoner", 0, 0}, - {"169""000000", 0, "etthundrasextioniomiljonte", ORD, 0}, + ORDS("169""000000", 0, "etthundrasextioniomiljonte", 0, 0), {"200""000000", 0, "tvåhundramiljoner", 0, 0}, - {"200""000000", 0, "tvåhundramiljonte", ORD, 0}, + ORDS("200""000000", 0, "tvåhundramiljonte", 0, 0), {"1000""000000", 0, "enmiljard", 0, 0}, - {"1000""000000", 0, "enmiljarde", ORD, 0}, + ORDS("1000""000000", 0, "enmiljarde", 0, 0), {"2000""000000", 0, "tvåmiljarder", 0, 0}, - {"2000""000000", 0, "tvåmiljarde", ORD, 0}, + ORDS("2000""000000", 0, "tvåmiljarde", 0, 0), {"20000""000000", 0, "tjugomiljarder", 0, 0}, {"21000""000000", 0, "tjugoenmiljarder", 0, 0}, {"100000""000000", 0, "etthundramiljarder", 0, 0}, {"101000""000000", 0, "etthundraenmiljarder", 0, 0}, - {"101000""000000", 0, "etthundraenmiljarde", ORD, 0}, + ORDS("101000""000000", 0, "etthundraenmiljarde", 0, 0), {"101001""000000", 0, "etthundraenmiljarderenmiljon", 0, 0}, - {"101001""000000", 0, "etthundraenmiljarderenmiljonte", ORD, 0}, + ORDS("101001""000000", 0, "etthundraenmiljarderenmiljonte", 0, 0), {"101100""000000", 0, "etthundraenmiljarderetthundramiljoner", 0, 0}, - {"101100""000000", 0, "etthundraenmiljarderetthundramiljonte", ORD, 0}, + ORDS("101100""000000", 0, "etthundraenmiljarderetthundramiljonte", 0, 0), {"1""000000""000000", 0, "enbiljon", 0, 0}, {"1""000000""000000", 0, "enbiljonte", ORD, 0}, {"1""001000""000000", 0, "enbiljonenmiljard", 0, 0}, @@ -273,14 +279,14 @@ static struct test { {"1000""000000""000000", 0, "enbiljard", 0, 0}, {"1000""000000""000000", 0, "enbiljarde", ORD, 0}, {"1", 3 * 6, "entriljon", 0, 0}, - {"1", 3 * 6, "entriljonte", ORD, 0}, + ORDS("1", 3 * 6, "entriljonte", 0, 0), {"1000", 3 * 6, "entriljard", 0, 0}, {"1", 4 * 6, "enkvadriljon", 0, 0}, {"1", 5 * 6, "enkvintiljon", 0, 0}, {"1", 6 * 6, "ensextiljon", 0, 0}, {"1", 7 * 6, "enseptiljon", 0, 0}, {"1", 8 * 6, "enoktiljon", 0, 0}, - {"1", 8 * 6, "enoktiljonte", ORD, 0}, + ORDS("1", 8 * 6, "enoktiljonte", 0, 0), {"1", 9 * 6, "ennoniljon", 0, 0}, {"1", 10 * 6, "endeciljon", 0, 0}, {"1", 11 * 6, "enundeciljon", 0, 0}, @@ -475,9 +481,9 @@ static struct test { {"1", 909 * 6, "ennovenongentiljon", 0, 0}, {"1", 990 * 6, "ennonagintanongentiljon", 0, 0}, {"1", 999 * 6, "ennovenonagintanongentiljon", 0, 0}, - {"1", 999 * 6, "ennovenonagintanongentiljonte", ORD, 0}, + ORDS("1", 999 * 6, "ennovenonagintanongentiljonte", 0, 0), {"1000", 999 * 6, "ennovenonagintanongentiljard", 0, 0}, - {"1000", 999 * 6, "ennovenonagintanongentiljarde", ORD, 0}, + ORDS("1000", 999 * 6, "ennovenonagintanongentiljarde", 0, 0), {"0", 0, "noll", F(IMPLICIT_ONE), 0}, {"0", 0, "nollte", F(IMPLICIT_ONE) | ORD, 0}, {"1", 0, "ett", F(IMPLICIT_ONE), 0}, @@ -745,8 +751,8 @@ main(void) /* TODO test for separator removal */ /* TODO test LIBNUMTEXT_N2T_SWEDISH_DENOMINATOR */ - /* TODO test LIBNUMTEXT_N2T_SWEDISH_PLURAL_FORM */ - /* TODO test LIBNUMTEXT_N2T_SWEDISH_DEFINITE_FORM */ + /* TODO test …DENOMINATOR with LIBNUMTEXT_N2T_SWEDISH_PLURAL_FORM */ + /* TODO test …DENOMINATOR with LIBNUMTEXT_N2T_SWEDISH_DEFINITE_FORM */ if (failures > 0) { fprintf(stderr, "Failure count: %zu\n", failures); -- cgit v1.2.3-70-g09d2