// 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 {} class NamedGeneric {} 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 on UnnamedGeneric? { String get name => str("unnamed generic", this); List get list => []; } extension NamedGenericExt on NamedGeneric? { String get name => str("named generic", this); List get list => []; } extension General on Object? { String get generalName => str("general", this); } extension GeneralGeneric on T { String get generalGenericName => str("general generic", this); List get generalList => []; } 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>(unnamed.generalList); Expect.type>(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>(named.generalList); Expect.type>(namedNull.generalList); // Unnamed Generic. UnnamedGeneric unnamedGeneric = UnnamedGeneric(); UnnamedGeneric? unnamedGenericNull = null; Expect.equals("unnamed generic(non-null)", unnamedGeneric.name); Expect.equals("unnamed generic(null)", unnamedGenericNull.name); Expect.type>(unnamedGeneric.list); Expect.notType>(unnamedGeneric.list); Expect.type>(unnamedGenericNull.list); Expect.notType>(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>>(unnamedGeneric.generalList); Expect.type?>>(unnamedGenericNull.generalList); // Named Generic. NamedGeneric namedGeneric = NamedGeneric(); NamedGeneric? namedGenericNull = null; Expect.equals("named generic(non-null)", namedGeneric.name); Expect.equals("named generic(null)", namedGenericNull.name); Expect.type>(namedGeneric.list); Expect.notType>(namedGeneric.list); Expect.type>(namedGenericNull.list); Expect.notType>(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>>(namedGeneric.generalList); Expect.type?>>(namedGenericNull.generalList); }