1#!/usr/bin/python3
2
3import json
4import tempfile
5import unittest
6import xml.etree.ElementTree
7
8import cldr2json
9
10
11class TestParseSingleKey(unittest.TestCase):
12    def test_ascii(self):
13        self.assertEqual(cldr2json.parse_single_key("a"), "a")
14
15    def test_nonascii(self):
16        self.assertEqual(cldr2json.parse_single_key("Æ"), "Æ")
17
18    def test_twochars(self):
19        self.assertEqual(cldr2json.parse_single_key("ԵՒ"), "ԵՒ")
20
21    def test_decode(self):
22        self.assertEqual(cldr2json.parse_single_key("\\u{200D}"), "\u200d")
23
24    def test_decode_threechars(self):
25        self.assertEqual(cldr2json.parse_single_key("ज\\u{94D}ञ"), "ज\u094Dञ")
26
27
28class TestParseRow(unittest.TestCase):
29    def test_parse_row(self):
30        xml_string = """
31        <keyMap>
32            <map iso="D01" to="a" longPress="à â % æ á ä ã å ā ª"/> <!-- Q -->
33            <map iso="D02" to="z"/> <!-- W -->
34            <map iso="D03" to="e" longPress="é è ê ë % ę ė ē"/>
35            <map iso="D04" to="r"/>
36            <map iso="D05" to="t"/>
37            <map iso="D06" to="y" longPress="% ÿ"/>
38            <map iso="D07" to="u" longPress="ù û % ü ú ū"/>
39            <map iso="D08" to="i" longPress="î % ï ì í į ī"/>
40            <map iso="D09" to="o" longPress="ô œ % ö ò ó õ ø ō º"/>
41            <map iso="D10" to="p"/>
42            <map iso="C01" to="q"/> <!-- A -->
43            <map iso="C02" to="s"/>
44            <map iso="C03" to="d"/>
45            <map iso="C04" to="f"/>
46            <map iso="C05" to="g"/>
47            <map iso="C06" to="h"/>
48            <map iso="C07" to="j"/>
49            <map iso="C08" to="k"/>
50            <map iso="C09" to="l"/>
51            <map iso="C10" to="m"/> <!-- ; -->
52            <map iso="B01" to="w"/> <!-- Z -->
53            <map iso="B02" to="x"/>
54            <map iso="B03" to="c" longPress="ç ć č"/>
55            <map iso="B04" to="v"/>
56            <map iso="B05" to="b"/>
57            <map iso="B06" to="n"/>
58            <map iso="B07" to="&apos;" longPress="‘ ’ ‹ ›"/> <!-- M -->
59            <map iso="A02" to=","/> <!-- (key to left of space) -->
60            <map iso="A03" to=" "/> <!-- space -->
61            <map iso="A04" to="." longPress="# ! , ? - : ' @"/> <!-- (key to right of space) -->
62        </keyMap>
63        """
64        xml_tree = xml.etree.ElementTree.XML(xml_string)
65        json = [[
66                 ['a', 'à', 'â', '%', 'æ', 'á', 'ä', 'ã', 'å', 'ā', 'ª'],
67                 ['z'],
68                 ['e', 'é', 'è', 'ê', 'ë', '%', 'ę', 'ė', 'ē'],
69                 ['r'],
70                 ['t'],
71                 ['y', '%', 'ÿ'],
72                 ['u', 'ù', 'û', '%', 'ü', 'ú', 'ū'],
73                 ['i', 'î', '%', 'ï', 'ì', 'í', 'į', 'ī'],
74                 ['o', 'ô', 'œ', '%', 'ö', 'ò', 'ó', 'õ', 'ø', 'ō', 'º'],
75                 ['p']
76                ], [
77                 ['q'],
78                 ['s'],
79                 ['d'],
80                 ['f'],
81                 ['g'],
82                 ['h'],
83                 ['j'],
84                 ['k'],
85                 ['l'],
86                 ['m']
87                ], [
88                 ['w'],
89                 ['x'],
90                 ['c', 'ç', 'ć', 'č'],
91                 ['v'],
92                 ['b'],
93                 ['n'],
94                 ["'", '‘', '’', '‹', '›']
95                ], [
96                 [','],
97                 [' '],
98                 ['.', '#', '!', ',', '?', '-', ':', "'", '@']
99                ]]
100        self.assertEqual(cldr2json.parse_rows(xml_tree), json)
101
102
103class TestConvertXml(unittest.TestCase):
104    def test_convert_xml(self):
105        xml_string = """<?xml version="1.0" encoding="UTF-8" ?>
106        <!DOCTYPE keyboard SYSTEM "../dtd/ldmlKeyboard.dtd">
107        <keyboard locale="fr-t-k0-android">
108            <version platform="4.4" number="$Revision: 11914 $"/>
109            <names>
110                <name value="French"/>
111            </names>
112            <keyMap>
113                <map iso="D01" to="a" longPress="à â % æ á ä ã å ā ª"/> <!-- Q -->
114            </keyMap>
115            <keyMap modifiers="shift caps">
116                <map iso="D01" to="A" longPress="À Â % Æ Á Ä Ã Å Ā ª"/> <!-- Q -->
117            </keyMap>
118            <keyMap modifiers="opt">
119                <map iso="D01" to="1" longPress="¹ ½ ⅓ ¼ ⅛"/> <!-- Q  base=a -->
120            </keyMap>
121            <keyMap modifiers="opt+shift">
122                <map iso="D01" to="~"/> <!-- Q  base=a -->
123            </keyMap>
124        </keyboard>
125        """
126        xml_tree = xml.etree.ElementTree.XML(xml_string)
127        json = {
128          "locale": "fr",
129          "name": "French",
130          "levels": [
131            {
132              "level": "",
133              "mode": "default",
134              "rows": [
135                [
136                  ['a', 'à', 'â', '%', 'æ', 'á', 'ä', 'ã', 'å', 'ā', 'ª'],
137                ]
138              ]
139            },
140            {
141              "level": "shift",
142              "mode": "latched",
143              "rows": [
144                [
145                  ['A', 'À', 'Â', '%', 'Æ', 'Á', 'Ä', 'Ã', 'Å', 'Ā', 'ª'],
146                ]
147              ]
148            },
149            {
150              "level": "opt",
151              "mode": "locked",
152              "rows": [
153                [
154                  ["1", "¹", "½", "⅓", "¼", "⅛"],
155                ]
156              ]
157            },
158            {
159              "level": "opt+shift",
160              "mode": "locked",
161              "rows": [
162                [
163                  ["~"],
164                ]
165              ]
166            }
167          ]
168        }
169        self.assertEqual(cldr2json.convert_xml(xml_tree), json)
170
171
172class TestConvertFile(unittest.TestCase):
173    def test_fr(self):
174        outdir = tempfile.mkdtemp()
175        cldr2json.convert_file("test/data/fr-t-k0-android.xml", outdir)
176        with open("test/data/fr.json", encoding="utf-8") as expected_json_fd:
177            expected_json = json.load(expected_json_fd)
178        with open(outdir + "/fr.json", encoding="utf-8") as actual_json_fd:
179            actual_json = json.load(actual_json_fd)
180        self.assertEqual(expected_json, actual_json)
181
182
183class TestLocaleToXKB(unittest.TestCase):
184    def test_simple(self):
185        self.assertEqual(cldr2json.locale_to_xkb("fr", "French"),
186                         "fr")
187
188    def test_fallback(self):
189        self.assertEqual(cldr2json.locale_to_xkb("nb", "Norwegian Bokmål"),
190                         "no")
191
192    def test_fallback2(self):
193        self.assertEqual(cldr2json.locale_to_xkb("km", "Khmer"),
194                         "kh")
195
196    def test_override(self):
197        self.assertEqual(cldr2json.locale_to_xkb("en-GB",
198                                                 "English Great Britain"),
199                         "uk")
200
201
202class LoadXKBMapplings(unittest.TestCase):
203    def test_dictionnary(self):
204        self.assertIsInstance(cldr2json.load_xkb_mappings(), dict)
205
206    def test_mapping(self):
207        mapping = cldr2json.load_xkb_mappings()
208        self.assertEqual(mapping["French"], "fr")
209
210
211if __name__ == '__main__':
212    unittest.main()
213