File: test_engine.py

package info (click to toggle)
unicode-rbnf 2.4.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,600 kB
  • sloc: xml: 17,487; python: 1,001; makefile: 2
file content (102 lines) | stat: -rw-r--r-- 2,840 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import pytest

from unicode_rbnf.engine import (
    FormatResult,
    NoRuleForNumberError,
    RbnfEngine,
    RbnfRule,
    SubRulePart,
    SubType,
    TextRulePart,
)


def test_parse_text():
    assert RbnfRule.parse(1, "one;") == RbnfRule(1, parts=[TextRulePart("one")])


def test_parse_sub():
    assert RbnfRule.parse(100, "←← hundred[ →→];") == RbnfRule(
        100,
        parts=[
            SubRulePart(SubType.QUOTIENT),
            TextRulePart(" hundred"),
            SubRulePart(SubType.REMAINDER, is_optional=True, text_before=" "),
        ],
    )


def test_parse_ruleset_name():
    assert RbnfRule.parse(
        100, "←%spellout-cardinal-masculine←­hundert[­→→];"
    ) == RbnfRule(
        100,
        parts=[
            SubRulePart(SubType.QUOTIENT, ruleset_name="spellout-cardinal-masculine"),
            TextRulePart("­hundert"),
            SubRulePart(SubType.REMAINDER, is_optional=True, text_before="­"),
        ],
    )


def test_find_rule():
    engine = RbnfEngine("en")
    engine.add_rule(2, "two;", "spellout-numbering")
    engine.add_rule(20, "twenty[-→→];", "spellout-numbering")
    engine.add_rule(100, "←← hundred[ →→];", "spellout-numbering")

    ruleset = engine.rulesets["spellout-numbering"]

    rule_2 = ruleset.find_rule(2)
    assert rule_2 is not None
    assert rule_2.value == 2

    rule_20 = ruleset.find_rule(25)
    assert rule_20 is not None
    assert rule_20.value == 20

    rule_100 = ruleset.find_rule(222)
    assert rule_100 is not None
    assert rule_100.value == 100


def test_format_number():
    engine = RbnfEngine("en")
    engine.add_rule(2, "two;", "spellout-cardinal")
    engine.add_rule(20, "twenty[-→→];", "spellout-cardinal")
    engine.add_rule(100, "←← hundred[ →→];", "spellout-cardinal")

    assert engine.format_number(222) == FormatResult(
        text="two hundred twenty-two",
        text_ruleset="spellout-cardinal",
        text_by_ruleset={"spellout-cardinal": "two hundred twenty-two"},
    )


def test_zero_rules():
    engine = RbnfEngine("en")
    engine.add_rule(0, "abc=%ruleset_2=def;", "ruleset_1")
    engine.add_rule(0, " efg=%ruleset_3= hij;", "ruleset_2")
    engine.add_rule(1, "one;", "ruleset_3")

    assert (
        engine.format_number(1, ruleset_names=["ruleset_1"]).text == "abc efgone hijdef"
    )


def test_no_rules_for_number():
    engine = RbnfEngine("en")

    with pytest.raises(NoRuleForNumberError):
        engine.format_number(1, ruleset_names=["does_not_exist"])


def test_parse_remainder_whitespace():
    assert RbnfRule.parse(12.34, "←← x →→→;") == RbnfRule(
        12,
        parts=[
            SubRulePart(SubType.QUOTIENT),
            TextRulePart(" x"),
            SubRulePart(SubType.REMAINDER, text_before=" "),
        ],
    )