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