// 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.

import 'dart:async';

import 'package:expect/expect.dart';
import 'package:expect/variations.dart';

// Regression test for https://github.com/dart-lang/sdk/issues/45767.

class I<T> {}

class F<E extends F<E>> extends I<E> {}

// Extending F forces DDC to defer the superclass and trigger the bug
class A<T> extends F<A<Object?>> {}

// Nullability on a type argument in the deferred type.
class B<T> extends F<B<T?>> {}

// Nullability on a FutureOr in the deferred type.
class C<T> extends F<C<FutureOr<int>?>> {}

// Reference the current type inside a FutureOr in the deferred type.
class D<T> extends F<D<FutureOr<D?>>> {}

// Nullability and normalization on FutureOrTypes in the deferred type.
class G<T> extends F<G<FutureOr<Null>?>> {}

void main() {
  Expect.isTrue(A<bool>() is I<A<Object?>>);
  Expect.equals(!!unsoundNullSafety, A<bool>() is I<A<Object>>);
  Expect.isTrue(B<bool>() is I<B<bool?>>);
  Expect.equals(!!unsoundNullSafety, B<bool>() is I<B<bool>>);
  Expect.isTrue(C<bool>() is I<C<FutureOr<int>?>>);
  Expect.equals(!!unsoundNullSafety, C<bool>() is I<C<FutureOr<int>>>);
  Expect.isTrue(D<bool>() is I<D<FutureOr<D?>>>);
  Expect.equals(!!unsoundNullSafety, D<bool>() is I<D<FutureOr<D>>>);
  Expect.isTrue(G<bool>() is I<G<Future<Null>?>>);
  Expect.equals(!!unsoundNullSafety, G<bool>() is I<G<Future<Null>>>);
}
