// Copyright (c) 2021, 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.

// Check that placing a named argument anywhere in the argument list works for
// all kinds of invocations.

import "package:expect/expect.dart";

List<Object?> arguments = [];

X evaluate<X>(X x) {
  arguments.add(x);
  return x;
}

void runAndCheckEvaluationOrder(
    List<Object?> expectedArguments, void Function() functionToRun) {
  arguments.clear();
  functionToRun();
  Expect.listEquals(expectedArguments, arguments);
}

class A {
  A(int x, String y, {bool z = false, required double w}) {
    Expect.equals(1, x);
    Expect.equals("2", y);
    Expect.isFalse(z);
    Expect.equals(3.14, w);
  }

  A.redir1()
      : this(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));

  A.redir2()
      : this(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));

  A.redir3()
      : this(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));

  A.redir4()
      : this(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));

  A.redir5()
      : this(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));

  A.redir6() : this(evaluate(1), w: evaluate(3.14), evaluate("2"));

  factory A.foo(int x, String y, {bool z = false, required double w}) {
    Expect.equals(1, x);
    Expect.equals("2", y);
    Expect.isFalse(z);
    Expect.equals(3.14, w);
    return A(x, y, z: z, w: w);
  }

  factory A.redirFactory(int x, String y, {bool z, required double w}) = A;

  void Function(int x, String y, {bool z, required double w}) get property {
    return A.foo;
  }

  void bar(int x, String y, {bool z = false, required double w}) {
    Expect.equals(1, x);
    Expect.equals("2", y);
    Expect.isFalse(z);
    Expect.equals(3.14, w);
  }

  void call(int x, String y, {bool z = false, required double w}) {
    Expect.equals(1, x);
    Expect.equals("2", y);
    Expect.isFalse(z);
    Expect.equals(3.14, w);
  }
}

typedef B = A;

foo(int x, String y, {bool z = false, required double w}) {
  Expect.equals(1, x);
  Expect.equals("2", y);
  Expect.isFalse(z);
  Expect.equals(3.14, w);
}

