| library declarative_tests; |
| |
| import 'dart:mirrors'; |
| |
| import 'package:unittest/unittest.dart' show group, test; |
| |
| /// Use [runTest] annotation to indicate that method is a test method. |
| /// Alternatively method name can have the `test` prefix. |
| const runTest = const _RunTest(); |
| |
| class _RunTest { |
| const _RunTest(); |
| } |
| |
| /// Creates a new named group of tests with the name of the given [Type], then |
| /// adds new tests using [addTestMethods]. |
| addTestSuite(Type type) { |
| group(type.toString(), () { |
| addTestMethods(type); |
| }); |
| } |
| |
| /// Creates a new test case for the each static method with the name starting |
| /// with `test` or having the [runTest] annotation. |
| addTestMethods(Type type) { |
| var typeMirror = reflectClass(type); |
| typeMirror.staticMembers.forEach((methodSymbol, method) { |
| if (_isTestMethod(method)) { |
| var methodName = MirrorSystem.getName(methodSymbol); |
| test(methodName, () { |
| typeMirror.invoke(methodSymbol, []); |
| }); |
| } |
| }); |
| } |
| |
| bool _isTestMethod(MethodMirror method) { |
| if (method.parameters.isNotEmpty) { |
| return false; |
| } |
| var methodSymbol = method.simpleName; |
| // name starts with "test" |
| var methodName = MirrorSystem.getName(methodSymbol); |
| if (methodName.startsWith('test')) { |
| return true; |
| } |
| // has @testMethod |
| return method.metadata.any((annotation) { |
| return identical(annotation.reflectee, runTest); |
| }); |
| } |