| Index: README.md | 
| diff --git a/README.md b/README.md | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..f9ff2f96a748421b70485c90d598389bc693d3bf | 
| --- /dev/null | 
| +++ b/README.md | 
| @@ -0,0 +1,141 @@ | 
| +Support for writing unit tests in Dart. | 
| + | 
| +**See also:** | 
| +[Unit Testing with Dart] | 
| +(http://www.dartlang.org/articles/dart-unit-tests/) | 
| + | 
| +##Concepts | 
| + | 
| + * __Tests__: Tests are specified via the top-level function [test], they can be | 
| +   organized together using [group]. | 
| + | 
| + * __Checks__: Test expectations can be specified via [expect] | 
| + | 
| + * __Matchers__: [expect] assertions are written declaratively using the | 
| +   [Matcher] class. | 
| + | 
| + * __Configuration__: The framework can be adapted by setting | 
| +   [unittestConfiguration] with a [Configuration]. See the other libraries | 
| +   in the `unittest` package for alternative implementations of | 
| +   [Configuration] including `compact_vm_config.dart`, `html_config.dart` | 
| +   and `html_enhanced_config.dart`. | 
| + | 
| +##Examples | 
| + | 
| +A trivial test: | 
| + | 
| +```dart | 
| +import 'package:unittest/unittest.dart'; | 
| + | 
| +void main() { | 
| +  test('this is a test', () { | 
| +    int x = 2 + 3; | 
| +    expect(x, equals(5)); | 
| +  }); | 
| +} | 
| +``` | 
| + | 
| +Multiple tests: | 
| + | 
| +```dart | 
| +import 'package:unittest/unittest.dart'; | 
| + | 
| +void main() { | 
| +  test('this is a test', () { | 
| +    int x = 2 + 3; | 
| +    expect(x, equals(5)); | 
| +  }); | 
| +  test('this is another test', () { | 
| +    int x = 2 + 3; | 
| +    expect(x, equals(5)); | 
| +  }); | 
| +} | 
| +``` | 
| + | 
| +Multiple tests, grouped by category: | 
| + | 
| +```dart | 
| +import 'package:unittest/unittest.dart'; | 
| + | 
| +void main() { | 
| +  group('group A', () { | 
| +    test('test A.1', () { | 
| +      int x = 2 + 3; | 
| +      expect(x, equals(5)); | 
| +    }); | 
| +    test('test A.2', () { | 
| +      int x = 2 + 3; | 
| +      expect(x, equals(5)); | 
| +    }); | 
| +  }); | 
| +  group('group B', () { | 
| +    test('this B.1', () { | 
| +      int x = 2 + 3; | 
| +      expect(x, equals(5)); | 
| +    }); | 
| +  }); | 
| +} | 
| +``` | 
| + | 
| +Asynchronous tests: if callbacks expect between 0 and 6 positional | 
| +arguments, [expectAsync] will wrap a function into a new callback and will | 
| +not consider the test complete until that callback is run. A count argument | 
| +can be provided to specify the number of times the callback should be called | 
| +(the default is 1). | 
| + | 
| +```dart | 
| +import 'dart:async'; | 
| +import 'package:unittest/unittest.dart'; | 
| + | 
| +void main() { | 
| +  test('callback is executed once', () { | 
| +    // wrap the callback of an asynchronous call with [expectAsync] if | 
| +    // the callback takes 0 arguments... | 
| +    Timer.run(expectAsync(() { | 
| +      int x = 2 + 3; | 
| +      expect(x, equals(5)); | 
| +    })); | 
| +  }); | 
| + | 
| +  test('callback is executed twice', () { | 
| +    var callback = expectAsync(() { | 
| +      int x = 2 + 3; | 
| +      expect(x, equals(5)); | 
| +    }, count: 2); // <-- we can indicate multiplicity to [expectAsync] | 
| +    Timer.run(callback); | 
| +    Timer.run(callback); | 
| +  }); | 
| +} | 
| +``` | 
| + | 
| +There may be times when the number of times a callback should be called is | 
| +non-deterministic. In this case a dummy callback can be created with | 
| +expectAsync((){}) and this can be called from the real callback when it is | 
| +finally complete. | 
| + | 
| +A variation on this is [expectAsyncUntil], which takes a callback as the | 
| +first parameter and a predicate function as the second parameter. After each | 
| +time the callback is called, the predicate function will be called. If it | 
| +returns `false` the test will still be considered incomplete. | 
| + | 
| +Test functions can return [Future]s, which provide another way of doing | 
| +asynchronous tests. The test framework will handle exceptions thrown by | 
| +the Future, and will advance to the next test when the Future is complete. | 
| + | 
| +```dart | 
| +import 'dart:async'; | 
| +import 'package:unittest/unittest.dart'; | 
| + | 
| +void main() { | 
| +  test('test that time has passed', () { | 
| +    var duration = const Duration(milliseconds: 200); | 
| +    var time = new DateTime.now(); | 
| + | 
| +    return new Future.delayed(duration).then((_) { | 
| +      var delta = new DateTime.now().difference(time); | 
| + | 
| +      expect(delta, greaterThanOrEqualTo(duration)); | 
| +    }); | 
| +  }); | 
| +} | 
| +``` | 
|  |