]> Repositories - Adafruit_Blinka-hackapet.git/blob - test/src/testing/__init__.py
Agnostic now a package. Interactive testing now relies on monotonic. time now under...
[Adafruit_Blinka-hackapet.git] / test / src / testing / __init__.py
1 # mitigate heap fragmentation issues by pre-loading major libraries
2 import gc
3 gc.collect()
4 gc.collect()
5 import unittest
6 gc.collect()
7
8 def yes_no(q, default=True):
9     a = input(q + " (Y/n)?" if default else " (y/N)?")
10     a=a.lower()
11     if a == '':
12         return default
13     elif a == "n":
14         a = False
15     elif a == "y":
16         a = True
17     return a
18
19 def multi_choice(q, choices, defaultPos=None):
20     if defaultPos is not None:
21         print("{} [{}]?".format(q, defaultPos))
22     else:
23         print(q + "?")
24     for pos, choice in enumerate(choices):
25         print("{}) {}".format(pos, choice))
26     a = input()
27     a=a.lower()
28     try:
29         if a == '':
30             a = defaultPos
31         else:
32             a = int(a)
33         return choices[a]
34     except Exception as e:
35         print(e)
36         return None
37
38 def await_true(name, fun, interval=0, patience=60):
39     from adafruit_blinka.agnostic.time import sleep, monotonic
40     print("Waiting {} sec until {} (CTRL+C give up)".format(patience, name))
41
42     deadline =  monotonic() + patience
43     try:
44         while deadline - monotonic() > 0:
45             if fun():
46                 return True
47             else:
48                 sleep(interval)
49         return False
50     except KeyboardInterrupt:
51         return False
52
53
54 def test_module(module, runner=None):
55     import unittest
56     if runner is None:
57         runner = unittest.TestRunner()
58     suite = unittest.TestSuite()
59     for key in dir(module):
60         val = getattr(module, key)
61         try:
62             if issubclass(val, unittest.TestCase):
63                 suite.addTest(val)
64         except:
65             pass
66     return runner.run(suite)
67
68 def test_module_name(absolute, runner=None):
69     try:
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)
77     finally:
78         print("Suite end: {}".format(absolute))
79
80 def test_interactive(*module_names):
81     for module_name in module_names:
82         if yes_no("Run suite {}".format(module_name)):
83             gc.collect()
84             test_module_name(module_name)
85
86
87 def test_prepare(casetype):
88     case = casetype()
89     case.setUp()
90
91
92 def main():
93     """
94     moduleNames = ["testing.implementation.universal.digitalio",]
95     if agnostic.implementation == "micropython":
96         moduleNames.extend([ "testing.implementation.micropython.digitalio",])
97
98     """
99     moduleNames = ["testing.implementation.universal.bitbangio"]
100
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)
104
105 gc.collect()