2017-08-02 06:16:34 -04:00
|
|
|
|
#!/usr/bin/python3
|
|
|
|
|
|
|
|
|
|
import json
|
|
|
|
|
import tempfile
|
|
|
|
|
import unittest
|
|
|
|
|
import xml.etree.ElementTree
|
|
|
|
|
|
|
|
|
|
import cldr2json
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestParseSingleKey(unittest.TestCase):
|
|
|
|
|
def test_ascii(self):
|
|
|
|
|
self.assertEqual(cldr2json.parse_single_key("a"), "a")
|
|
|
|
|
|
|
|
|
|
def test_nonascii(self):
|
|
|
|
|
self.assertEqual(cldr2json.parse_single_key("Æ"), "Æ")
|
|
|
|
|
|
|
|
|
|
def test_twochars(self):
|
|
|
|
|
self.assertEqual(cldr2json.parse_single_key("ԵՒ"), "ԵՒ")
|
|
|
|
|
|
|
|
|
|
def test_decode(self):
|
|
|
|
|
self.assertEqual(cldr2json.parse_single_key("\\u{200D}"), "\u200d")
|
|
|
|
|
|
|
|
|
|
def test_decode_threechars(self):
|
|
|
|
|
self.assertEqual(cldr2json.parse_single_key("ज\\u{94D}ञ"), "ज\u094Dञ")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestParseRow(unittest.TestCase):
|
|
|
|
|
def test_parse_row(self):
|
|
|
|
|
xml_string = """
|
|
|
|
|
<keyMap>
|
|
|
|
|
<map iso="D01" to="a" longPress="à â % æ á ä ã å ā ª"/> <!-- Q -->
|
|
|
|
|
<map iso="D02" to="z"/> <!-- W -->
|
|
|
|
|
<map iso="D03" to="e" longPress="é è ê ë % ę ė ē"/>
|
|
|
|
|
<map iso="D04" to="r"/>
|
|
|
|
|
<map iso="D05" to="t"/>
|
|
|
|
|
<map iso="D06" to="y" longPress="% ÿ"/>
|
|
|
|
|
<map iso="D07" to="u" longPress="ù û % ü ú ū"/>
|
|
|
|
|
<map iso="D08" to="i" longPress="î % ï ì í į ī"/>
|
|
|
|
|
<map iso="D09" to="o" longPress="ô œ % ö ò ó õ ø ō º"/>
|
|
|
|
|
<map iso="D10" to="p"/>
|
|
|
|
|
<map iso="C01" to="q"/> <!-- A -->
|
|
|
|
|
<map iso="C02" to="s"/>
|
|
|
|
|
<map iso="C03" to="d"/>
|
|
|
|
|
<map iso="C04" to="f"/>
|
|
|
|
|
<map iso="C05" to="g"/>
|
|
|
|
|
<map iso="C06" to="h"/>
|
|
|
|
|
<map iso="C07" to="j"/>
|
|
|
|
|
<map iso="C08" to="k"/>
|
|
|
|
|
<map iso="C09" to="l"/>
|
|
|
|
|
<map iso="C10" to="m"/> <!-- ; -->
|
|
|
|
|
<map iso="B01" to="w"/> <!-- Z -->
|
|
|
|
|
<map iso="B02" to="x"/>
|
|
|
|
|
<map iso="B03" to="c" longPress="ç ć č"/>
|
|
|
|
|
<map iso="B04" to="v"/>
|
|
|
|
|
<map iso="B05" to="b"/>
|
|
|
|
|
<map iso="B06" to="n"/>
|
|
|
|
|
<map iso="B07" to="'" longPress="‘ ’ ‹ ›"/> <!-- M -->
|
|
|
|
|
<map iso="A02" to=","/> <!-- (key to left of space) -->
|
|
|
|
|
<map iso="A03" to=" "/> <!-- space -->
|
|
|
|
|
<map iso="A04" to="." longPress="# ! , ? - : ' @"/> <!-- (key to right of space) -->
|
|
|
|
|
</keyMap>
|
|
|
|
|
"""
|
|
|
|
|
xml_tree = xml.etree.ElementTree.XML(xml_string)
|
|
|
|
|
json = [[
|
|
|
|
|
['a', 'à', 'â', '%', 'æ', 'á', 'ä', 'ã', 'å', 'ā', 'ª'],
|
|
|
|
|
['z'],
|
|
|
|
|
['e', 'é', 'è', 'ê', 'ë', '%', 'ę', 'ė', 'ē'],
|
|
|
|
|
['r'],
|
|
|
|
|
['t'],
|
|
|
|
|
['y', '%', 'ÿ'],
|
|
|
|
|
['u', 'ù', 'û', '%', 'ü', 'ú', 'ū'],
|
|
|
|
|
['i', 'î', '%', 'ï', 'ì', 'í', 'į', 'ī'],
|
|
|
|
|
['o', 'ô', 'œ', '%', 'ö', 'ò', 'ó', 'õ', 'ø', 'ō', 'º'],
|
|
|
|
|
['p']
|
|
|
|
|
], [
|
|
|
|
|
['q'],
|
|
|
|
|
['s'],
|
|
|
|
|
['d'],
|
|
|
|
|
['f'],
|
|
|
|
|
['g'],
|
|
|
|
|
['h'],
|
|
|
|
|
['j'],
|
|
|
|
|
['k'],
|
|
|
|
|
['l'],
|
|
|
|
|
['m']
|
|
|
|
|
], [
|
|
|
|
|
['w'],
|
|
|
|
|
['x'],
|
|
|
|
|
['c', 'ç', 'ć', 'č'],
|
|
|
|
|
['v'],
|
|
|
|
|
['b'],
|
|
|
|
|
['n'],
|
|
|
|
|
["'", '‘', '’', '‹', '›']
|
|
|
|
|
], [
|
|
|
|
|
[','],
|
|
|
|
|
[' '],
|
|
|
|
|
['.', '#', '!', ',', '?', '-', ':', "'", '@']
|
|
|
|
|
]]
|
|
|
|
|
self.assertEqual(cldr2json.parse_rows(xml_tree), json)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestConvertXml(unittest.TestCase):
|
2017-08-02 11:26:50 -04:00
|
|
|
|
def test_convert_xml(self):
|
|
|
|
|
xml_string = """<?xml version="1.0" encoding="UTF-8" ?>
|
|
|
|
|
<!DOCTYPE keyboard SYSTEM "../dtd/ldmlKeyboard.dtd">
|
|
|
|
|
<keyboard locale="fr-t-k0-android">
|
|
|
|
|
<version platform="4.4" number="$Revision: 11914 $"/>
|
|
|
|
|
<names>
|
|
|
|
|
<name value="French"/>
|
|
|
|
|
</names>
|
|
|
|
|
<keyMap>
|
|
|
|
|
<map iso="D01" to="a" longPress="à â % æ á ä ã å ā ª"/> <!-- Q -->
|
|
|
|
|
</keyMap>
|
|
|
|
|
<keyMap modifiers="shift caps">
|
|
|
|
|
<map iso="D01" to="A" longPress="À Â % Æ Á Ä Ã Å Ā ª"/> <!-- Q -->
|
|
|
|
|
</keyMap>
|
|
|
|
|
<keyMap modifiers="opt">
|
|
|
|
|
<map iso="D01" to="1" longPress="¹ ½ ⅓ ¼ ⅛"/> <!-- Q base=a -->
|
|
|
|
|
</keyMap>
|
|
|
|
|
<keyMap modifiers="opt+shift">
|
|
|
|
|
<map iso="D01" to="~"/> <!-- Q base=a -->
|
|
|
|
|
</keyMap>
|
|
|
|
|
</keyboard>
|
|
|
|
|
"""
|
|
|
|
|
xml_tree = xml.etree.ElementTree.XML(xml_string)
|
|
|
|
|
json = {
|
|
|
|
|
"locale": "fr",
|
|
|
|
|
"name": "French",
|
|
|
|
|
"levels": [
|
|
|
|
|
{
|
|
|
|
|
"level": "",
|
|
|
|
|
"mode": "default",
|
|
|
|
|
"rows": [
|
|
|
|
|
[
|
|
|
|
|
['a', 'à', 'â', '%', 'æ', 'á', 'ä', 'ã', 'å', 'ā', 'ª'],
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"level": "shift",
|
|
|
|
|
"mode": "latched",
|
|
|
|
|
"rows": [
|
|
|
|
|
[
|
|
|
|
|
['A', 'À', 'Â', '%', 'Æ', 'Á', 'Ä', 'Ã', 'Å', 'Ā', 'ª'],
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"level": "opt",
|
|
|
|
|
"mode": "locked",
|
|
|
|
|
"rows": [
|
|
|
|
|
[
|
|
|
|
|
["1", "¹", "½", "⅓", "¼", "⅛"],
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"level": "opt+shift",
|
|
|
|
|
"mode": "locked",
|
|
|
|
|
"rows": [
|
|
|
|
|
[
|
|
|
|
|
["~"],
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
self.assertEqual(cldr2json.convert_xml(xml_tree), json)
|
2017-08-02 06:16:34 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestConvertFile(unittest.TestCase):
|
|
|
|
|
def test_fr(self):
|
|
|
|
|
outdir = tempfile.mkdtemp()
|
|
|
|
|
cldr2json.convert_file("test/data/fr-t-k0-android.xml", outdir)
|
|
|
|
|
with open("test/data/fr.json", encoding="utf-8") as expected_json_fd:
|
|
|
|
|
expected_json = json.load(expected_json_fd)
|
|
|
|
|
with open(outdir + "/fr.json", encoding="utf-8") as actual_json_fd:
|
|
|
|
|
actual_json = json.load(actual_json_fd)
|
|
|
|
|
self.assertEqual(expected_json, actual_json)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestLocaleToXKB(unittest.TestCase):
|
|
|
|
|
def test_simple(self):
|
|
|
|
|
self.assertEqual(cldr2json.locale_to_xkb("fr", "French"),
|
|
|
|
|
"fr")
|
|
|
|
|
|
|
|
|
|
def test_fallback(self):
|
|
|
|
|
self.assertEqual(cldr2json.locale_to_xkb("nb", "Norwegian Bokmål"),
|
|
|
|
|
"no")
|
|
|
|
|
|
|
|
|
|
def test_fallback2(self):
|
|
|
|
|
self.assertEqual(cldr2json.locale_to_xkb("km", "Khmer"),
|
|
|
|
|
"kh")
|
|
|
|
|
|
|
|
|
|
def test_override(self):
|
|
|
|
|
self.assertEqual(cldr2json.locale_to_xkb("en-GB",
|
|
|
|
|
"English Great Britain"),
|
|
|
|
|
"uk")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class LoadXKBMapplings(unittest.TestCase):
|
|
|
|
|
def test_dictionnary(self):
|
|
|
|
|
self.assertIsInstance(cldr2json.load_xkb_mappings(), dict)
|
|
|
|
|
|
|
|
|
|
def test_mapping(self):
|
|
|
|
|
mapping = cldr2json.load_xkb_mappings()
|
|
|
|
|
self.assertEqual(mapping["French"], "fr")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
unittest.main()
|