// 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.

// SharedOptions=--enable-experiment=extension-methods

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);
}
