You've already forked MicroPythonOS
mirror of
https://github.com/m5stack/MicroPythonOS.git
synced 2026-05-20 11:51:27 -07:00
Fix all keyboard tests
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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."""
|
||||
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user