// Copyright (c) 2012, 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.
// Dart test program for testing named parameters.

// @dart = 2.9

import "package:expect/expect.dart";

class NamedParametersTest {
  static int F00() {
    return 0;
  }

  int f11() {
    return 0;
  }

  static int F11(int a) {
    return a;
  }

  int f22(int a) {
    return a;
  }

  static int F10([int b = 20]) {
    return b;
  }

  int f21([int b = 20]) {
    return b;
  }

  static int F21(int a, [int b = 20]) {
    return 100 * a + b;
  }

  int f32(int a, [int b = 20]) {
    return 100 * a + b;
  }

  static int F31(int a, [int b = 20, int c = 30]) {
    return 100 * (100 * a + b) + c;
  }

  int f42(int a, [int b = 20, int c = 30]) {
    return 100 * (100 * a + b) + c;
  }

  static int F41(int a, [int b = 20, int c, int d = 40]) {
    return 100 * (100 * (100 * a + b) + (c == null ? 0 : c)) + d;
  }

  int f52(int a, [int b = 20, int c, int d = 40]) {
    return 100 * (100 * (100 * a + b) + (c == null ? 0 : c)) + d;
  }

  static testMain() {
    NamedParametersTest np = new NamedParametersTest();
    Expect.equals(0, F00());
    Expect.equals(0, np.f11());
    Expect.equals(10, F11(10));
    Expect.equals(10, np.f22(10));
    Expect.equals(20, F10());
    Expect.equals(20, np.f21());
    Expect.equals(20, F10(20));
    Expect.equals(20, np.f21(20));
    Expect.equals(20, F10(b:20));
    //                    ^
    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_NAMED_PARAMETER
    // [cfe] No named parameter with the name 'b'.
    Expect.equals(20, np.f21(b:20));
    //                       ^
    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_NAMED_PARAMETER
    // [cfe] No named parameter with the name 'b'.
    Expect.equals(1020, F21(10));
    Expect.equals(1020, np.f32(10));
    Expect.equals(1025, F21(10, 25));
    Expect.equals(1025, np.f32(10, 25));
    Expect.equals(1025, F21(10, b:25));
    //                          ^
    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_NAMED_PARAMETER
    // [cfe] No named parameter with the name 'b'.
    Expect.equals(1025, np.f32(10, b:25));
    //                             ^
    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_NAMED_PARAMETER
    // [cfe] No named parameter with the name 'b'.
    Expect.equals(102030, F31(10));
    Expect.equals(102030, np.f42(10));
    Expect.equals(102530, F31(10, 25));
    Expect.equals(102530, np.f42(10, 25));
    Expect.equals(102035, F31(10, c:35));
    //                            ^
    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_NAMED_PARAMETER
    // [cfe] No named parameter with the name 'c'.
    Expect.equals(102035, np.f42(10, c:35));
    //                               ^
    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_NAMED_PARAMETER
    // [cfe] No named parameter with the name 'c'.
    Expect.equals(102535, F31(10, 25, 35));
    Expect.equals(102535, np.f42(10, 25, 35));
    Expect.equals(102535, F31(10, 25, c:35));
    //                                ^
    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_NAMED_PARAMETER
    // [cfe] No named parameter with the name 'c'.
    Expect.equals(102535, np.f42(10, 25, c:35));
    //                                   ^
    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_NAMED_PARAMETER
    // [cfe] No named parameter with the name 'c'.
    Expect.equals(10200040, F41(10));
    Expect.equals(10200040, np.f52(10));
    Expect.equals(10203540, F41(10, c:35));
    //                              ^
    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_NAMED_PARAMETER
    // [cfe] No named parameter with the name 'c'.
    Expect.equals(10203540, np.f52(10, c:35));
    //                                 ^
    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_NAMED_PARAMETER
    // [cfe] No named parameter with the name 'c'.
  }
}

abstract class I {
  factory I() = C;
  int mul(int a, [int factor]);
}

class C implements I {
  int mul(int a, [int factor = 10]) {
    return a * factor;
  }
}

hello(msg, to, {from}) => '${from} sent ${msg} to ${to}';
message() => hello("gladiolas", "possums", from: "Edna");

main() {
  NamedParametersTest.testMain();
  var i = new I();
  Expect.equals(100, i.mul(10));
  Expect.equals(1000, i.mul(10, 100));
  var c = new C();
  Expect.equals(100, c.mul(10));
  Expect.equals(1000, c.mul(10, 100));
  Expect.equals("Edna sent gladiolas to possums", message());
}
