blob: f6a6e68dc879246db28bc49db53a2013bbb8e466 [file] [log] [blame]
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);
});
}