/*
 * Copyright (c) 2019, 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.
 */
/**
 * @assertion The modifier required is added as a built-in identifier. The
 * grammar of function types is extended to allow any named parameter
 * declaration to be prefixed by the required modifier (e.g. int Function(int,
 * {int? y, required int z}).
 *
 * @description Check that any named parameter declaration can be prefixed by
 * the 'required' modifier. Test more than one named parameter
 * @author sgrekhov@unipro.ru
 */
// Requirements=nnbd-strong
import "../../Utils/expect.dart";

class A {}

class C {
  static String staticTest1(int i, {required String x, String y = ""}) => x;
  static String staticTest2(int i, {required final x, String y = ""}) => x;
  String instanceTest1(int i, {required String x, String y = ""}) => x;
  A instanceTest2(int i, {required covariant A x, String y = ""}) => x;
  String instanceTest3(int i, {required final x, String y = ""}) => x;
}

String test1(int i, {required String x, String y = ""}) => x;

typedef String Foo(int i, {required String x, String y});

Foo test2 = (int i, {required String x, String y = ""}) => x;

Function test3 = (int i, {required String x, String y = ""}) => x;

String test4(int i, {required final x, String y = ""}) => x;

main() {
  A a = new A();
  Expect.equals("Show must go on", C.staticTest1(42, x: "Show must go on"));
  Expect.equals("Lily was here", C.staticTest2(42, x: "Lily was here"));
  Expect.equals("Let it be", C().instanceTest1(42, x: "Let it be"));
  Expect.equals(a, C().instanceTest2(42, x: a));
  Expect.equals("No woman no cry", C().instanceTest3(42, x: "No woman no cry"));
  Expect.equals("I can't get no",  test1(42, x: "I can't get no"));
  Expect.equals("I can't get no",  test2(42, x: "I can't get no"));
  Expect.equals("I can't get no",  test3(42, x: "I can't get no"));
  Expect.equals("I can't get no",  test4(42, x: "I can't get no"));
}
