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