Fixed a regression in table navigation.
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
from unittest import mock
|
||||
|
||||
import gi
|
||||
|
||||
os.environ.setdefault("GSETTINGS_BACKEND", "memory")
|
||||
|
||||
gi.require_version("Atspi", "2.0")
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
|
||||
|
||||
from cthulhu import messages
|
||||
from cthulhu import structural_navigation
|
||||
|
||||
|
||||
class StructuralNavigationTableRegressionTests(unittest.TestCase):
|
||||
def test_table_cell_coordinates_do_not_interrupt_cell_contents(self):
|
||||
navigator = structural_navigation.StructuralNavigation.__new__(
|
||||
structural_navigation.StructuralNavigation
|
||||
)
|
||||
navigator._script = mock.Mock()
|
||||
navigator._script.utilities.rowAndColumnSpan.return_value = (1, 1)
|
||||
navigator._getCaretPosition = mock.Mock(return_value=("cell", 0))
|
||||
navigator._setCaretPosition = mock.Mock(return_value=("cell", 0))
|
||||
navigator._isBlankCell = mock.Mock(return_value=False)
|
||||
navigator._presentObject = mock.Mock()
|
||||
navigator.getCellCoordinates = mock.Mock(return_value=(1, 2))
|
||||
|
||||
with (
|
||||
mock.patch.object(structural_navigation.settings, "speakCellHeaders", False),
|
||||
mock.patch.object(structural_navigation.settings, "speakCellCoordinates", True),
|
||||
mock.patch.object(structural_navigation.settings, "speakCellSpan", False),
|
||||
):
|
||||
navigator._tableCellPresentation("cell", None)
|
||||
|
||||
navigator._presentObject.assert_called_once_with("cell", 0)
|
||||
navigator._script.presentMessage.assert_called_once_with(
|
||||
messages.TABLE_CELL_COORDINATES % {"row": 2, "column": 3},
|
||||
interrupt=False,
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -0,0 +1,91 @@
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
from cthulhu import settings
|
||||
from cthulhu.backends.toml_backend import Backend
|
||||
|
||||
|
||||
LEGACY_SETTINGS = """format-version = 2
|
||||
|
||||
[profiles.default.metadata]
|
||||
display-name = "Default"
|
||||
internal-name = "default"
|
||||
|
||||
[profiles.default.keybindings]
|
||||
keyboard-layout = "desktop"
|
||||
desktop-modifier-keys = ["Insert", "KP_Insert"]
|
||||
|
||||
[profiles.default.ai-assistant]
|
||||
enabled = false
|
||||
provider = "ollama"
|
||||
api-key-file = ""
|
||||
ollama-model = "llama3.2-vision"
|
||||
ollama-endpoint = "http://localhost:11434"
|
||||
confirmation-required = true
|
||||
action-timeout = 30
|
||||
screenshot-quality = "medium"
|
||||
max-context-length = 4000
|
||||
|
||||
[profiles.default.ocr]
|
||||
language-code = "eng"
|
||||
scale-factor = 3
|
||||
grayscale-image = false
|
||||
invert-image = false
|
||||
black-white-image = false
|
||||
black-white-threshold = 200
|
||||
color-calculation = false
|
||||
color-calculation-max = 3
|
||||
copy-to-clipboard = false
|
||||
|
||||
[profiles.default.plugins]
|
||||
active-plugins = ["PluginManager", "OCR"]
|
||||
plugin-sources = []
|
||||
"""
|
||||
|
||||
|
||||
class LegacyTomlSchemaMigrationTests(unittest.TestCase):
|
||||
def test_backend_migrates_legacy_nested_profile_schema_on_read(self):
|
||||
with tempfile.TemporaryDirectory() as tempDir:
|
||||
Path(tempDir, "user-settings.toml").write_text(
|
||||
LEGACY_SETTINGS,
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
backend = Backend(tempDir)
|
||||
|
||||
self.assertEqual(backend.availableProfiles(), [["Default", "default"]])
|
||||
|
||||
general = backend.getGeneral("default")
|
||||
|
||||
self.assertEqual(general["profile"], ["Default", "default"])
|
||||
self.assertEqual(
|
||||
general["keyboardLayout"],
|
||||
settings.GENERAL_KEYBOARD_LAYOUT_DESKTOP,
|
||||
)
|
||||
self.assertEqual(general["cthulhuModifierKeys"], settings.DESKTOP_MODIFIER_KEYS)
|
||||
self.assertEqual(general["activePlugins"], ["PluginManager", "OCR"])
|
||||
self.assertEqual(general["aiProvider"], settings.AI_PROVIDER_OLLAMA)
|
||||
self.assertFalse(general["aiAssistantEnabled"])
|
||||
self.assertEqual(general["ocrLanguageCode"], "eng")
|
||||
self.assertEqual(backend.getKeybindings("default"), {})
|
||||
|
||||
def test_saving_after_legacy_read_rewrites_current_schema(self):
|
||||
with tempfile.TemporaryDirectory() as tempDir:
|
||||
settingsPath = Path(tempDir, "user-settings.toml")
|
||||
settingsPath.write_text(LEGACY_SETTINGS, encoding="utf-8")
|
||||
|
||||
backend = Backend(tempDir)
|
||||
general = backend.getGeneral("default")
|
||||
backend.saveProfileSettings("default", dict(general), {}, {})
|
||||
|
||||
savedSettings = settingsPath.read_text(encoding="utf-8")
|
||||
|
||||
self.assertIn('profile = ["Default", "default"]', savedSettings)
|
||||
self.assertIn('activePlugins = ["PluginManager", "OCR"]', savedSettings)
|
||||
self.assertNotIn("format-version = 2", savedSettings)
|
||||
self.assertNotIn("[profiles.default.metadata]", savedSettings)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user