// Copyright (c) 2011, 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

class TypeTester<T> {}

// Expect compile-time error as no default values are allowed
// in closure type definitions.
typedef void Callback([String msg = ""]);
//                                ^
// [analyzer] SYNTACTIC_ERROR.DEFAULT_VALUE_IN_FUNCTION_TYPE
// [cfe] Can't have a default value in a function type.

class NamedParametersAggregatedTests {
  static int F31(int a, {int b: 20, int c: 30}) {
    return 100 * (100 * a + b) + c;
  }

  static int f_missing_comma(a [b = 42]) => a;
  //                           ^
  // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
  // [cfe] Expected ')' before this.

  var _handler = null;

  // Expect compile-time error as no default values
  // are allowed in closure type.
  void InstallCallback(void cb({String msg : null})) {
  //                                       ^
  // [analyzer] SYNTACTIC_ERROR.DEFAULT_VALUE_IN_FUNCTION_TYPE
  // [cfe] Can't have a default value in a function type.
    _handler = cb;
  }
}

main() {
  // Expect compile-time error due to missing comma in function definition.
  NamedParametersAggregatedTests.f_missing_comma(10, 25);
  //                                                 ^^
  // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS
  //                                            ^^^^^^^^
  // [cfe] Too many positional arguments: 1 allowed, but 2 found.

  // Expect compile-time error due to duplicate named argument.
  NamedParametersAggregatedTests.F31(10, b: 25, b:35);
  //                                            ^
  // [analyzer] COMPILE_TIME_ERROR.DUPLICATE_NAMED_ARGUMENT
  // [cfe] Duplicated named argument 'b'.

  // Expect compile-time error due to missing positional argument.
  NamedParametersAggregatedTests.F31(b: 25, c: 35);
  //                                ^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.NOT_ENOUGH_POSITIONAL_ARGUMENTS
  // [cfe] Too few positional arguments: 1 required, 0 given.

  new TypeTester<Callback>();

  (new NamedParametersAggregatedTests()).InstallCallback(null);
}