test(dynamic d, Function f, A a) {
  void local(int x, String y, {bool z = false, required double w}) {
    Expect.equals(1, x);
    Expect.equals("2", y);
    Expect.isFalse(z);
    Expect.equals(3.14, w);
  }

  // StaticInvocation.
  runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
    foo(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
    foo(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
    foo(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
    foo(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
    foo(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2"], () {
    foo(evaluate(1), w: evaluate(3.14), evaluate("2"));
  });

  // FactoryConstructorInvocation.
  runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
    A.foo(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
    A.foo(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
    A.foo(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
    B.foo(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
    B.foo(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
    B.foo(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
    B.foo(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
    B.foo(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2"], () {
    B.foo(evaluate(1), w: evaluate(3.14), evaluate("2"));
  });

  // ConstructorInvocation.
  runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
    A(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
    A(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
    A(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
    B(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
    B(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
    B(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
    B(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
    B(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2"], () {
    B(evaluate(1), w: evaluate(3.14), evaluate("2"));
  });

  // DynamicInvocation.
  runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
    d(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
    d(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
    d(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
    d(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
    d(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2"], () {
    d(evaluate(1), w: evaluate(3.14), evaluate("2"));
  });

  // FunctionInvocation.
  runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
    f(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
    f(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
    f(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
    f(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
    f(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2"], () {
    f(evaluate(1), w: evaluate(3.14), evaluate("2"));
  });

  // InstanceGetterInvocation.
  runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
    a.property(evaluate(1), evaluate("2"),
        z: evaluate(false), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
    a.property(evaluate(1),
        z: evaluate(false), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
    a.property(
        z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
    a.property(
        w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
    a.property(evaluate(1),
        w: evaluate(3.14), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2"], () {
    a.property(evaluate(1), w: evaluate(3.14), evaluate("2"));
  });

  // InstanceInvocation.
  runAndCheckEvaluationOrder([a, 1, "2", false, 3.14], () {
    evaluate(a)
        .bar(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([a, 1, false, "2", 3.14], () {
    evaluate(a)
        .bar(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([a, false, 1, "2", 3.14], () {
    evaluate(a)
        .bar(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([a, 3.14, 1, "2", false], () {
    evaluate(a)
        .bar(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([a, 1, 3.14, "2", false], () {
    evaluate(a)
        .bar(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([a, 1, 3.14, "2"], () {
    evaluate(a).bar(evaluate(1), w: evaluate(3.14), evaluate("2"));
  });

  // LocalFunctionInvocation.
  runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
    local(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
    local(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
    local(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
    local(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
    local(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2"], () {
    local(evaluate(1), w: evaluate(3.14), evaluate("2"));
  });

  // Redirecting generative constructors.
  runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
    A.redir1();
  });
  runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
    A.redir2();
  });
  runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
    A.redir3();
  });
  runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
    A.redir4();
  });
  runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
    A.redir5();
  });
  runAndCheckEvaluationOrder([1, 3.14, "2"], () {
    A.redir6();
  });

  // Redirecting factory constructors.
  runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
    A.redirFactory(evaluate(1), evaluate("2"),
        z: evaluate(false), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
    A.redirFactory(evaluate(1),
        z: evaluate(false), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
    A.redirFactory(
        z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
    A.redirFactory(
        w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
    A.redirFactory(evaluate(1),
        w: evaluate(3.14), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2"], () {
    A.redirFactory(evaluate(1), w: evaluate(3.14), evaluate("2"));
  });

  // Constructor super initializers.
  runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
    Test.super1();
  });
  runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
    Test.super2();
  });
  runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
    Test.super3();
  });
  runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
    Test.super4();
  });
  runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
    Test.super5();
  });
  runAndCheckEvaluationOrder([1, 3.14, "2"], () {
    Test.super6();
  });

  // Implicit .call insertion.
  runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
    a(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
    a(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
    a(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
  });
  runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
    a(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
    a(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
  });
  runAndCheckEvaluationOrder([1, 3.14, "2"], () {
    a(evaluate(1), w: evaluate(3.14), evaluate("2"));
  });
}

class Test extends A {
  Test() : super(1, "2", z: false, w: 3.14);

  Test.super1()
      : super(evaluate(1), evaluate("2"),
            z: evaluate(false), w: evaluate(3.14));
  Test.super2()
      : super(evaluate(1),
            z: evaluate(false), evaluate("2"), w: evaluate(3.14));
  Test.super3()
      : super(
            z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
  Test.super4()
      : super(
            w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
  Test.super5()
      : super(evaluate(1),
            w: evaluate(3.14), evaluate("2"), z: evaluate(false));
  Test.super6() : super(evaluate(1), w: evaluate(3.14), evaluate("2"));

  test() {
    runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
      super.bar(evaluate(1), evaluate("2"),
          z: evaluate(false), w: evaluate(3.14));
    });
    runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
      super.bar(evaluate(1),
          z: evaluate(false), evaluate("2"), w: evaluate(3.14));
    });
    runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
      super.bar(
          z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
    });
    runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
      super.bar(
          w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
    });
    runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
      super.bar(evaluate(1),
          w: evaluate(3.14), evaluate("2"), z: evaluate(false));
    });
    runAndCheckEvaluationOrder([1, 3.14, "2"], () {
      super.bar(evaluate(1), w: evaluate(3.14), evaluate("2"));
    });

    // Using super.call() implicitly.
    runAndCheckEvaluationOrder([1, "2", false, 3.14], () {
      super(evaluate(1), evaluate("2"), z: evaluate(false), w: evaluate(3.14));
    });
    runAndCheckEvaluationOrder([1, false, "2", 3.14], () {
      super(evaluate(1), z: evaluate(false), evaluate("2"), w: evaluate(3.14));
    });
    runAndCheckEvaluationOrder([false, 1, "2", 3.14], () {
      super(z: evaluate(false), evaluate(1), evaluate("2"), w: evaluate(3.14));
    });
    runAndCheckEvaluationOrder([3.14, 1, "2", false], () {
      super(w: evaluate(3.14), evaluate(1), evaluate("2"), z: evaluate(false));
    });
    runAndCheckEvaluationOrder([1, 3.14, "2", false], () {
      super(evaluate(1), w: evaluate(3.14), evaluate("2"), z: evaluate(false));
    });
    runAndCheckEvaluationOrder([1, 3.14, "2"], () {
      super(evaluate(1), w: evaluate(3.14), evaluate("2"));
    });
  }
}

extension E on A {
  test() {
    runAndCheckEvaluationOrder(["1", 2], () {
      method(foo: evaluate("1"), evaluate(2)); // This call.
    });
  }

  method(int bar, {String? foo}) {
    Expect.equals(2, bar);
    Expect.equals("1", foo);
  }
}

main() {
  A a = A(1, "2", z: false, w: 3.14);

  test(A.foo, A.foo, a);
  Test().test();
  a.test();
}
