// Copyright (c) 2021, 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 when required named parameter is not the first
/// one
/// @author sgrekhov@unipro.ru

// Requirements=nnbd-weak
import "../../../Utils/expect.dart";

class A {}

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

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

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

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

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

String test4(int i, {String y = "", required final x}) => 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"));
}
