Index: test/codegen/lib/mirrors/instantiate_abstract_class_test.dart |
diff --git a/test/codegen/lib/mirrors/instantiate_abstract_class_test.dart b/test/codegen/lib/mirrors/instantiate_abstract_class_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e86e534534c90bc09a43301646cc6e2cc00eca38 |
--- /dev/null |
+++ b/test/codegen/lib/mirrors/instantiate_abstract_class_test.dart |
@@ -0,0 +1,46 @@ |
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library test.instantiate_abstract_class; |
+ |
+import 'dart:mirrors'; |
+import 'package:expect/expect.dart'; |
+ |
+ |
+assertInstanitationErrorOnGenerativeConstructors(classMirror) { |
+ classMirror.declarations.values.forEach((decl) { |
+ if (decl is! MethodMirror) return; |
+ if (!decl.isGenerativeConstructor) return; |
+ var args = new List(decl.parameters.length); |
+ Expect.throws(() => classMirror.newInstance(decl.constructorName, args), |
+ (e) => e is AbstractClassInstantiationError, |
+ '${decl.qualifiedName} should have failed'); |
+ }); |
+} |
+ |
+runFactoryConstructors(classMirror) { |
+ classMirror.declarations.values.forEach((decl) { |
+ if (decl is! MethodMirror) return; |
+ if (!decl.isFactoryConstructor) return; |
+ var args = new List(decl.parameters.length); |
+ classMirror.newInstance(decl.constructorName, args); // Should not throw. |
+ }); |
+} |
+ |
+abstract class AbstractClass { |
+ AbstractClass(); |
+ AbstractClass.named(); |
+ factory AbstractClass.named2() => new ConcreteClass(); |
+} |
+ |
+class ConcreteClass implements AbstractClass {} |
+ |
+main() { |
+ assertInstanitationErrorOnGenerativeConstructors(reflectType(num)); |
+ assertInstanitationErrorOnGenerativeConstructors(reflectType(double)); |
+ assertInstanitationErrorOnGenerativeConstructors(reflectType(StackTrace)); |
+ |
+ assertInstanitationErrorOnGenerativeConstructors(reflectType(AbstractClass)); |
+ runFactoryConstructors(reflectType(AbstractClass)); |
+} |