1 # mitigate heap fragmentation issues by pre-loading major libraries
10 def yes_no(q, default=True):
11 a = input(q + " (Y/n)?" if default else " (y/N)?")
22 def multi_choice(q, choices, defaultPos=None):
23 if defaultPos is not None:
24 print("{} [{}]?".format(q, defaultPos))
27 for pos, choice in enumerate(choices):
28 print("{}) {}".format(pos, choice))
37 except Exception as e:
42 def await_true(name, fun, interval=0, patience=60):
43 from adafruit_blinka.agnostic.time import sleep, monotonic
45 print("Waiting {} sec until {} (CTRL+C give up)".format(patience, name))
47 deadline = monotonic() + patience
49 while deadline - monotonic() > 0:
55 except KeyboardInterrupt:
59 def test_module(module, runner=None):
63 runner = unittest.TestRunner()
64 suite = unittest.TestSuite()
65 for key in dir(module):
66 val = getattr(module, key)
68 if issubclass(val, unittest.TestCase):
72 return runner.run(suite)
75 def test_module_name(absolute, runner=None):
77 print("Suite begin: {}".format(absolute))
78 module = __import__(absolute)
79 relatives = absolute.split(".")
80 if len(relatives) > 1:
81 for relative in relatives[1:]:
82 module = getattr(module, relative)
83 return test_module(module, runner)
85 print("Suite end: {}".format(absolute))
88 def test_interactive(*module_names):
89 for module_name in module_names:
90 if yes_no("Run suite {}".format(module_name)):
92 test_module_name(module_name)
95 def test_prepare(casetype):
102 moduleNames = ["testing.implementation.universal.digitalio",]
103 if agnostic.implementation == "micropython":
104 moduleNames.extend([ "testing.implementation.micropython.digitalio",])
107 moduleNames = ["testing.implementation.universal.bitbangio"]
109 unittest.raiseException = (
110 True # terminates with stack information on userspace Exception
112 unittest.raiseBaseException = (
113 True # terminates with stack information on system Exception
115 test_interactive(*moduleNames)