class Test::Unit::UI::TestRunnerMediator

hopefully making it easy to write new UIs.
Provides an interface to write any given UI against,

def create_result

one wants to use a different result.
should run with. Can be overridden by subclasses if
A factory method to create the result the mediator
def create_result
  TestResult.new
end

def initialize(suite, options={})

the passed suite.
Creates a new TestRunnerMediator initialized to run
def initialize(suite, options={})
  @suite = suite
  @options = options
  @test_suite_runner_class = @options[:test_suite_runner_class]
  @test_suite_runner_class ||= TestSuiteRunner
end

def measure_time

def measure_time
  begin_time = Time.now
  yield
  Time.now - begin_time
end

def run

with.
Runs the suite the TestRunnerMediator was created
def run
  AutoRunner.need_auto_run = false
  result = create_result
  Test::Unit.run_at_start_hooks
  start_time = Time.now
  begin
    with_listener(result) do
      @test_suite_runner_class.run_all_tests do |run_context|
        catch do |stop_tag|
          result.stop_tag = stop_tag
          notify_listeners(RESET, @suite.size)
          notify_listeners(STARTED, result)
          run_suite(result, run_context)
        end
      end
    end
  ensure
    elapsed_time = Time.now - start_time
    notify_listeners(FINISHED, elapsed_time)
  end
  Test::Unit.run_at_exit_hooks
  result
end

def run_suite(result=nil, run_context=nil)

https://github.com/test-unit/test-unit/issues/38
See GitHub#38

should use runner change public API.
NetBeans should not use monkey patching. NetBeans
Just for backward compatibility for NetBeans.
def run_suite(result=nil, run_context=nil)
  if result.nil?
    run
  else
    @suite.run(result, run_context: run_context) do |channel, value|
      notify_listeners(channel, value)
    end
  end
end

def with_listener(result)

def with_listener(result)
  finished_listener = result.add_listener(TestResult::FINISHED) do |*args|
    notify_listeners(TestResult::FINISHED, *args)
  end
  changed_listener = result.add_listener(TestResult::CHANGED) do |*args|
    notify_listeners(TestResult::CHANGED, *args)
  end
  pass_assertion_listener = result.add_listener(TestResult::PASS_ASSERTION) do |*args|
    notify_listeners(TestResult::PASS_ASSERTION, *args)
  end
  fault_listener = result.add_listener(TestResult::FAULT) do |*args|
    notify_listeners(TestResult::FAULT, *args)
  end
  begin
    yield
  ensure
    result.remove_listener(TestResult::FAULT, fault_listener)
    result.remove_listener(TestResult::CHANGED, changed_listener)
    result.remove_listener(TestResult::FINISHED, finished_listener)
    result.remove_listener(TestResult::PASS_ASSERTION,
                           pass_assertion_listener)
  end
end