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