// 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.

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