| // Copyright (c) 2012, 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. |
| |
| import "package:expect/expect.dart"; |
| |
| class A<T> { |
| A() : x = null; |
| |
| const A.constant(this.x); |
| |
| factory A.factory() { |
| return new B<Set>(); |
| } |
| |
| factory A.test01() = T; /// 01: runtime error |
| |
| factory A.test02() = dynamic; /// 02: runtime error |
| |
| factory A.test03() = Undefined; /// 03: runtime error |
| |
| factory A.test04() = C.test04; /// 04: compile-time error |
| |
| final T x; |
| } |
| |
| class B<T> extends A<T> { |
| B(); |
| |
| factory B.A() = A<T>; |
| |
| const factory B.A_constant(T x) = A<T>.constant; |
| |
| factory B.A_factory() = A<T>.factory; |
| |
| factory B.test04() = A.test04; /// 04: continued |
| |
| factory B.test05(int incompatible) = A<T>.factory; /// 05: runtime error |
| |
| factory B.test05(int incompatible) = A<T>.factory; /// 06: runtime error |
| } |
| |
| class C<K, V> extends B<V> { |
| C(); |
| |
| factory C.A() = A<V>; |
| |
| factory C.A_factory() = A<V>.factory; |
| |
| const factory C.B_constant(V x) = B<V>.A_constant; |
| |
| factory C.test04() = B.test04; /// 04: continued |
| |
| factory C.test06(int incompatible) = B<K>.test05; /// 06: continued |
| |
| const factory C.test07(V x) = B<V>.A; /// 07: compile-time error |
| } |
| |
| main() { |
| new A<List>.test01(); /// 01: continued |
| new A<List>.test02(); /// 02: continued |
| new A<List>.test03(); /// 03: continued |
| new C.test04(); /// 04: continued |
| new B.test05(0); /// 05: continued |
| new C<int, int>.test06(0); /// 06: continued |
| new C<int, int>.test07(0); /// 07: continued |
| Expect.isTrue(new A<List>() is A<List>); |
| Expect.isTrue(new A<bool>.constant(true).x); |
| Expect.isTrue(new A<Set>.factory() is B<Set>); |
| Expect.isTrue(new B<List>.A() is A<List>); /// 08: dynamic type error |
| Expect.isFalse(new B<List>.A() is A<Set>); /// 09: dynamic type error |
| Expect.isTrue(new B<bool>.A_constant(true).x); /// 10: dynamic type error |
| Expect.isTrue(new B<List>.A_factory() is B<Set>); /// 11: dynamic type error |
| Expect.isTrue(new C<String, num>.A() is A<num>); /// 12: dynamic type error |
| Expect.isTrue(new C<String, num>.A_factory() is B<Set>); /// 13: dynamic type error |
| Expect.isTrue(new C<String, bool>.B_constant(true).x); /// 14: dynamic type error |
| } |