Skip to content

Commit f004a22

Browse files
committed
tests: Add screenshot method for testdisplay
This allows to take a screenshot at any point in test execution, e.g. see basic_slider.py start and final screenshots.
1 parent a00f067 commit f004a22

File tree

4 files changed

+63
-36
lines changed

4 files changed

+63
-36
lines changed

tests/api/basic.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
# RGB colors, layout aligment and events.
1212

1313

14-
async def demo(scr, display=None):
14+
async def buttons(scr, display=None):
1515
def get_button(scr, text, align, color):
1616
_btn = lv.button(scr)
1717
_btn.set_size(lv.pct(25), lv.pct(10))
@@ -41,7 +41,7 @@ def button_cb(event, name):
4141
)
4242

4343
await asyncio.sleep_ms(500) # await so the frame can be rendered
44-
display._save_frame = False
44+
await display.screenshot()
4545
print("EVENT TEST:")
4646
for _btn, name in _all_btns:
4747
_btn.send_event(lv.EVENT.CLICKED, None)
@@ -60,5 +60,5 @@ def button_cb(event, name):
6060
except Exception:
6161
display_config = testrunner.display_config
6262

63-
testrunner.run(demo, __file__, disp_config=display_config)
63+
testrunner.run(buttons, __file__, disp_config=display_config)
6464
testrunner.devicereset()

tests/api/basic_indev.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
# RGB colors, layout aligment and events.
1212

1313

14-
async def demo(scr, display=None):
14+
async def buttons(scr, display=None):
1515
def get_button(scr, text, align, color):
1616
_btn = lv.button(scr)
1717
_btn.set_size(lv.pct(25), lv.pct(10))
@@ -41,8 +41,7 @@ def button_cb(event, name):
4141
)
4242

4343
await asyncio.sleep_ms(500) # await so the frame can be rendered
44-
display._save_frame = False
45-
44+
await display.screenshot()
4645
print("EVENT TEST:")
4746
for _btn, name in _all_btns:
4847
_btn.send_event(lv.EVENT.CLICKED, None)
@@ -78,5 +77,5 @@ def button_cb(event, name):
7877
except Exception:
7978
display_config = testrunner.display_config
8079

81-
testrunner.run(demo, __file__, disp_config=display_config)
80+
testrunner.run(buttons, __file__, disp_config=display_config)
8281
testrunner.devicereset()

tests/api/basic_slider.py

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,52 +11,52 @@
1111
# RGB colors, layout aligment and events.
1212

1313

14-
async def demo(scr, display=None):
15-
def get_button(scr, text, align, color):
14+
async def sliders(scr, display=None):
15+
def get_slider(scr, text, align, color):
1616
scr.set_style_pad_all(10, 0)
17-
_btn = lv.slider(scr)
18-
_btn.set_width(lv.pct(75))
19-
_btn.set_height(lv.pct(10))
20-
_lab = lv.label(_btn)
17+
slider = lv.slider(scr)
18+
slider.set_width(lv.pct(75))
19+
slider.set_height(lv.pct(10))
20+
_lab = lv.label(slider)
2121
_lab.set_text(text)
2222
_lab.set_style_text_color(lv.color_white(), 0)
2323
_lab.center()
24-
_btn.set_style_align(align, 0)
25-
_btn.set_style_bg_color(lv.color_make(*color), lv.PART.INDICATOR)
26-
_btn.set_style_bg_color(lv.color_make(*color), lv.PART.MAIN)
27-
_btn.set_style_bg_color(lv.color_make(*color), lv.PART.KNOB)
28-
return _btn, text
24+
slider.set_style_align(align, 0)
25+
slider.set_style_bg_color(lv.color_make(*color), lv.PART.INDICATOR)
26+
slider.set_style_bg_color(lv.color_make(*color), lv.PART.MAIN)
27+
slider.set_style_bg_color(lv.color_make(*color), lv.PART.KNOB)
28+
return slider, text
2929

