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="'" 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