1 # mitigate heap fragmentation issues by pre-loading major libraries
 
   8 def yes_no(q, default=True):
 
   9     a = input(q + " (Y/n)?" if default else " (y/N)?")
 
  19 def multi_choice(q, choices, defaultPos=None):
 
  20     if defaultPos is not None:
 
  21         print("{} [{}]?".format(q, defaultPos))
 
  24     for pos, choice in enumerate(choices):
 
  25         print("{}) {}".format(pos, choice))
 
  34     except Exception as e:
 
  38 def await_true(name, fun, interval=0, patience=60):
 
  39     from adafruit_blinka.agnostic import sleep
 
  40     from utime import ticks_ms, ticks_add, ticks_diff
 
  41     print("Waiting {} sec until {} (CTRL+C give up)".format(patience, name))
 
  42     deadline = ticks_add(ticks_ms(), int(patience * 1000))
 
  44         while ticks_diff(deadline, ticks_ms()) > 0:
 
  50     except KeyboardInterrupt:
 
  54 def test_module(module, runner=None):
 
  57         runner = unittest.TestRunner()
 
  58     suite = unittest.TestSuite()
 
  59     for key in dir(module):
 
  60         val = getattr(module, key)
 
  62             if issubclass(val, unittest.TestCase):
 
  66     return runner.run(suite)
 
  68 def test_module_name(absolute, runner=None):
 
  70         print("Suite begin: {}".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)
 
  78         print("Suite end: {}".format(absolute))
 
  80 def test_interactive(*module_names):
 
  81     for module_name in module_names:
 
  82         if yes_no("Run suite {}".format(module_name)):
 
  84             test_module_name(module_name)
 
  87 def test_prepare(casetype):
 
  94     moduleNames = ["testing.implementation.all.digitalio",]
 
  95     if agnostic.implementation == "micropython":
 
  96         moduleNames.extend([ "testing.implementation.micropython.digitalio",])
 
  99     moduleNames = ["testing.implementation.all.bitbangio"]
 
 101     unittest.raiseException = True # terminates with stack information on userspace Exception
 
 102     unittest.raiseBaseException = True # terminates with stack information on system Exception
 
 103     test_interactive(*moduleNames)