| // Copyright (c) 2019, 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"; |
| |
| // Tests the syntax of extension methods, and that the extensions are |
| // invocable, and that type variables are bound correctly. |
| |
| // There are no extension *conflicts*. |
| // For each invocation, there is exactly one extension member in scope |
| // which applies. |
| |
| // Target types. |
| class Unnamed {} |
| |
| class Named {} |
| |
| class UnnamedGeneric<T> {} |
| |
| class NamedGeneric<T> {} |
| |
| String str(String name, Object? object) => |
| "$name(${object == null ? "null" : "non-null"})"; |
| |
| // Unnamed local extension. |
| extension on Unnamed? { |
| String get name => str("unnamed", this); |
| } |
| |
| extension NamedExt on Named? { |
| String get name => str("named", this); |
| } |
| |
| extension<T> on UnnamedGeneric<T>? { |
| String get name => str("unnamed generic", this); |
| List<T> get list => <T>[]; |
| } |
| |
| extension NamedGenericExt<T> on NamedGeneric<T>? { |
| String get name => str("named generic", this); |
| List<T> get list => <T>[]; |
| } |
| |
| extension General on Object? { |
| String get generalName => str("general", this); |
| } |
| |
| extension GeneralGeneric<T> on T { |
| String get generalGenericName => str("general generic", this); |
| List<T> get generalList => <T>[]; |
| } |
| |
| main() { |
| // Unnamed. |
| Unnamed unnamed = Unnamed(); |
| Unnamed? unnamedNull = null; |
| |
| Expect.equals("unnamed(non-null)", unnamed.name); |
| Expect.equals("unnamed(null)", unnamedNull.name); |
| |
| Expect.equals("general(non-null)", unnamed.generalName); |
| Expect.equals("general(null)", unnamedNull.generalName); |
| |
| Expect.equals("general generic(non-null)", unnamed.generalGenericName); |
| Expect.equals("general generic(null)", unnamedNull.generalGenericName); |
| Expect.type<List<Unnamed>>(unnamed.generalList); |
| Expect.type<List<Unnamed?>>(unnamedNull.generalList); |
| |
| // Named. |
| Named named = Named(); |
| Named? namedNull = null; |
| |
| Expect.equals("named(non-null)", named.name); |
| Expect.equals("named(null)", namedNull.name); |
| |
| Expect.equals("general(non-null)", named.generalName); |
| Expect.equals("general(null)", namedNull.generalName); |
| |
| Expect.equals("general generic(non-null)", named.generalGenericName); |
| Expect.equals("general generic(null)", namedNull.generalGenericName); |
| Expect.type<List<Named>>(named.generalList); |
| Expect.type<List<Named?>>(namedNull.generalList); |
| |
| // Unnamed Generic. |
| UnnamedGeneric<num> unnamedGeneric = UnnamedGeneric<int>(); |
| UnnamedGeneric<num>? unnamedGenericNull = null; |
| |
| Expect.equals("unnamed generic(non-null)", unnamedGeneric.name); |
| Expect.equals("unnamed generic(null)", unnamedGenericNull.name); |
| Expect.type<List<num>>(unnamedGeneric.list); |
| Expect.notType<List<int>>(unnamedGeneric.list); |
| Expect.type<List<num>>(unnamedGenericNull.list); |
| Expect.notType<List<int>>(unnamedGenericNull.list); |
| |
| Expect.equals("general(non-null)", unnamedGeneric.generalName); |
| Expect.equals("general(null)", unnamedGenericNull.generalName); |
| |
| Expect.equals("general generic(non-null)", unnamedGeneric.generalGenericName); |
| Expect.equals("general generic(null)", unnamedGenericNull.generalGenericName); |
| Expect.type<List<UnnamedGeneric<num>>>(unnamedGeneric.generalList); |
| Expect.type<List<UnnamedGeneric<num>?>>(unnamedGenericNull.generalList); |
| |
| // Named Generic. |
| NamedGeneric<num> namedGeneric = NamedGeneric<int>(); |
| NamedGeneric<num>? namedGenericNull = null; |
| |
| Expect.equals("named generic(non-null)", namedGeneric.name); |
| Expect.equals("named generic(null)", namedGenericNull.name); |
| Expect.type<List<num>>(namedGeneric.list); |
| Expect.notType<List<int>>(namedGeneric.list); |
| Expect.type<List<num>>(namedGenericNull.list); |
| Expect.notType<List<int>>(namedGenericNull.list); |
| |
| Expect.equals("general(non-null)", namedGeneric.generalName); |
| Expect.equals("general(null)", namedGenericNull.generalName); |
| |
| Expect.equals("general generic(non-null)", namedGeneric.generalGenericName); |
| Expect.equals("general generic(null)", namedGenericNull.generalGenericName); |
| Expect.type<List<NamedGeneric<num>>>(namedGeneric.generalList); |
| Expect.type<List<NamedGeneric<num>?>>(namedGenericNull.generalList); |
| } |