1 # SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
 
   3 # SPDX-License-Identifier: MIT
 
   5 # mitigate heap fragmentation issues by pre-loading major libraries
 
  14 def yes_no(q, default=True):
 
  15     a = input(q + " (Y/n)?" if default else " (y/N)?")
 
  26 def multi_choice(q, choices, defaultPos=None):
 
  27     if defaultPos is not None:
 
  28         print("{} [{}]?".format(q, defaultPos))
 
  31     for pos, choice in enumerate(choices):
 
  32         print("{}) {}".format(pos, choice))
 
  41     except Exception as e:
 
  46 def await_true(name, fun, interval=0, patience=60):
 
  47     from adafruit_blinka.agnostic.time import sleep, monotonic
 
  49     print("Waiting {} sec until {} (CTRL+C give up)".format(patience, name))
 
  51     deadline = monotonic() + patience
 
  53         while deadline - monotonic() > 0:
 
  59     except KeyboardInterrupt:
 
  63 def test_module(module, runner=None):
 
  67         runner = unittest.TestRunner()
 
  68     suite = unittest.TestSuite()
 
  69     for key in dir(module):
 
  70         val = getattr(module, key)
 
  72             if issubclass(val, unittest.TestCase):
 
  76     return runner.run(suite)
 
  79 def test_module_name(absolute, runner=None):
 
  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)
 
  89         print("Suite end: {}".format(absolute))
 
  92 def test_interactive(*module_names):
 
  93     for module_name in module_names:
 
  94         if yes_no("Run suite {}".format(module_name)):
 
  96             test_module_name(module_name)
 
  99 def test_prepare(casetype):
 
 106     moduleNames = ["testing.implementation.universal.digitalio",]
 
 107     if agnostic.implementation == "micropython":
 
 108         moduleNames.extend([ "testing.implementation.micropython.digitalio",])
 
 111     moduleNames = ["testing.implementation.universal.bitbangio"]
 
 113     unittest.raiseException = (
 
 114         True  # terminates with stack information on userspace Exception
 
 116     unittest.raiseBaseException = (
 
 117         True  # terminates with stack information on system Exception
 
 119     test_interactive(*moduleNames)