anchor.diff:  import 'dart:isolate';
   import 'dart:async';
   import 'package:unittest/unittest.dart';
  -
  -var tests; // array of test names
  -var expected; // array of test expected results (from buildStatusString)
  -var actual; // actual test results (from buildStatusString in config.onDone)
   
   Future _defer(void fn()) {
     return new Future.of(fn);
  
positive.code:   });
  }
  
  void nextTest(int testNum) {
    SendPort sport = spawnFunction(runTest);
    sport.call(tests[testNum]).then((msg) {
      actual.add(msg);
      if (actual.length == expected.length) {
        for (var i = 0; i < tests.length; i++) {
          test(tests[i], () => expect(actual[i].trim(), equals(expected[i])));
        }
      } else {
        nextTest(testNum+1);
      }
    });
  }
  
  main() {
    tests = [
      'single correct test',
      'single failing test',
      'exception test',
      'group name test',
      'setup test',
      'teardown test',
      'setup and teardown test',
      'correct callback test',
      'excess callback test',
      'completion test',
      'async exception test',
      'late exception test',
      'middle exception test',
      'async setup/teardown test',
      'test returning future',
      'test returning future using Timer',
      'testCases immutable'
    ];
  
    expected = [
      buildStatusString(1, 0, 0, tests[0]),
      buildStatusString(0, 1, 0, tests[1],
          message: 'Expected: <5> but: was <4>.'),
      buildStatusString(0, 1, 0, tests[2], message: 'Caught Exception: Fail.'),
      buildStatusString(2, 0, 0, 'a a::a b b'),
      buildStatusString(1, 0, 0, 'a ${tests[4]}', count: 0, setup: 'setup'),
      buildStatusString(1, 0, 0, 'a ${tests[5]}', count: 0, setup: '',
          teardown: 'teardown'),
      buildStatusString(1, 0, 0, 'a ${tests[6]}', count: 0,
          setup: 'setup', teardown: 'teardown'),
      buildStatusString(1, 0, 0, tests[7], count: 1),
      buildStatusString(0, 1, 0, tests[8], count: 1,
          message: 'Callback called more times than expected (1).'),
      buildStatusString(1, 0, 0, tests[9], count: 10),
      buildStatusString(0, 1, 0, tests[10], message: 'Caught error!'),
      buildStatusString(1, 0, 1, 'testOne',
          message: 'Callback called (2) after test case testOne has already '
                   'been marked as pass.:testTwo:'),
      buildStatusString(2, 1, 0,
          'testOne::testTwo:Expected: false but: was <true>.:testThree'),
      buildStatusString(2, 0, 3,
          'good setup/good teardown foo1::'
          'good setup/bad teardown foo2:good setup/bad teardown '
          'foo2: Test teardown failed: Failed to complete tearDown:'
  
negative.code:         'bad setup/bad teardown foo4:bad setup/bad teardown '
          'foo4: Test teardown failed: Failed to complete tearDown:'
          'post groups'),
      'test returning future': buildStatusString(2, 4, 0,
          'successful::'
          'error1:Callback called more times than expected (1).:'
          'fail1:Expected: <false> but: was <true>.:'
          'error2:Callback called more times than expected (1).:'
          'fail2:failure:'
          'foo5'),
      'test returning future using Timer': buildStatusString(2, 4, 0,
          'successful::'
          'fail1:Expected: <false> but: was <true>.:'
          'error1:Callback called more times than expected (1).:'
          'fail2:failure:'
          'error2:Callback called more times than expected (1).:'
          'foo6'),
      'testCases immutable':
          buildStatusString(1, 0, 0, 'testCases immutable'),
    };
  
    tests.forEach((String name, String expected) {
      test(name, () => spawnFunction(runTest)
          .call(name)
          .then((String msg) => expect(msg.trim(), equals(expected))));
      });
  }
  
  