__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()