From 25b3bc00c67ffe091912dd98fc14139c71fd386a Mon Sep 17 00:00:00 2001 From: Thomas Farstrike Date: Mon, 17 Nov 2025 12:27:08 +0100 Subject: [PATCH] Fix all keyboard tests --- internal_filesystem/lib/mpos/ui/keyboard.py | 29 ++-- tests/test_graphical_custom_keyboard.py | 14 +- tests/test_graphical_custom_keyboard_basic.py | 27 +-- .../test_graphical_keyboard_abc_click_bug.py | 162 ------------------ ...st_graphical_keyboard_default_vs_custom.py | 16 +- ...est_graphical_keyboard_layout_switching.py | 38 ++-- ...st_graphical_keyboard_rapid_mode_switch.py | 33 ++-- 7 files changed, 57 insertions(+), 262 deletions(-) delete mode 100644 tests/test_graphical_keyboard_abc_click_bug.py diff --git a/internal_filesystem/lib/mpos/ui/keyboard.py b/internal_filesystem/lib/mpos/ui/keyboard.py index 3584c487..ec3c8123 100644 --- a/internal_filesystem/lib/mpos/ui/keyboard.py +++ b/internal_filesystem/lib/mpos/ui/keyboard.py @@ -13,9 +13,6 @@ Usage: keyboard.set_textarea(my_textarea) keyboard.align(lv.ALIGN.BOTTOM_MID, 0, 0) - # Or use factory function for drop-in replacement - from mpos.ui.keyboard import create_keyboard - keyboard = create_keyboard(parent_obj, custom=True) """ import lvgl as lv @@ -41,10 +38,10 @@ class MposKeyboard: # Keyboard modes - use USER modes for our API # We'll also register to standard modes to catch LVGL's internal switches - CUSTOM_MODE_LOWERCASE = lv.keyboard.MODE.USER_1 - CUSTOM_MODE_UPPERCASE = lv.keyboard.MODE.USER_2 - CUSTOM_MODE_NUMBERS = lv.keyboard.MODE.USER_3 - CUSTOM_MODE_SPECIALS = lv.keyboard.MODE.USER_4 + MODE_LOWERCASE = lv.keyboard.MODE.USER_1 + MODE_UPPERCASE = lv.keyboard.MODE.USER_2 + MODE_NUMBERS = lv.keyboard.MODE.USER_3 + MODE_SPECIALS = lv.keyboard.MODE.USER_4 # Lowercase letters _lowercase_map = [ @@ -84,10 +81,10 @@ class MposKeyboard: # Map modes to their layouts mode_info = { - CUSTOM_MODE_LOWERCASE: (_lowercase_map, _lowercase_ctrl), - CUSTOM_MODE_UPPERCASE: (_uppercase_map, _uppercase_ctrl), - CUSTOM_MODE_NUMBERS: (_numbers_map, _numbers_ctrl), - CUSTOM_MODE_SPECIALS: (_specials_map, _specials_ctrl), + MODE_LOWERCASE: (_lowercase_map, _lowercase_ctrl), + MODE_UPPERCASE: (_uppercase_map, _uppercase_ctrl), + MODE_NUMBERS: (_numbers_map, _numbers_ctrl), + MODE_SPECIALS: (_specials_map, _specials_ctrl), } _current_mode = None @@ -99,7 +96,7 @@ class MposKeyboard: # Store textarea reference (we DON'T pass it to LVGL to avoid double-typing) self._textarea = None - self.set_mode(self.CUSTOM_MODE_LOWERCASE) + self.set_mode(self.MODE_LOWERCASE) self._keyboard.add_event_cb(self._handle_events, lv.EVENT.ALL, None) # Apply theme fix for light mode visibility @@ -141,19 +138,19 @@ class MposKeyboard: new_text = current_text[:-1] elif text == lv.SYMBOL.UP: # Switch to uppercase - self.set_mode(self.CUSTOM_MODE_UPPERCASE) + self.set_mode(self.MODE_UPPERCASE) return # Don't modify text elif text == lv.SYMBOL.DOWN or text == self.LABEL_LETTERS: # Switch to lowercase - self.set_mode(self.CUSTOM_MODE_LOWERCASE) + self.set_mode(self.MODE_LOWERCASE) return # Don't modify text elif text == self.LABEL_NUMBERS_SPECIALS: # Switch to numbers/specials - self.set_mode(self.CUSTOM_MODE_NUMBERS) + self.set_mode(self.MODE_NUMBERS) return # Don't modify text elif text == self.LABEL_SPECIALS: # Switch to additional specials - self.set_mode(self.CUSTOM_MODE_SPECIALS) + self.set_mode(self.MODE_SPECIALS) return # Don't modify text elif text == self.LABEL_SPACE: # Space bar diff --git a/tests/test_graphical_custom_keyboard.py b/tests/test_graphical_custom_keyboard.py index 5f360a2d..37cf2339 100644 --- a/tests/test_graphical_custom_keyboard.py +++ b/tests/test_graphical_custom_keyboard.py @@ -13,7 +13,7 @@ import unittest import lvgl as lv import sys import os -from mpos.ui.keyboard import MposKeyboard, create_keyboard +from mpos.ui.keyboard import MposKeyboard from graphical_test_helper import ( wait_for_render, capture_screenshot, @@ -86,10 +86,9 @@ class TestGraphicalMposKeyboard(unittest.TestCase): Returns: str: Text of the pressed button """ - lvgl_keyboard = keyboard.get_lvgl_obj() # Get button text before pressing - button_text = lvgl_keyboard.get_button_text(button_index) + button_text = keyboard.get_button_text(button_index) # Simulate button press by setting it as selected and sending event # Note: This is a bit of a hack since we can't directly click in tests @@ -97,7 +96,7 @@ class TestGraphicalMposKeyboard(unittest.TestCase): # The keyboard has an internal handler that responds to VALUE_CHANGED # We need to manually trigger it - lvgl_keyboard.send_event(lv.EVENT.VALUE_CHANGED, None) + keyboard.send_event(lv.EVENT.VALUE_CHANGED, None) wait_for_render(5) @@ -217,8 +216,7 @@ class TestGraphicalMposKeyboard(unittest.TestCase): screen, keyboard, textarea = self._create_test_keyboard_scene() # Get button background color - lvgl_keyboard = keyboard.get_lvgl_obj() - bg_color = lvgl_keyboard.get_style_bg_color(lv.PART.ITEMS) + bg_color = keyboard.get_style_bg_color(lv.PART.ITEMS) # Extract RGB (similar to keyboard styling test) try: @@ -273,7 +271,7 @@ class TestGraphicalMposKeyboard(unittest.TestCase): ta_standard.set_one_line(True) # Create standard keyboard (hidden initially) - keyboard_standard = create_keyboard(screen, custom=False) + keyboard_standard = MposKeyboard(screen) keyboard_standard.set_textarea(ta_standard) keyboard_standard.align(lv.ALIGN.BOTTOM_MID, 0, 0) keyboard_standard.set_style_min_height(145, 0) @@ -301,7 +299,7 @@ class TestGraphicalMposKeyboard(unittest.TestCase): ta_custom.set_placeholder_text("Custom") ta_custom.set_one_line(True) - keyboard_custom = create_keyboard(screen2, custom=True) + keyboard_custom = MposKeyboard(screen2) keyboard_custom.set_textarea(ta_custom) keyboard_custom.align(lv.ALIGN.BOTTOM_MID, 0, 0) diff --git a/tests/test_graphical_custom_keyboard_basic.py b/tests/test_graphical_custom_keyboard_basic.py index 90a870b7..c4eba283 100644 --- a/tests/test_graphical_custom_keyboard_basic.py +++ b/tests/test_graphical_custom_keyboard_basic.py @@ -10,7 +10,7 @@ Usage: import unittest import lvgl as lv -from mpos.ui.keyboard import MposKeyboard, create_keyboard +from mpos.ui.keyboard import MposKeyboard class TestMposKeyboard(unittest.TestCase): @@ -44,34 +44,9 @@ class TestMposKeyboard(unittest.TestCase): # Verify keyboard exists self.assertIsNotNone(keyboard) - self.assertIsNotNone(keyboard.get_lvgl_obj()) print("Keyboard created successfully") - def test_keyboard_factory_custom(self): - """Test factory function creates custom keyboard.""" - print("Testing factory function with custom=True...") - - keyboard = create_keyboard(self.screen, custom=True) - - # Verify it's a MposKeyboard instance - self.assertIsInstance(keyboard, MposKeyboard) - - print("Factory created MposKeyboard successfully") - - def test_keyboard_factory_standard(self): - """Test factory function creates standard keyboard.""" - print("Testing factory function with custom=False...") - - keyboard = create_keyboard(self.screen, custom=False) - - # Verify it's an LVGL keyboard (not MposKeyboard) - self.assertFalse(isinstance(keyboard, MposKeyboard), - "Factory with custom=False should not create MposKeyboard") - # It should be an lv.keyboard instance - self.assertEqual(type(keyboard).__name__, 'keyboard') - - print("Factory created standard keyboard successfully") def test_set_textarea(self): """Test setting textarea association.""" diff --git a/tests/test_graphical_keyboard_abc_click_bug.py b/tests/test_graphical_keyboard_abc_click_bug.py deleted file mode 100644 index 58b42693..00000000 --- a/tests/test_graphical_keyboard_abc_click_bug.py +++ /dev/null @@ -1,162 +0,0 @@ -""" -Test for the abc button click bug - comma being added. - -This test actually CLICKS the abc button to reproduce the comma bug. - -Usage: - Desktop: ./tests/unittest.sh tests/test_graphical_keyboard_abc_click_bug.py -""" - -import unittest -import lvgl as lv -from mpos.ui.keyboard import MposKeyboard -from graphical_test_helper import wait_for_render - - -class TestAbcButtonClickBug(unittest.TestCase): - """Test that clicking abc button doesn't add comma.""" - - def setUp(self): - """Set up test fixtures.""" - self.screen = lv.obj() - self.screen.set_size(320, 240) - - # Create textarea - self.textarea = lv.textarea(self.screen) - self.textarea.set_size(280, 40) - self.textarea.align(lv.ALIGN.TOP_MID, 0, 10) - self.textarea.set_one_line(True) - - # Load screen - lv.screen_load(self.screen) - wait_for_render(5) - - def tearDown(self): - """Clean up.""" - lv.screen_load(lv.obj()) - wait_for_render(5) - - def test_clicking_abc_button_should_not_add_comma(self): - """ - Test that actually CLICKING the abc button doesn't add comma. - - This is the REAL test - simulating actual user clicks. - """ - print("\n=== Testing ACTUAL CLICKING of abc button ===") - - keyboard = MposKeyboard(self.screen) - keyboard.set_textarea(self.textarea) - keyboard.align(lv.ALIGN.BOTTOM_MID, 0, 0) - wait_for_render(10) - - # Start in lowercase, switch to numbers - print("Step 1: Switch to numbers mode") - keyboard.set_mode(MposKeyboard.MODE_NUMBERS) - wait_for_render(10) - - # Clear textarea - self.textarea.set_text("") - print(f" Textarea cleared: '{self.textarea.get_text()}'") - - # Find the "abc" button - abc_button_index = None - for i in range(100): - try: - text = keyboard.get_button_text(i) - if text == "abc": - abc_button_index = i - print(f" Found 'abc' button at index {i}") - break - except: - pass - - self.assertIsNotNone(abc_button_index, "Should find 'abc' button in numbers mode") - - # ACTUALLY CLICK THE BUTTON - print(f"\nStep 2: ACTUALLY CLICK button index {abc_button_index}") - print(f" Before click: textarea='{self.textarea.get_text()}'") - - # Simulate button click by sending CLICKED event to the button matrix - # Get the underlying button matrix object - btnm = keyboard._keyboard - - # Method 1: Try to programmatically click the button - # This simulates what happens when user actually touches the button - btnm.set_selected_button(abc_button_index) - wait_for_render(2) - - # Send the VALUE_CHANGED event - btnm.send_event(lv.EVENT.VALUE_CHANGED, None) - wait_for_render(5) - - textarea_after = self.textarea.get_text() - print(f" After click: textarea='{textarea_after}'") - - # Check if comma was added - if "," in textarea_after: - print(f"\n ❌ BUG CONFIRMED: Comma was added!") - print(f" Textarea contains: '{textarea_after}'") - self.fail(f"BUG: Clicking 'abc' button added comma! Textarea: '{textarea_after}'") - - # Also check if anything else was added - if textarea_after != "": - print(f"\n ❌ BUG CONFIRMED: Something was added!") - print(f" Expected: ''") - print(f" Got: '{textarea_after}'") - self.fail(f"BUG: Clicking 'abc' button added text! Textarea: '{textarea_after}'") - - print(f"\n ✓ SUCCESS: No text added, textarea is still empty") - - def test_clicking_abc_multiple_times(self): - """ - Test clicking abc button multiple times in a row. - """ - print("\n=== Testing MULTIPLE clicks of abc button ===") - - keyboard = MposKeyboard(self.screen) - keyboard.set_textarea(self.textarea) - keyboard.align(lv.ALIGN.BOTTOM_MID, 0, 0) - wait_for_render(10) - - for attempt in range(5): - print(f"\n--- Attempt {attempt + 1} ---") - - # Go to numbers mode - keyboard.set_mode(MposKeyboard.MODE_NUMBERS) - wait_for_render(10) - - # Clear textarea - self.textarea.set_text("") - - # Find abc button - abc_button_index = None - for i in range(100): - try: - text = keyboard.get_button_text(i) - if text == "abc": - abc_button_index = i - break - except: - pass - - # Click it - print(f"Clicking 'abc' at index {abc_button_index}") - keyboard._keyboard.set_selected_button(abc_button_index) - wait_for_render(2) - keyboard._keyboard.send_event(lv.EVENT.VALUE_CHANGED, None) - wait_for_render(5) - - textarea_text = self.textarea.get_text() - print(f" Result: textarea='{textarea_text}'") - - if textarea_text != "": - print(f" ❌ FAIL on attempt {attempt + 1}: Got '{textarea_text}'") - self.fail(f"Attempt {attempt + 1}: Clicking 'abc' added '{textarea_text}'") - else: - print(f" ✓ OK") - - print("\n✓ SUCCESS: All 5 attempts worked correctly") - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/test_graphical_keyboard_default_vs_custom.py b/tests/test_graphical_keyboard_default_vs_custom.py index 264169eb..df2ec634 100644 --- a/tests/test_graphical_keyboard_default_vs_custom.py +++ b/tests/test_graphical_keyboard_default_vs_custom.py @@ -58,7 +58,7 @@ class TestDefaultVsCustomKeyboard(unittest.TestCase): if text and text not in ["\n", ""]: print(f" Index {i}: '{text}'") # Track special labels - if text in ["ABC", "abc", "1#", "?123", "#+=", lv.SYMBOL.UP, lv.SYMBOL.DOWN]: + if text in ["Abc", "Abc", "1#", "?123", "#+=", lv.SYMBOL.UP, lv.SYMBOL.DOWN]: found_special_labels[text] = i except: pass @@ -68,8 +68,8 @@ class TestDefaultVsCustomKeyboard(unittest.TestCase): print(f" '{label}' at index {idx}") print("\n--- Characteristics of DEFAULT LVGL keyboard ---") - if "ABC" in found_special_labels: - print(" ✓ Has 'ABC' (uppercase label)") + if "Abc" in found_special_labels: + print(" ✓ Has 'Abc' (uppercase label)") if "1#" in found_special_labels: print(" ✓ Has '1#' (numbers label)") if "#+" in found_special_labels or "#+=" in found_special_labels: @@ -104,7 +104,7 @@ class TestDefaultVsCustomKeyboard(unittest.TestCase): if text and text not in ["\n", ""]: print(f" Index {i}: '{text}'") # Track special labels - if text in ["ABC", "abc", "1#", "?123", "=\\<", lv.SYMBOL.UP, lv.SYMBOL.DOWN]: + if text in ["Abc", "Abc", "1#", "?123", "=\\<", lv.SYMBOL.UP, lv.SYMBOL.DOWN]: found_special_labels[text] = i except: pass @@ -123,7 +123,7 @@ class TestDefaultVsCustomKeyboard(unittest.TestCase): def test_mode_switching_bug_reproduction(self): """ - Try to reproduce the bug: numbers -> abc -> wrong layout. + Try to reproduce the bug: numbers -> Abc -> wrong layout. """ print("\n=== Attempting to reproduce the bug ===") @@ -150,7 +150,7 @@ class TestDefaultVsCustomKeyboard(unittest.TestCase): wait_for_render(5) labels_step2 = self._get_special_labels(keyboard) print(f" Labels: {list(labels_step2.keys())}") - self.assertIn("abc", labels_step2, "Should have 'abc' in numbers mode") + self.assertIn("Abc", labels_step2, "Should have 'Abc' in numbers mode") # Step 3: Switch back to lowercase (this is where bug might happen) print("\nStep 3: Switch back to lowercase via set_mode()") @@ -160,7 +160,7 @@ class TestDefaultVsCustomKeyboard(unittest.TestCase): print(f" Labels: {list(labels_step3.keys())}") # Check for bug - if "ABC" in labels_step3 or "1#" in labels_step3: + if "Abc" in labels_step3 or "1#" in labels_step3: print(" ❌ BUG DETECTED: Got default LVGL keyboard!") print(f" Found these labels: {list(labels_step3.keys())}") self.fail("BUG: Switched to default LVGL keyboard instead of custom") @@ -178,7 +178,7 @@ class TestDefaultVsCustomKeyboard(unittest.TestCase): for i in range(100): try: text = keyboard.get_button_text(i) - if text in ["ABC", "abc", "1#", "?123", "=\\<", "#+=", lv.SYMBOL.UP, lv.SYMBOL.DOWN]: + if text in ["Abc", "Abc", "1#", "?123", "=\\<", "#+=", lv.SYMBOL.UP, lv.SYMBOL.DOWN]: labels[text] = i except: pass diff --git a/tests/test_graphical_keyboard_layout_switching.py b/tests/test_graphical_keyboard_layout_switching.py index 5672e5cf..f0a64422 100644 --- a/tests/test_graphical_keyboard_layout_switching.py +++ b/tests/test_graphical_keyboard_layout_switching.py @@ -1,7 +1,7 @@ """ Test for keyboard layout switching bug. -This test reproduces the issue where clicking the "abc" button in numbers mode +This test reproduces the issue where clicking the "Abc" button in numbers mode goes to the wrong (default LVGL) keyboard layout instead of our custom lowercase layout. Usage: @@ -40,18 +40,18 @@ class TestKeyboardLayoutSwitching(unittest.TestCase): def test_abc_button_from_numbers_mode(self): """ - Test that clicking "abc" button in numbers mode goes to lowercase mode. + Test that clicking "Abc" button in numbers mode goes to lowercase mode. BUG: Currently goes to the wrong (default LVGL) keyboard layout instead of our custom lowercase layout. Expected behavior: 1. Start in lowercase mode (has "q", "w", "e", etc.) - 2. Switch to numbers mode (has "1", "2", "3", etc. and "abc" button) - 3. Click "abc" button + 2. Switch to numbers mode (has "1", "2", "3", etc. and "Abc" button) + 3. Click "Abc" button 4. Should return to lowercase mode (has "q", "w", "e", etc.) """ - print("\n=== Testing 'abc' button from numbers mode ===") + print("\n=== Testing 'Abc' button from numbers mode ===") # Create keyboard keyboard = MposKeyboard(self.screen) @@ -94,23 +94,23 @@ class TestKeyboardLayoutSwitching(unittest.TestCase): self.assertIsNotNone(one_button_index, "Should find '1' in numbers mode") - # Find the 'abc' button in numbers mode - print("\nStep 3: Find 'abc' button in numbers mode") + # Find the 'Abc' button in numbers mode + print("\nStep 3: Find 'Abc' button in numbers mode") abc_button_index = None for i in range(100): try: text = keyboard.get_button_text(i) - if text == "abc": + if text == "Abc": abc_button_index = i - print(f" Found 'abc' at index {i}") + print(f" Found 'Abc' at index {i}") break except: pass - self.assertIsNotNone(abc_button_index, "Should find 'abc' button in numbers mode") + self.assertIsNotNone(abc_button_index, "Should find 'Abc' button in numbers mode") - # Switch back to lowercase by calling set_mode (simulating clicking 'abc') - print("\nStep 4: Click 'abc' to switch back to lowercase") + # Switch back to lowercase by calling set_mode (simulating clicking 'Abc') + print("\nStep 4: Click 'Abc' to switch back to lowercase") keyboard.set_mode(MposKeyboard.MODE_LOWERCASE) wait_for_render(5) @@ -119,7 +119,7 @@ class TestKeyboardLayoutSwitching(unittest.TestCase): # - Our custom keyboard has "?123" (to switch to numbers) # - Default LVGL keyboard has "1#" (to switch to numbers) and "ABC" (to switch to uppercase) # - # Note: "abc" only appears in NUMBERS/SPECIALS modes to switch back to lowercase + # Note: "Abc" only appears in NUMBERS/SPECIALS modes to switch back to lowercase print("\nStep 5: Verify we're in OUR custom lowercase mode (not default LVGL)") found_labels = {} @@ -127,7 +127,7 @@ class TestKeyboardLayoutSwitching(unittest.TestCase): try: text = keyboard.get_button_text(i) # Check for all possible distinguishing labels - if text in ["abc", "ABC", "?123", "1#", lv.SYMBOL.UP, lv.SYMBOL.DOWN]: + if text in ["Abc", "ABC", "?123", "1#", lv.SYMBOL.UP, lv.SYMBOL.DOWN]: found_labels[text] = i print(f" Found label '{text}' at index {i}") except: @@ -156,7 +156,7 @@ class TestKeyboardLayoutSwitching(unittest.TestCase): print(f" Found '?123' at index {found_labels['?123']} - GOOD (custom keyboard)") print(f" Found UP symbol at index {found_labels[lv.SYMBOL.UP]} - GOOD (custom keyboard)") - print("\nSUCCESS: 'abc' button correctly returns to custom lowercase layout!") + print("\nSUCCESS: 'Abc' button correctly returns to custom lowercase layout!") def test_layout_switching_cycle(self): """ @@ -205,7 +205,7 @@ class TestKeyboardLayoutSwitching(unittest.TestCase): """ Test that the event handler properly switches layouts. - This simulates what happens when the user actually CLICKS the "abc" button, + This simulates what happens when the user actually CLICKS the "Abc" button, going through the _handle_events method instead of calling set_mode() directly. """ print("\n=== Testing event handler layout switching ===") @@ -232,10 +232,10 @@ class TestKeyboardLayoutSwitching(unittest.TestCase): pass self.assertTrue(one_found, "Should be in numbers mode") - # Now simulate what the event handler does when "abc" is clicked + # Now simulate what the event handler does when "Qbc" is clicked # The event handler checks: elif text == lv.SYMBOL.DOWN or text == self.LABEL_LETTERS: # Then it calls: self._keyboard.set_map() and self._keyboard.set_mode() - print("\nStep 2: Simulate clicking 'abc' (via event handler logic)") + print("\nStep 2: Simulate clicking 'Abc' (via event handler logic)") # This is what the event handler does: keyboard._keyboard.set_map( @@ -256,7 +256,7 @@ class TestKeyboardLayoutSwitching(unittest.TestCase): for i in range(100): try: text = keyboard.get_button_text(i) - if text in ["abc", "ABC", "?123", "1#", lv.SYMBOL.UP]: + if text in ["Abc", "ABC", "?123", "1#", lv.SYMBOL.UP]: found_labels[text] = i print(f" Found label '{text}' at index {i}") except: diff --git a/tests/test_graphical_keyboard_rapid_mode_switch.py b/tests/test_graphical_keyboard_rapid_mode_switch.py index 5bd42ee7..53e590c2 100644 --- a/tests/test_graphical_keyboard_rapid_mode_switch.py +++ b/tests/test_graphical_keyboard_rapid_mode_switch.py @@ -40,12 +40,12 @@ class TestRapidModeSwitching(unittest.TestCase): def test_rapid_clicking_abc_button(self): """ - Rapidly click the "abc" button to reproduce the comma bug and crash. + Rapidly click the "Abc" button to reproduce the comma bug and crash. - Expected: Clicking "abc" should NOT add comma to textarea + Expected: Clicking "Abc" should NOT add comma to textarea Bug: Comma is being added, suggesting button index confusion """ - print("\n=== Testing rapid clicking of abc button ===") + print("\n=== Testing rapid clicking of Abc button ===") keyboard = MposKeyboard(self.screen) keyboard.set_textarea(self.textarea) @@ -65,17 +65,17 @@ class TestRapidModeSwitching(unittest.TestCase): for i in range(100): try: text = keyboard.get_button_text(i) - if text == "abc": + if text == "Abc": abc_button_index = i - print(f" Found 'abc' button at index {i}") + print(f" Found 'Abc' button at index {i}") break except: pass - self.assertIsNotNone(abc_button_index, "Should find 'abc' button in numbers mode") + self.assertIsNotNone(abc_button_index, "Should find 'Abc' button in numbers mode") # Simulate rapid clicking by alternating modes - print("\nStep 2: Rapidly switch modes by simulating abc/?123 clicks") + print("\nStep 2: Rapidly switch modes by simulating Abc/?123 clicks") for i in range(10): # Get current mode current_mode = keyboard._keyboard.get_mode() @@ -85,7 +85,7 @@ class TestRapidModeSwitching(unittest.TestCase): print(f" Click {i+1}: mode={current_mode}, textarea='{textarea_before}'") if current_mode == MposKeyboard.MODE_NUMBERS or current_mode == lv.keyboard.MODE.NUMBER: - # Click "abc" to go to lowercase + # Click "Abc" to go to lowercase keyboard.set_mode(MposKeyboard.MODE_LOWERCASE) else: # Click "?123" to go to numbers @@ -129,7 +129,7 @@ class TestRapidModeSwitching(unittest.TestCase): for i in range(40): try: text = keyboard.get_button_text(i) - if text in ["?123", ",", "abc", lv.SYMBOL.UP]: + if text in ["?123", ",", "Abc", lv.SYMBOL.UP]: lowercase_buttons[text] = i print(f" '{text}' at index {i}") except: @@ -144,24 +144,11 @@ class TestRapidModeSwitching(unittest.TestCase): for i in range(40): try: text = keyboard.get_button_text(i) - if text in ["?123", ",", "abc", "=\\<"]: + if text in ["?123", ",", "Abc", "=\\<"]: numbers_buttons[text] = i print(f" '{text}' at index {i}") except: pass - # Check if comma and abc are at same index - if "," in lowercase_buttons and "abc" in numbers_buttons: - comma_idx = lowercase_buttons[","] - abc_idx = numbers_buttons["abc"] - print(f"\nComparison:") - print(f" Comma in lowercase: index {comma_idx}") - print(f" 'abc' in numbers: index {abc_idx}") - - if comma_idx == abc_idx: - print(" WARNING: Comma and 'abc' share the same index!") - print(" This could explain why comma appears when clicking 'abc'") - - if __name__ == "__main__": unittest.main()