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