/
sapertlt
/
layout_switcher
Обзор
Документация
Войти
/
sapertlt
/
layout_switcher
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
tests/test_corrector_layout.py
129 строк
6 KB
Andrey Nikolaev
release: v0.1.7 — Определение раскладки по тексту при ручной коррекции (Double_Shift)
20 июн 2026, 02:33
20 июн 2026, 02:33
8fe1fc7
Код
Авторство
О чём код?
""" Тесты автоматического определения раскладки по тексту при ручной коррекции (Double_Shift). """ import pytest from unittest.mock import MagicMock from layout_switcher.core.corrector import TextCorrector from layout_switcher.core.buffer import KeystrokeBuffer from layout_switcher.layout.mappings.en_ru import EnRuMapping class TestCorrectorTextBasedLayoutDetection: """Тестирование автоопределения раскладки по тексту при ручной коррекции.""" @pytest.fixture def mock_layout_provider(self): provider = MagicMock() provider.get_current_layout.return_value = "ru" return provider @pytest.fixture def mock_output_provider(self): return MagicMock() @pytest.fixture def mock_dictionary(self): dictionary = MagicMock() # Имитируем наличие слов в словарях dictionary.contains.side_effect = lambda word, lang: ( (lang == "en" and word == "hello") or (lang == "ru" and word == "привет") ) return dictionary @pytest.fixture def settings(self): settings = MagicMock() settings.layouts = ["en", "ru"] settings.hotkeys.expand_interval_ms = 500 settings.hotkeys.typing_pause_threshold_sec = 2.0 return settings @pytest.fixture def corrector(self, mock_layout_provider, mock_output_provider, mock_dictionary, settings): buffer = KeystrokeBuffer() mappings = [EnRuMapping()] detector = None # Выключаем биграммный детектор для тестов на словарях exclusion_manager = MagicMock() exclusion_manager.is_excluded.return_value = False smart_filter = MagicMock() smart_filter.should_skip.return_value = (False, "") corrector = TextCorrector( buffer=buffer, layout_provider=mock_layout_provider, output_provider=mock_output_provider, mappings=mappings, detector=detector, exclusion_manager=exclusion_manager, smart_filter=smart_filter, settings=settings, dictionary=mock_dictionary, ) return corrector def test_correct_selection_latin_when_layout_is_ru(self, corrector, mock_layout_provider, mock_output_provider): """Выделенный английский текст при русской раскладке должен переводиться в русский.""" mock_layout_provider.get_current_layout.return_value = "ru" # Запускаем ручную коррекцию выделения corrector._correct_selection("ghbdtn") # Должна вызваться замена выделенного текста на "привет" mock_output_provider.replace_selected_text.assert_called_once_with("привет") # Раскладка должна переключиться на русскую mock_layout_provider.switch_to.assert_called_once_with("ru") def test_correct_selection_cyrillic_when_layout_is_en(self, corrector, mock_layout_provider, mock_output_provider): """Выделенный русский текст при английской раскладке должен переводиться в английский.""" mock_layout_provider.get_current_layout.return_value = "en" # Запускаем ручную коррекцию выделения corrector._correct_selection("привет") # Должна вызваться замена выделенного текста на "ghbdtn" mock_output_provider.replace_selected_text.assert_called_once_with("ghbdtn") # Раскладка должна переключиться на английскую mock_layout_provider.switch_to.assert_called_once_with("en") def test_correct_words_latin_when_layout_is_ru(self, corrector, mock_layout_provider, mock_output_provider): """Слово из буфера 'ghbdtn' (которое есть в RU-словаре как 'привет') должно исправляться в 'привет' при активной раскладке 'ru'.""" mock_layout_provider.get_current_layout.return_value = "ru" # Наполняем буфер латинским словом ghbdtn (как en_char) for char in "ghbdtn": # В буфере en_char = char entry = MagicMock() entry.en_char = char corrector._buffer.add_keystroke(entry) corrector._correct_words(1) # Должно быть стерто и заменено "ghbdtn" -> "привет" mock_output_provider.replace_text.assert_called_once_with("ghbdtn", "привет") # Раскладка должна стать русской mock_layout_provider.switch_to.assert_called_once_with("ru") def test_correct_words_cyrillic_when_layout_is_en(self, corrector, mock_layout_provider, mock_output_provider): """Слово из буфера 'hello' (которое есть в EN-словаре) должно исправляться в 'hello' (хотя на экране было 'руддщ') при активной раскладке 'en'.""" # На экране было "руддщ", раскладка сейчас "en". mock_layout_provider.get_current_layout.return_value = "en" # В буфере клавиши для "hello" (как en_char) for char in "hello": entry = MagicMock() entry.en_char = char corrector._buffer.add_keystroke(entry) corrector._correct_words(1) # На экране отображалось "руддщ", мы заменяем его на "hello" mock_output_provider.replace_text.assert_called_once_with("руддщ", "hello") # Раскладка должна стать английской mock_layout_provider.switch_to.assert_called_once_with("en")