/ test / src / testing / __init__.py
__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()