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

import "package:expect/expect.dart";

class BadNamedParametersTest {
  int f42(int a, {int b: 20, int c: 30}) {
    return 100 * (100 * a + b) + c;
  }

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

main() {
  BadNamedParametersTest np = new BadNamedParametersTest();

  // Parameter b passed twice.
  np.f42(10, 25, b: 25);
  //    ^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED
  // [cfe] Too many positional arguments: 1 allowed, but 2 found.

  // Parameter x does not exist.
  np.f42(10, 25, x: 99);
  //    ^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED
  // [cfe] Too many positional arguments: 1 allowed, but 2 found.
  //             ^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_NAMED_PARAMETER

  // Parameter b1 does not exist.
  np.f52(10, b: 25, b1: 99, c: 35);
  //                ^^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_NAMED_PARAMETER
  // [cfe] No named parameter with the name 'b1'.

  // Too many parameters.
  np.f42(10, 20, 30, 40);
  //    ^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED
  // [cfe] Too many positional arguments: 1 allowed, but 4 found.

  // Too few parameters.
  np.f42(b: 25);
  //    ^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.NOT_ENOUGH_POSITIONAL_ARGUMENTS
  // [cfe] Too few positional arguments: 1 required, 0 given.
}
