// 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)", unnamedGeneric.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);
}
