// Copyright (c) 2024, 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 'package:expect/expect.dart';

main() {
  test1();
  test2();
  test3();
  test4();
  test5();
  test6();
  test7();

  X<double>();
  X<int>().test1();
  X<int>().test2();
}

final bool kTrue = int.parse('1') == 1;

void test1() {
  final B0<int> a = kTrue ? B2<String>() : B1<bool, bool>();
  Expect.isFalse(a is B2<int>);
  Expect.isTrue(a is B2<String>);
}

void test2() {
  final B1<num, num> a =
      kTrue
          ? (B1<int, double>() as B1<num, num>)
          : (B2<double>() as B1<num, num>);
  Expect.isFalse(a is B2<int>);
  Expect.isFalse(a is B2<double>);
  Expect.isFalse(a is B2<num>); // Should be optimized to cid-range check.
}

void test3() {
  final B1<int, num> a =
      kTrue ? (B1<int, double>() as B1<int, num>) : (B2<int>() as B1<int, num>);
  Expect.isFalse(a is B2<int>);
  Expect.isFalse(a is B2<double>);
  Expect.isFalse(a is B2<num>);
}

void test4() {
  final B1<num, num> a = kTrue ? B2<int>() : B1<num, num>();
  Expect.isTrue(a is B2<num>); // Should be optimized to cid-range check.
  Expect.isTrue(a is B2<int>);
  Expect.isFalse(a is B2<double>);
}

void test5() {
  final B1<int, num> a = kTrue ? B2<int>() : B1<int, num>();
  Expect.isTrue(a is B2<num>);
  Expect.isTrue(a is B2<int>);
  Expect.isFalse(a is B2<double>);
}

void test6() {
  final B1<int, int> a = kTrue ? B2<int>() : B1<int, int>();
  Expect.isTrue(a is B2<num>); // Should be optimized to cid-range check.
  Expect.isTrue(a is B2<int>); // Should be optimized to cid-range check.
  Expect.isFalse(a is B2<double>);
}

void test7() {
  final B1<List<int>, List<int>> a =
      kTrue ? B2<List<int>>() : B1<List<int>, List<int>>();
  Expect.isTrue(a is B2<List<num>>); // Should be optimized to cid-range check.
  Expect.isTrue(a is B2<List<int>>); // Should be optimized to cid-range check.
  Expect.isFalse(a is B2<List<double>>);
}

class X<T extends num> {
  void test1() {
    final B1<T, T> a = kTrue ? B2<T>() : B1<T, T>();
    Expect.isTrue(a is B2<T>); // Should be optimized to cid-range check.
    Expect.isTrue(a is B2<int>);
    Expect.isFalse(a is B2<double>);
  }

  void test2() {
    final B1<List<T>, List<T>> a =
        kTrue ? B2<List<T>>() : B1<List<T>, List<T>>();
    Expect.isTrue(a is B2<List<T>>); // Should be optimized to cid-range check.
    Expect.isTrue(
      a is B2<List<num>>,
    ); // Should be optimized to cid-range check.
    Expect.isTrue(a is B2<List<int>>);
    Expect.isFalse(a is B2<List<double>>);
  }
}

class B0<T> {}

class B1<T, H> extends B0<int> {}

class B2<T> extends B1<T, T> {}
