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

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] COMPILE_TIME_ERROR.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER
  //                                       ^
  // [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);
}
