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=" "),
],
)
|