File: test_language.py

package info (click to toggle)
python-iso639 2025.2.18-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 560 kB
  • sloc: python: 456; makefile: 3
file content (137 lines) | stat: -rw-r--r-- 4,217 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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import datetime

from iso639 import Language, ALL_LANGUAGES, DATA_LAST_UPDATED, LanguageNotFoundError
from iso639.language import Name

import pytest


@pytest.mark.parametrize(
    "user_input, exact, expected_part3",
    [
        ("fra", True, "fra"),
        ("fra", False, "fra"),
        ("FRA", True, None),
        ("FRA", False, "fra"),
        (" FRA  ", False, "fra"),
        ("Fra", True, None),
        ("Fra", False, "fra"),
        (" Fra  ", False, "fra"),
        ("French", True, "fra"),
        ("French", False, "fra"),
        ("FRENCH", True, None),
        ("FRENCH", False, "fra"),
        (" FRENCH  ", False, "fra"),
        ("french", True, None),
        ("french", False, "fra"),
        (" french  ", False, "fra"),
        ("Castilian", True, "spa"),
    ],
)
def test_match(user_input, exact, expected_part3):
    if expected_part3 is None:
        with pytest.raises(LanguageNotFoundError):
            Language.match(user_input, exact=exact)
    else:
        actual_part3 = Language.match(user_input, exact=exact).part3
        assert actual_part3 == expected_part3


def test_name():
    name = Name("foo", "bar")
    assert name.print == "foo"
    assert name.inverted == "bar"


def test_attributes_cantonese():
    language = Language.match("yue")
    assert language.part3 == "yue"
    assert language.part2b is None
    assert language.part2t is None
    assert language.part1 is None
    assert language.scope == "I"
    assert language.type == "L"
    assert language.status == "A"
    assert language.name == "Yue Chinese"
    assert language.comment is None
    assert language.other_names == [Name("Yue Chinese", "Chinese, Yue")]
    assert language.macrolanguage == "zho"
    assert language.retire_reason is None
    assert language.retire_change_to is None
    assert language.retire_remedy is None
    assert language.retire_date is None


def test_attributes_french():
    language = Language.match("fra")
    assert language.part3 == "fra"
    assert language.part2b == "fre"
    assert language.part2t == "fra"
    assert language.part1 == "fr"
    assert language.scope == "I"
    assert language.type == "L"
    assert language.status == "A"
    assert language.name == "French"
    assert language.comment is None
    assert language.other_names is None
    assert language.macrolanguage is None
    assert language.retire_reason is None
    assert language.retire_change_to is None
    assert language.retire_remedy is None
    assert language.retire_date is None


def test_retired_codes():
    lang1 = Language.match("bvs")
    lang2 = Language.from_part3("bvs")
    assert lang1 == lang2
    assert lang1.name == "Belgian Sign Language"
    assert lang1.status == "R"
    assert lang1.retire_reason == "S"
    assert lang1.retire_date == datetime.date(2007, 7, 18)
    assert lang1.retire_remedy == (
        "Split into Langue des signes de Belgique Francophone [sfb], "
        "and Vlaamse Gebarentaal [vgt]"
    )


def test_invalid_inputs():
    with pytest.raises(LanguageNotFoundError):
        Language.match("invalid input")
    with pytest.raises(LanguageNotFoundError):
        Language.from_part3("Fra")  # case-sensitive!
    with pytest.raises(LanguageNotFoundError):
        Language.from_part3("unknown code")


def test_data_last_updated():
    assert DATA_LAST_UPDATED == datetime.date(2025, 1, 15), "Need to update README.md"


def test_all_languages():
    assert type(ALL_LANGUAGES) is set
    assert len(ALL_LANGUAGES) == 8307, "Need to update README.md"
    lang = list(ALL_LANGUAGES)[0]
    assert type(lang) is Language


def test_eq():
    yue1 = Language.match("yue")
    yue2 = Language.match("yue")
    fra = Language.match("fra")

    assert yue1.part3 == yue2.part3 == "yue"
    assert fra.part3 == "fra"
    assert yue1 == yue2
    assert yue1 != fra


def test_hashable():
    """Language class instances are hashable, e.g., can be in a set.
    See https://github.com/jacksonllee/iso639/issues/3
    """
    cat = Language.match("cat")
    assert cat.part3 == "cat"
    assert type(cat.other_names) is list  # Need a list attr for the hashing test...
    hash(cat)  # Shouldn't error!
    assert len({cat, cat, cat}) == 1