forked from MicroPythonOS/MicroPythonOS
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_graphical_imu_calibration.py
More file actions
187 lines (151 loc) · 6.85 KB
/
test_graphical_imu_calibration.py
File metadata and controls
187 lines (151 loc) · 6.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
"""
Graphical test for IMU calibration activities.
Tests both CheckIMUCalibrationActivity and CalibrateIMUActivity
with mock data on desktop.
Usage:
Desktop: ./tests/unittest.sh tests/test_graphical_imu_calibration.py
Device: ./tests/unittest.sh tests/test_graphical_imu_calibration.py --ondevice
"""
import unittest
import lvgl as lv
import mpos.ui
import os
import sys
import time
from mpos import (
wait_for_render,
capture_screenshot,
find_label_with_text,
verify_text_present,
print_screen_labels,
simulate_click,
get_widget_coords,
find_button_with_text,
click_label,
click_button,
find_text_on_screen,
AppManager
)
class TestIMUCalibration(unittest.TestCase):
"""Test suite for IMU calibration activities."""
def setUp(self):
"""Set up test fixtures."""
# Get screenshot directory
if sys.platform == "esp32":
self.screenshot_dir = "tests/screenshots"
else:
self.screenshot_dir = "../tests/screenshots" # it runs from internal_filesystem/
# Ensure directory exists
try:
os.mkdir(self.screenshot_dir)
except OSError:
pass
def tearDown(self):
"""Clean up after test."""
# Navigate back to launcher
try:
for _ in range(3): # May need multiple backs
mpos.ui.back_screen()
wait_for_render(5)
except:
pass
def test_check_calibration_activity_loads(self):
"""Test that CheckIMUCalibrationActivity loads and displays."""
print("\n=== Testing CheckIMUCalibrationActivity ===")
# Navigate: Launcher -> Settings -> Check IMU Calibration
result = AppManager.start_app("com.micropythonos.settings")
self.assertTrue(result, "Failed to start Settings app")
wait_for_render(15)
# Initialize touch device with dummy click
simulate_click(10, 10)
wait_for_render(10)
print("Clicking 'Check IMU Calibration' menu item...")
self.assertTrue(click_label("Check IMU Calibration"), "Could not find Check IMU Calibration menu item")
wait_for_render(iterations=20)
# Verify key elements are present
screen = lv.screen_active()
print_screen_labels(screen)
self.assertTrue(verify_text_present(screen, "Quality:"), "Quality label not found")
self.assertTrue(verify_text_present(screen, "Accel."), "Accel. label not found")
self.assertTrue(verify_text_present(screen, "Gyro"), "Gyro label not found")
# Capture screenshot
screenshot_path = f"{self.screenshot_dir}/check_imu_calibration.raw"
print(f"Capturing screenshot: {screenshot_path}")
capture_screenshot(screenshot_path)
# Verify screenshot saved
stat = os.stat(screenshot_path)
self.assertTrue(stat[6] > 0, "Screenshot file is empty")
print("=== CheckIMUCalibrationActivity test complete ===")
def test_calibrate_activity_flow(self):
"""Test CalibrateIMUActivity full calibration flow."""
print("\n=== Testing CalibrateIMUActivity Flow ===")
# Navigate: Launcher -> Settings -> Calibrate IMU
result = AppManager.start_app("com.micropythonos.settings")
self.assertTrue(result, "Failed to start Settings app")
wait_for_render(15)
# Initialize touch device with dummy click
simulate_click(10, 10)
wait_for_render(10)
print("Clicking 'Calibrate IMU' menu item...")
self.assertTrue(click_label("Calibrate IMU"), "Could not find Calibrate IMU item")
wait_for_render(iterations=20)
# Verify activity loaded and shows instructions
screen = lv.screen_active()
print_screen_labels(screen)
self.assertTrue(verify_text_present(screen, "IMU Calibration"),
"CalibrateIMUActivity title not found")
self.assertTrue(verify_text_present(screen, "Place device on flat"),
"Instructions not shown")
# Capture initial state
screenshot_path = f"{self.screenshot_dir}/calibrate_imu_01_initial.raw"
capture_screenshot(screenshot_path)
# Click "Calibrate Now" button to start calibration
calibrate_btn = find_button_with_text(screen, "Calibrate Now")
self.assertIsNotNone(calibrate_btn, "Could not find 'Calibrate Now' button")
# Use send_event instead of simulate_click (more reliable)
calibrate_btn.send_event(lv.EVENT.CLICKED, None)
wait_for_render(10)
# Wait for calibration to complete (mock takes ~3 seconds)
time.sleep(4)
wait_for_render(40)
# Verify calibration completed
screen = lv.screen_active()
print_screen_labels(screen)
self.assertTrue(verify_text_present(screen, "Calibration successful!"),
"Calibration completion message not found")
# Verify offsets are shown
self.assertTrue(verify_text_present(screen, "Accel offsets") or
verify_text_present(screen, "offsets"),
"Calibration offsets not shown")
# Capture completion state
screenshot_path = f"{self.screenshot_dir}/calibrate_imu_02_complete.raw"
capture_screenshot(screenshot_path)
print("=== CalibrateIMUActivity flow test complete ===")
def test_navigation_from_check_to_calibrate(self):
"""Test navigation from Check to Calibrate activity via button."""
print("\n=== Testing Check -> Calibrate Navigation ===")
# Navigate to Check activity
result = AppManager.start_app("com.micropythonos.settings")
self.assertTrue(result)
wait_for_render(15)
# Initialize touch device with dummy click
simulate_click(10, 10)
wait_for_render(10)
print("Clicking 'Check IMU Calibration' menu item...")
self.assertTrue(click_label("Check IMU Calibration"), "Could not find Check IMU Calibration menu item")
wait_for_render(iterations=20)
# Click "Calibrate" button to navigate to Calibrate activity
screen = lv.screen_active()
calibrate_btn = find_button_with_text(screen, "Calibrate")
self.assertIsNotNone(calibrate_btn, "Could not find 'Calibrate' button")
# Use send_event instead of simulate_click (more reliable for navigation)
calibrate_btn.send_event(lv.EVENT.CLICKED, None)
wait_for_render(30)
# Verify CalibrateIMUActivity loaded
screen = lv.screen_active()
print_screen_labels(screen)
self.assertTrue(verify_text_present(screen, "Calibrate Now"),
"Did not navigate to CalibrateIMUActivity")
self.assertTrue(verify_text_present(screen, "Place device on flat"),
"CalibrateIMUActivity instructions not shown")
print("=== Navigation test complete ===")