// 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 If an unmigrated library re-exports a migrated library, the
/// re-exported symbols retain their migrated status (that is, downstream
/// migrated libraries will see their migrated types).
/// @description Check that if generic function typedef with nullable type
/// parameter is exported from opted-in library to legacy library and then back
/// to the opted in code, typedef retains its status. Typedef is in the form
/// [typedef <type> <identifier> <formalParameterPart>]. Check function with
/// argument.
/// @author iarkh@unipro.ru

// Requirements=nnbd-weak

import "dart:async";
import "../../../Utils/expect.dart";
import "exports_A01_opted_out_lib.dart";

typedef exp_dynamic          <T>                   = void Function(T);
typedef exp_nullable_int     <T extends int?>      = void Function(T);
typedef exp_nullable_object  <T extends Object?>   = void Function(T);
typedef exp_nullable_function<T extends Function?> = void Function(T);
typedef exp_null             <T extends Null>      = void Function(T);
typedef exp_futureOr         <T extends FutureOr>  = void Function(T);

main() {
  Expect.equals(exp_nullable_int,      g_def1_nullable_int_arg     );
  Expect.equals(exp_nullable_object,   g_def1_nullable_object_arg  );
  Expect.equals(exp_dynamic,           g_def1_dynamic_arg          );
  Expect.equals(exp_nullable_function, g_def1_nullable_function_arg);
  Expect.equals(exp_null,              g_def1_null_arg             );
  Expect.equals(exp_futureOr,          g_def1_futureOr_arg         );
}
