]> Repositories - Adafruit_Blinka-hackapet.git/blob - python/testing/__init__.py
led_hardwired flag to skip interactive questioning about wiring LEDs
[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     print("Testing {}".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
78 def test_interactive(*module_names):
79     for module_name in module_names:
80         if yes_no("Run suite {}".format(module_name)):
81             gc.collect()
82             test_module_name(module_name)
83
84
85 def test_prepare(casetype):
86     case = casetype()
87     case.setUp()
88
89
90 def main():
91     import microcontroller.esp8266 # temporary workaround for stack recursion error
92     moduleNames = ["testing.implementation.all.digitalio",]
93     if agnostic.implementation == "micropython":
94         moduleNames.extend([ "testing.implementation.micropython.digitalio",])
95
96     test_interactive(*moduleNames)