1 # mitigate heap fragmentation issues by pre-loading major libraries
8 def yes_no(q, default=True):
9 a = input(q + " (Y/n)?" if default else " (y/N)?")
19 def multi_choice(q, choices, defaultPos=None):
20 if defaultPos is not None:
21 print("{} [{}]?".format(q, defaultPos))
24 for pos, choice in enumerate(choices):
25 print("{}) {}".format(pos, choice))
34 except Exception as e:
38 def await_true(name, fun, interval=0, patience=60):
39 from adafruit_blinka.agnostic import sleep
40 from utime import ticks_ms, ticks_add, ticks_diff
41 print("Waiting {} sec until {} (CTRL+C give up)".format(patience, name))
42 deadline = ticks_add(ticks_ms(), int(patience * 1000))
44 while ticks_diff(deadline, ticks_ms()) > 0:
50 except KeyboardInterrupt:
54 def test_module(module, runner=None):
57 runner = unittest.TestRunner()
58 suite = unittest.TestSuite()
59 for key in dir(module):
60 val = getattr(module, key)
62 if issubclass(val, unittest.TestCase):
66 return runner.run(suite)
68 def test_module_name(absolute, runner=None):
70 print("Suite begin: {}".format(absolute))
71 module=__import__(absolute)
72 relatives = absolute.split(".")
73 if len(relatives) > 1:
74 for relative in relatives[1:]:
75 module = getattr(module, relative)
76 return test_module(module, runner)
78 print("Suite end: {}".format(absolute))
80 def test_interactive(*module_names):
81 for module_name in module_names:
82 if yes_no("Run suite {}".format(module_name)):
84 test_module_name(module_name)
87 def test_prepare(casetype):
94 moduleNames = ["testing.implementation.universal.digitalio",]
95 if agnostic.implementation == "micropython":
96 moduleNames.extend([ "testing.implementation.micropython.digitalio",])
99 moduleNames = ["testing.implementation.universal.bitbangio"]
101 unittest.raiseException = True # terminates with stack information on userspace Exception
102 unittest.raiseBaseException = True # terminates with stack information on system Exception
103 test_interactive(*moduleNames)