/*
 * 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 All types reified in legacy libraries are reified as legacy types.
 * @description Check that runtime type of the function imported from opted to
 * legacy library is a legacy type.
 * @author iarkh@unipro.ru
 */
// Requirements=nnbd-weak

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

main() {
  Expect.isTrue(test1 is F1);
  Expect.isTrue(test2 is F1);
  Expect.isFalse(test3 is F1);

  Expect.isTrue(test1 is F1?);
  Expect.isTrue(test2 is F1?);
  Expect.isFalse(test3 is F1?);

  Expect.isFalse(test1 is F2);
  Expect.isFalse(test2 is F2);
  Expect.isFalse(test3 is F2);

  Expect.isFalse(test4 is F1);
  Expect.isFalse(test5 is F1);
  Expect.isFalse(test6 is F1);

  Expect.isFalse(test4 is F1?);
  Expect.isFalse(test5 is F1?);
  Expect.isFalse(test6 is F1?);

  Expect.isFalse(test4 is F2);
  Expect.isFalse(test5 is F2);
  Expect.isTrue(test6 is F2);

  Expect.isFalse(test4 is F2?);
  Expect.isFalse(test5 is F2?);
  Expect.isTrue(test6 is F2?);

  Expect.isTrue(test4 is F2<int, B, A1>);
  Expect.isTrue(test4 is F2<int?, B?, A1?>);
  Expect.isTrue(test4 is F2<int, B<Object?>, A1>);
  Expect.isTrue(test4 is F2<int, B<Object>, A1>);

  Expect.isTrue(test3 is F3<A1?>);

  Expect.isTrue(test7 is F4<int?>);
  Expect.isFalse(test7 is F4<String?>);

  Expect.isTrue(test7 is F4<int>);
  Expect.isFalse(test7 is F4<String>);
}
