Use installer keyboard choices and keep typing selections accurate

This commit is contained in:
David Heinemeier Hansson committed 2026-10-09 16:45:46 +02:00
1 parent 9421e961ea
commit e210b47e33
7 files changed
+94 -43

No files matched your search

+30 -13
View File
@@ -23,9 +23,22 @@ class TypingSetupTest(unittest.TestCase):
with self.assertRaises(ValueError):
typing.keyboard_values([])
def test_keyboard_catalog_includes_variants(self):
with patch.object(typing, "controller", return_value=[["us", "English (US)", ["en"], [["intl", "English (US, international)", ["en"]]]]]):
self.assertEqual(typing.keyboard_catalog(), {"us": "English (US)", "us:intl": "English (US, international)"})
def test_keyboard_catalog_uses_installer_choices(self):
catalog = typing.keyboard_catalog()
self.assertEqual(catalog["us"], "English (US)")
self.assertEqual(catalog["gb"], "English (UK)")
self.assertEqual(catalog["us:colemak"], "English (US, Colemak)")
self.assertEqual(catalog["ch"], "German (Switzerland)")
self.assertEqual(catalog["la"], "Lao")
self.assertEqual(catalog["latam"], "Spanish (Latin American)")
self.assertNotIn("us:intl", catalog)
self.assertLess(len(catalog), 60)
def test_readding_input_keeps_its_original_override(self):
self.assertEqual(typing.input_items([["keyboard-us", ""]], ["mozc"], {"mozc": "jp"}),
[["keyboard-us", ""], ["mozc", "jp"]])
self.assertEqual(typing.input_items([["keyboard-us", ""], ["mozc", "us"]], ["mozc"], {"mozc": "jp"}),
[["keyboard-us", ""], ["mozc", "us"]])
def test_input_deselection_keeps_keyboard_and_selected_overrides(self):
items = [["keyboard-us", ""], ["mozc", "jp"], ["hangul", ""], ["custom", "de"]]
@@ -48,23 +61,27 @@ class TypingSetupTest(unittest.TestCase):
def test_picker_preselects_current_entries_and_returns_empty_selection(self):
result = subprocess.CompletedProcess([], 0, stdout="[]")
with patch.object(typing.subprocess, "run", return_value=result) as process:
self.assertEqual(typing.choose("Inputs", {"mozc": "Japanese", "hangul": "Korean"}, ["hangul"], "input"), [])
self.assertIsNone(typing.choose("Inputs", {"mozc": "Japanese", "hangul": "Korean"}, ["hangul"], "input"))
args = process.call_args.args[0]
self.assertEqual(args[2], "\tKorean")
self.assertIn("--multiple", args)
self.assertEqual(args[-2:], ["--selected", "Korean"])
def test_picker_rejects_unknown_returned_values(self):
with patch.object(typing.subprocess, "run", return_value=subprocess.CompletedProcess([], 0, stdout='["unknown"]')):
with self.assertRaises(ValueError):
typing.choose("Inputs", {"mozc": "Japanese"}, [], "input")
def test_apply_rejects_unknown_values(self):
with self.assertRaises(ValueError):
typing.apply_selection("input", {"catalog": {"mozc": "Japanese"}}, ["unknown"])
def test_immediate_selection_removes_an_input_and_accepts_keyboard_only(self):
with patch.object(typing, "save_inputs") as save:
typing.apply_selection("input", {"mozc": "Japanese", "hangul": "Korean"}, ["Japanese"])
save.assert_called_once_with(["mozc"])
typing.apply_selection("input", {"mozc": "Japanese"}, [])
self.assertEqual(save.call_args.args, ([],))
with patch.object(typing, "save_inputs") as save, patch("builtins.print"):
typing.apply_selection("input", {"catalog": {"mozc": "Japanese", "hangul": "Korean"}}, ["Japanese"])
save.assert_called_once_with(["mozc"], None)
typing.apply_selection("input", {"catalog": {"mozc": "Japanese"}}, [])
self.assertEqual(save.call_args.args, ([], None))
def test_keyboard_checks_reflect_normalized_selection(self):
with patch.object(typing, "save_keyboard"), patch.object(typing, "keyboard_selection", return_value=["us", "ru"]), patch("builtins.print") as output:
typing.apply_selection("keyboard", {"catalog": {"us": "English", "ru": "Russian"}}, ["Russian"])
self.assertEqual(json.loads(output.call_args.args[0]), ["English", "Russian"])
def test_keyboard_override_failure_preserves_symlink_and_restores_settings(self):
with tempfile.TemporaryDirectory() as temporary:
+1
View File
@@ -10,6 +10,7 @@ const menu = requireFromRoot('shell/plugins/menu/MenuModel.js')
const options = ['French', '\tJapanese (Mozc)', 'x\tSame label\tfirst', 'x\tSame label\tsecond']
assertEqual(menu.dmenuValue(options[2]), 'Same label\tfirst', 'multi-select keeps a stable subtext value without the icon')
assertDeepEqual(menu.dmenuSelections(options, ['Same label\tsecond', 'French', 'stale']), ['French', 'Same label\tsecond'], 'multi-select preserves option order and excludes stale choices')
assertDeepEqual(menu.dmenuSelections(options, ['Same label\tsecond', 'French', 'stale'], true), ['Same label\tsecond', 'French'], 'immediate selections preserve switching order')
assertDeepEqual(menu.toggleDmenuSelection(['French'], 'French'), [], 'deselecting the final option produces an empty selection')
assertDeepEqual(menu.toggleDmenuSelection(['French'], 'Japanese (Mozc)'), ['French', 'Japanese (Mozc)'], 'selecting an input retains earlier choices')
JS