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

import 'dart:async';
import '../static_type_helper.dart';

// Test least upper bound for types involving `FutureOr`.

bool condition = true;

class A {}

class B {}

class C extends B {}

class D extends B {}

class E<T> {}

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

void main() {
  // Approach: First test operand types (with no occurrence of `FutureOr`)
  // then test those operands used as type arguments according to the
  // rules about **UP**(T1, T2) where T1 or T2 is of the form `FutureOr<S>`.

  void f1(int a, String b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<Object>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<Object>>();
  }

  void f2(FutureOr<int> a, FutureOr<String> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<Object>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<Object>>>();
  }

  void f3(Future<int> a, FutureOr<String> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<Object>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<Object>>>();
  }

  void f4(int a, FutureOr<String> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<Object>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<Object>>>();
  }

  void f5(int a, num b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<num>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<num>>();
  }

  void f6(FutureOr<int> a, FutureOr<num> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<num>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<num>>>();
  }

  void f7(Future<int> a, FutureOr<num> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<num>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<num>>>();
  }

  void f8(int a, FutureOr<num> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<num>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<num>>>();
  }

  void f9(List<int> a, List<String> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<List<Object>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<List<Object>>>();
  }

  void f10(FutureOr<List<int>> a, FutureOr<List<String>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<List<Object>>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<List<Object>>>>();
  }

  void f11(Future<List<int>> a, FutureOr<List<String>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<List<Object>>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<List<Object>>>>();
  }

  void f12(List<int> a, FutureOr<List<String>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<List<Object>>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<List<Object>>>>();
  }

  void f13(List<int> a, List<num> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<List<num>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<List<num>>>();
  }

  void f14(FutureOr<List<int>> a, FutureOr<List<num>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<List<num>>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<List<num>>>>();
  }

  void f15(Future<List<int>> a, FutureOr<List<num>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<List<num>>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<List<num>>>>();
  }

  void f16(List<int> a, FutureOr<List<num>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<List<num>>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<List<num>>>>();
  }

  void f17(dynamic a, void b) {
    var x = condition ? a : b;
    /**/ x.toString();
    //   ^
    // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT
    // [cfe] This expression has type 'void' and can't be used.

    var y = condition ? b : a;
    /**/ y.toString();
    //   ^
    // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT
    // [cfe] This expression has type 'void' and can't be used.
  }

  void f18(FutureOr<dynamic> a, FutureOr<void> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<void>>>();
    if (x is Future) throw 0;
    /**/ x.toString();
    //   ^
    // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT
    // [cfe] This expression has type 'void' and can't be used.

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<void>>>();
    if (y is Future) throw 0;
    /**/ y.toString();
    //   ^
    // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT
    // [cfe] This expression has type 'void' and can't be used.
  }

  void f19(Future<dynamic> a, FutureOr<void> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<void>>>();
    if (x is Future) throw 0;
    /**/ x.toString();
    //   ^
    // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT
    // [cfe] This expression has type 'void' and can't be used.

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<void>>>();
    if (y is Future) throw 0;
    /**/ y.toString();
    //   ^
    // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT
    // [cfe] This expression has type 'void' and can't be used.
  }

  void f20(dynamic a, FutureOr<void> b) {
    var x = condition ? a : b;
    // Verify that the type of `x` is a top type.
    x.expectStaticType<Exactly<dynamic>>();
    // Verify that it is `dynamic`.
    x.unknownMember();

    var y = condition ? b : a;
    // Verify that the type of `y` is a top type.
    y.expectStaticType<Exactly<dynamic>>();
    // Verify that it is `dynamic`.
    y.unknownMember();
  }

  void f21(A a, B b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<Object>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<Object>>();
  }

  void f22(FutureOr<A> a, FutureOr<B> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<Object>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<Object>>>();
  }

  void f23(Future<A> a, FutureOr<B> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<Object>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<Object>>>();
  }

  void f24(A a, FutureOr<B> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<Object>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<Object>>>();
  }

  void f25(B a, C b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<B>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<B>>();
  }

  void f26(FutureOr<B> a, FutureOr<C> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<B>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<B>>>();
  }

  void f27(Future<B> a, FutureOr<C> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<B>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<B>>>();
  }

  void f28(B a, FutureOr<C> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<B>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<B>>>();
  }

  void f29(C a, D b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<B>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<B>>();
  }

  void f30(FutureOr<C> a, FutureOr<D> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<B>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<B>>>();
  }

  void f31(Future<C> a, FutureOr<D> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<B>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<B>>>();
  }

  void f32(C a, FutureOr<D> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<B>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<B>>>();
  }

  void f33(E<B> a, E<C> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<E<B>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<E<B>>>();
  }

  void f34(FutureOr<E<B>> a, FutureOr<E<C>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<E<B>>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<E<B>>>>();
  }

  void f35(Future<E<B>> a, FutureOr<E<C>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<E<B>>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<E<B>>>>();
  }

  void f36(E<B> a, FutureOr<E<C>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<E<B>>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<E<B>>>>();
  }

  void f37(E<B> a, F<C> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<E<B>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<E<B>>>();
  }

  void f38(FutureOr<E<B>> a, FutureOr<F<C>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<E<B>>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<E<B>>>>();
  }

  void f39(Future<E<B>> a, FutureOr<F<C>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<E<B>>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<E<B>>>>();
  }

  void f40(E<B> a, FutureOr<F<C>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<E<B>>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<E<B>>>>();
  }

  void f41(int a, String? b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<Object?>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<Object?>>();
  }

  void f42(FutureOr<int> a, FutureOr<String?> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<Object?>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<Object?>>>();
  }

  void f43(Future<int> a, FutureOr<String?> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<Object?>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<Object?>>>();
  }

  void f44(int a, FutureOr<String?> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<Object?>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<Object?>>>();
  }

  void f45(List<int> a, List<String>? b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<List<Object>?>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<List<Object>?>>();
  }

  void f46(FutureOr<List<int>> a, FutureOr<List<String>?> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<List<Object>?>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<List<Object>?>>>();
  }

  void f47(Future<List<int>> a, FutureOr<List<String>?> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<List<Object>?>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<List<Object>?>>>();
  }

  void f48(List<int> a, FutureOr<List<String>?> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<List<Object>?>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<List<Object>?>>>();
  }

  void f49(E<C> a, F<B> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<Object>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<Object>>();
  }

  void f50(FutureOr<E<C>> a, FutureOr<F<B>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<Object>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<Object>>>();
  }

  void f51(Future<E<C>> a, FutureOr<F<B>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<Object>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<Object>>>();
  }

  void f52(E<C> a, FutureOr<F<B>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<Object>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<Object>>>();
  }

  // A sample of cases involving nested futures and nullable types.

  void f53(int a, FutureOr<Future<int>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<Object>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<Object>>>();
  }

  // Could soundly have been `FutureOr<Future<int>>`.
  void f54(Future<int> a, FutureOr<Future<int>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<Object>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<Object>>>();
  }

  void f55(Future<Future<int>> a, FutureOr<Future<int>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<Future<int>>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<Future<int>>>>();
  }

  void f56(Future<FutureOr<int>> a, FutureOr<Future<int>> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<FutureOr<int>>>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<FutureOr<int>>>>();
  }

  void f57(Future<int?> a, FutureOr<int>? b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<int?>?>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<int?>?>>();
  }

  void f58(Future<int>? a, FutureOr<int?> b) {
    var x = condition ? a : b;
    x.expectStaticType<Exactly<FutureOr<int?>?>>();

    var y = condition ? b : a;
    y.expectStaticType<Exactly<FutureOr<int?>?>>();
  }
}
