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)); |
+ }); |
+ }); |
+} |
+``` |