// 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 optional named parameters.

import "package:expect/expect.dart";

class OptionalNamedParametersTest {
  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) ? c : 0)) + d;
  }

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

  static void test() {
    OptionalNamedParametersTest np = new OptionalNamedParametersTest();
    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));
    //                   ^^^^
    // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED
    // [cfe] Too many positional arguments: 0 allowed, but 1 found.
    Expect.equals(20, np.f21(20));
    //                      ^^^^
    // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED
    // [cfe] Too many positional arguments: 0 allowed, but 1 found.
    Expect.equals(20, F10(b: 20));
    Expect.equals(20, np.f21(b: 20));
    Expect.equals(1020, F21(10));
    Expect.equals(1020, np.f32(10));
    Expect.equals(1025, F21(10, 25));
    //                     ^^^^^^^^
    // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED
    // [cfe] Too many positional arguments: 1 allowed, but 2 found.
    Expect.equals(1025, np.f32(10, 25));
    //                        ^^^^^^^^
    // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED
    // [cfe] Too many positional arguments: 1 allowed, but 2 found.
    Expect.equals(1025, F21(10, b: 25));
    Expect.equals(1025, np.f32(10, b: 25));
    Expect.equals(102030, F31(10));
    Expect.equals(102030, np.f42(10));
    Expect.equals(102530, F31(10, 25));
    //                       ^^^^^^^^
    // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED
    // [cfe] Too many positional arguments: 1 allowed, but 2 found.
    Expect.equals(102530, np.f42(10, 25));
    //                          ^^^^^^^^
    // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED
    // [cfe] Too many positional arguments: 1 allowed, but 2 found.
    Expect.equals(102530, F31(10, b: 25));
    Expect.equals(102530, np.f42(10, b: 25));
    Expect.equals(102035, F31(10, c: 35));
    Expect.equals(102035, np.f42(10, c: 35));
    Expect.equals(102535, F31(10, b: 25, c: 35));
    Expect.equals(102535, np.f42(10, b: 25, c: 35));
    Expect.equals(102535, F31(10, 25, c:35));
    //                       ^^^^^^^^^^^^^^
    // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED
    // [cfe] Too many positional arguments: 1 allowed, but 2 found.
    Expect.equals(102535, np.f42(10, 25, c:35));
    //                          ^^^^^^^^^^^^^^
    // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED
    // [cfe] Too many positional arguments: 1 allowed, but 2 found.
    Expect.equals(102535, F31(10, c: 35, b: 25));
    Expect.equals(102535, np.f42(10, c: 35, b: 25));
    Expect.equals(10200040, F41(10));
    Expect.equals(10200040, np.f52(10));
    Expect.equals(10203540, F41(10, c: 35));
    Expect.equals(10203540, np.f52(10, c: 35));
    Expect.equals(10250045, F41(10, d: 45, b: 25));
    Expect.equals(10250045, F41(10, 25, d:45));
    //                         ^^^^^^^^^^^^^^
    // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED
    // [cfe] Too many positional arguments: 1 allowed, but 2 found.
    Expect.equals(10250045, np.f52(10, d: 45, b: 25));
    Expect.equals(10253545, F41(10, d: 45, c: 35, b: 25));
    Expect.equals(10253545, np.f52(10, d: 45, c: 35, b: 25));
  }
}

main() {
  OptionalNamedParametersTest.test();
}
