// Copyright (c) 2020, 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 definitions of least and greatest closure are changed in null
/// safe libraries to substitute [Never] in positions where previously [Null
/// would have been substituted, and [Object?] in positions where previously
/// [Object] or [dynamic] would have been substituted.
/// @description Check that [Object?] type is substituted for [typedef check<X> =
/// void Function({X x})].
/// @note Read more about the least and greatest closure test template:
/// https://github.com/dart-lang/co19/issues/575#issuecomment-613542349
///
/// @Issue 44161, 44165
/// @author iarkh@unipro.ru


import "../../../../Utils/expect.dart";

typedef check<X> = void Function({X x});

void main() {
  void f<X>(check<X> Function() g) => g();

  // Verify that we can call the function with the specified arguments and
  // without this (should be null by default).
  f(() => captureTypeArgument()..call(x: true));
  f(() => captureTypeArgument()..call(x: null));
  f(() => captureTypeArgument()..call());
  f(() => captureTypeArgument()..call(x: 'Hello'));

 // Verify that a couple of wrong argument lists are rejected.
  f(() => captureTypeArgument()..call(throw 1));
  //                                 ^
  // [analyzer] unspecified
  // [cfe] unspecified

  f(() => captureTypeArgument()..call(true));
  //                                 ^
  // [analyzer] unspecified
  // [cfe] unspecified

  // Verify that the return type is `void`: Returned value not usable,
  // not even to access a member of `Object`.
  f(() => captureTypeArgument()..call().toString());
  //                             ^
  // [analyzer] unspecified
  // [cfe] unspecified
}
