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