summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2021-09-06 18:04:23 +0200
committerMattias Andrée <maandree@kth.se>2021-09-06 18:04:23 +0200
commitec1c381e041f5bbd31d01418b4e9280eaca11877 (patch)
tree151a940512f9e5e0abae8f7a1ed0d0722b28198d
parentcheck invalid cases (diff)
downloadlibnumtext-ec1c381e041f5bbd31d01418b4e9280eaca11877.tar.gz
libnumtext-ec1c381e041f5bbd31d01418b4e9280eaca11877.tar.bz2
libnumtext-ec1c381e041f5bbd31d01418b4e9280eaca11877.tar.xz
Test and fix support for plural/definite form for ordinals
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to '')
-rw-r--r--swedish.c2
-rw-r--r--swedish.test.c208
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);