trait UnitTest
  """
  Each unit test class must provide this trait. Simple tests only need to
  define the name() and apply() functions. The remaining functions specify
  additional test options.
  """

  fun name(): String
    """
    Report the test name, which is used when printing test results and on the
    command line to select tests to run.
    """

  fun exclusion_group(): String =>
    """
    Report the test exclusion group, returning an empty string for none.
    The default body returns an empty string.
    """
    ""

  fun ref apply(h: TestHelper) ?
    """
    Run the test.
    Raising an error is interpreted as a test failure.
    """

  fun ref timed_out(h: TestHelper) =>
    """
    Tear down a possibly hanging test.
    Called when the timeout specified by to long_test() expires.
    There is no need for this function to call complete(false).
    tear_down() will still be called after this completes.
    The default is to do nothing.
    """
    None

  fun ref tear_down(h: TestHelper) =>
    """
    Tidy up after the test has completed.
    Called for each run test, whether that test passed, succeeded or timed out.
    The default is to do nothing.
    """
    None

  fun label(): String =>
    """
    Report the test label, returning an empty string for none.
    It can be later use to filter tests which we want to run, by labels.
    """
    ""