30-
buttons = [
30+
sliders = [
3131
("RED", lv.ALIGN.TOP_MID, (255, 0, 0)),
3232
("GREEN", lv.ALIGN.BOTTOM_MID, (0, 255, 0)),
3333
("BLUE", lv.ALIGN.CENTER, (0, 0, 255)),
3434
]
3535

36-
def button_cb(event, name, slider):
36+
def slider_cb(event, name, slider):
3737
if slider.get_value() == 100:
3838
print(f"{name} VALUE: {slider.get_value()}")
3939

40-
_all_btns = [get_button(scr, *btn) for btn in buttons]
40+
_all_objs = [get_slider(scr, *slider) for slider in sliders]
4141

42-
for btn, name in _all_btns:
43-
btn.add_event_cb(
44-
lambda event, button_name=name, slider=btn: button_cb(
42+
for sld, name in _all_objs:
43+
sld.add_event_cb(
44+
lambda event, button_name=name, slider=sld: slider_cb(
4545
event, button_name, slider
4646
),
4747
lv.EVENT.VALUE_CHANGED,
4848
None,
4949
)
5050

5151
await asyncio.sleep_ms(500) # await so the frame can be rendered
52-
display._save_frame = False
52+
await display.screenshot()
5353

5454
# simulate touch events
5555
if display:
5656
print("INDEV + SLIDER TEST:")
5757
display.debug_indev(press=False)
5858
display.debug_display(False)
59-
for _btn, name in _all_btns:
59+
for _btn, name in _all_objs:
6060
pos = _btn.get_x(), _btn.get_y()
6161
pos2 = _btn.get_x2(), _btn.get_y2()
6262
x1, y1 = pos
@@ -65,7 +65,8 @@ def button_cb(event, name, slider):
6565
await display.swipe(x1 + 5, y_mid, x2 + (y2 - y1), y_mid, ms=500)
6666
await asyncio.sleep_ms(100)
6767

68-
return _all_btns
68+
await display.screenshot("final")
69+
return _all_objs
6970

7071

7172
__file__ = globals().get("__file__", "test")
@@ -78,5 +79,5 @@ def button_cb(event, name, slider):
7879
except Exception:
7980
display_config = testrunner.display_config
8081

81-
testrunner.run(demo, __file__, disp_config=display_config)
82+
testrunner.run(sliders, __file__, disp_config=display_config)
8283
testrunner.devicereset()

tests/testdisplay.py

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,10 @@ def _read_cb(self, indev, data):
171171
print(f"[RELEASED]: ({self._x},{self._y})")
172172
data.state = self._dstate
173173

174+
def screenshot(self, name="screenshot"):
175+
if hasattr(self.display_drv, "screenshot"):
176+
return self.display_drv.screenshot(name)
177+
174178

175179
class DummyDisplay:
176180
def __init__(self, width=240, height=320, color_format=lv.COLOR_FORMAT.RGB565):
@@ -182,8 +186,11 @@ def __init__(self, width=240, height=320, color_format=lv.COLOR_FORMAT.RGB565):
182186
self.test_name = "testframe"
183187
self._header_set = False
184188
self._save_frame = sys.platform in ["darwin", "linux"]
189+
# TODO use framebuf for snapshot
185190
self._debug = True
186-
self._pbuff = bytearray(self.color_size)
191+
if self._save_frame:
192+
self._pbuff = bytearray(self.color_size)
193+
self._save_frame = False
187194

188195
@property
189196
def debug(self):
@@ -216,7 +223,27 @@ def save_frame(self, data, w, h):
216223
pi += self.color_size
217224
except Exception:
218225
print(pi)
219-
# fr.write(data)
226+
227+
async def screenshot(self, name="screenshot"):
228+
_debug = self._debug
229+
self._debug = False
230+
self._save_frame = False
231+
232+
# Reset
233+
self._rst_scr = lv.obj()
234+
c_scr = lv.screen_active()
235+
lv.screen_load(self._rst_scr)
236+
await asyncio.sleep_ms(100)
237+
238+
# Load test screen
239+
self._save_frame = sys.platform in ["darwin", "linux"]
240+
self._header_set = False
241+
self.test_name = f"{self.test_name}@{name}"
242+
lv.screen_load(c_scr)
243+
await asyncio.sleep_ms(100)
244+
245+
self._debug = _debug
246+
self._save_frame = sys.platform in ["darwin", "linux"]
220247

221248
def _shasum_frame(self, data):
222249
_hash = hashlib.sha256()
@@ -276,13 +303,13 @@ def get_display(
276303
if sys.platform not in ["darwin", "linux"]:
277304
sys.print_exception(e)
278305
assert hasattr(disp, "width") is True, "expected width attribute in display driver"
279-
assert hasattr(disp, "height") is True, (
280-
"expected height attribute in display driver"
281-
)
306+
assert (
307+
hasattr(disp, "height") is True
308+
), "expected height attribute in display driver"
282309

283-
assert hasattr(disp, "color_depth") is True, (
284-
"expected color_depth attribute in display driver"
285-
)
310+
assert (
311+
hasattr(disp, "color_depth") is True
312+
), "expected color_depth attribute in display driver"
286313

287314
alloc_buffer = lambda buffersize: memoryview(bytearray(buffer_size))
288315

0 commit comments

Comments
 (0)