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