// 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 one named required parameter
/// @author sgrekhov@unipro.ru

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

class A {}

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

String test1({required String x}) => x;

typedef String Foo({required String x});

Foo test2 = ({required String x}) => x;

Function test3 = ({required String x}) => x;

String test4({required final x}) => x;

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