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

// @dart = 2.6

// SharedOptions=--enable-experiment=variance

// Tests runtime subtyping with explicit variance modifiers.

import 'dart:_runtime' show typeRep;
import 'dart:async' show FutureOr;

import 'runtime_utils.dart';

class Upper {}

class Middle extends Upper {}

class Lower extends Middle {}

class Covariant<out T> {}

class Contravariant<in T> {}

class Invariant<inout T> {}

class LegacyCovariant<T> {}

void main() {
  // Covariant<Lower> <: Covariant<Middle>
  checkProperSubtype(typeRep<Covariant<Lower>>(), typeRep<Covariant<Middle>>());

  // Covariant<Middle> <: Covariant<Middle>
  checkSubtype(typeRep<Covariant<Middle>>(), typeRep<Covariant<Middle>>());

  // Contravariant<Upper> <: Contravariant<Middle>
  checkProperSubtype(
      typeRep<Contravariant<Upper>>(), typeRep<Contravariant<Middle>>());

  // Contravariant<Middle> <: Contravariant<Middle>
  checkSubtype(
      typeRep<Contravariant<Middle>>(), typeRep<Contravariant<Middle>>());

  // Invariant<Middle> <: Invariant<Middle>
  checkSubtype(typeRep<Invariant<Middle>>(), typeRep<Invariant<Middle>>());

  // Invariant<dynamic> <:> Invariant<Object>
  checkMutualSubtype(
      typeRep<Invariant<dynamic>>(), typeRep<Invariant<Object>>());

  // Invariant<FutureOr<dynamic>> <:> Invariant<dynamic>
  checkMutualSubtype(
      typeRep<Invariant<FutureOr<dynamic>>>(), typeRep<Invariant<dynamic>>());

  // Invariant<FutureOr<Null>> <:> Invariant<Future<Null>>
  checkMutualSubtype(
      typeRep<Invariant<FutureOr<Null>>>(), typeRep<Invariant<Future<Null>>>());

  // LegacyCovariant<Lower> <: LegacyCovariant<Middle>
  checkProperSubtype(
      typeRep<LegacyCovariant<Lower>>(), typeRep<LegacyCovariant<Middle>>());

  // List<Covariant<Lower>> <: Iterable<Covariant<Middle>>
  checkProperSubtype(typeRep<List<Covariant<Lower>>>(),
      typeRep<Iterable<Covariant<Middle>>>());

  // List<Contravariant<Upper>> <: Iterable<Contravariant<Middle>>
  checkProperSubtype(typeRep<List<Contravariant<Upper>>>(),
      typeRep<Iterable<Contravariant<Middle>>>());

  // List<Invariant<Middle>> <: Iterable<Invariant<Middle>>
  checkProperSubtype(typeRep<List<Invariant<Middle>>>(),
      typeRep<Iterable<Invariant<Middle>>>());

  // List<LegacyCovariant<Lower>> <: Iterable<LegacyCovariant<Middle>>
  checkProperSubtype(typeRep<List<LegacyCovariant<Lower>>>(),
      typeRep<Iterable<LegacyCovariant<Middle>>>());

  // String -> Covariant<Lower> <: String -> Covariant<Middle>
  checkProperSubtype(typeRep<Covariant<Lower> Function(String)>(),
      typeRep<Covariant<Middle> Function(String)>());

  // Covariant<Upper> -> String <: Covariant<Middle> -> String
  checkProperSubtype(typeRep<String Function(Covariant<Upper>)>(),
      typeRep<String Function(Covariant<Middle>)>());

  // String -> Contravariant<Upper> <: String -> Contravariant<Middle>
  checkProperSubtype(typeRep<Contravariant<Upper> Function(String)>(),
      typeRep<Contravariant<Middle> Function(String)>());

  // Contravariant<Lower> -> String <: Contravariant<Middle> -> String
  checkProperSubtype(typeRep<String Function(Contravariant<Lower>)>(),
      typeRep<String Function(Contravariant<Middle>)>());

  // String -> Invariant<Middle> <: String -> Invariant<Middle>
  checkSubtype(typeRep<String Function(Invariant<Middle>)>(),
      typeRep<String Function(Invariant<Middle>)>());

  // Invariant<Middle> -> String <: Invariant<Middle> -> String
  checkSubtype(typeRep<String Function(Invariant<Middle>)>(),
      typeRep<String Function(Invariant<Middle>)>());

  // String -> LegacyCovariant<Lower> <: String -> LegacyCovariant<Middle>
  checkProperSubtype(typeRep<LegacyCovariant<Lower> Function(String)>(),
      typeRep<LegacyCovariant<Middle> Function(String)>());

  // LegacyCovariant<Upper> -> String <: LegacyCovariant<Middle> -> String
  checkProperSubtype(typeRep<String Function(LegacyCovariant<Upper>)>(),
      typeRep<String Function(LegacyCovariant<Middle>)>());

  // Covariant<Upper> </: Covariant<Middle>
  checkSubtypeFailure(
      typeRep<Covariant<Upper>>(), typeRep<Covariant<Middle>>());

  // Contravariant<Lower> </: Contravariant<Middle>
  checkSubtypeFailure(
      typeRep<Contravariant<Lower>>(), typeRep<Contravariant<Middle>>());

  // Invariant<Upper> </: Invariant<Middle>
  checkSubtypeFailure(
      typeRep<Invariant<Upper>>(), typeRep<Invariant<Middle>>());

  // Invariant<Lower> </: Invariant<Middle>
  checkSubtypeFailure(
      typeRep<Invariant<Lower>>(), typeRep<Invariant<Middle>>());

  // LegacyCovariant<Upper> </: LegacyCovariant<Middle>
  checkSubtypeFailure(
      typeRep<LegacyCovariant<Upper>>(), typeRep<LegacyCovariant<Middle>>());

  // List<Covariant<Upper>> </: Iterable<Covariant<Middle>>
  checkSubtypeFailure(typeRep<List<Covariant<Upper>>>(),
      typeRep<Iterable<Covariant<Middle>>>());

  // List<Contravariant<Lower>> </: Iterable<Contravariant<Middle>>
  checkSubtypeFailure(typeRep<List<Contravariant<Lower>>>(),
      typeRep<Iterable<Contravariant<Middle>>>());

  // List<Invariant<Upper>> </: Iterable<Invariant<Middle>>
  checkSubtypeFailure(typeRep<List<Invariant<Upper>>>(),
      typeRep<Iterable<Invariant<Middle>>>());

  // List<Invariant<Lower>> </: Iterable<Invariant<Middle>>
  checkSubtypeFailure(typeRep<List<Invariant<Lower>>>(),
      typeRep<Iterable<Invariant<Middle>>>());

  // List<LegacyCovariant<Upper>> </: Iterable<LegacyCovariant<Middle>>
  checkSubtypeFailure(typeRep<List<LegacyCovariant<Upper>>>(),
      typeRep<Iterable<LegacyCovariant<Middle>>>());

  // String -> Covariant<Upper> </: String -> Covariant<Middle>
  checkSubtypeFailure(typeRep<Covariant<Upper> Function(String)>(),
      typeRep<Covariant<Middle> Function(String)>());

  // Covariant<Lower> -> String </: Covariant<Middle> -> String
  checkSubtypeFailure(typeRep<String Function(Covariant<Lower>)>(),
      typeRep<String Function(Covariant<Middle>)>());

  // String -> Contravariant<Lower> </: String -> Contravariant<Middle>
  checkSubtypeFailure(typeRep<Contravariant<Lower> Function(String)>(),
      typeRep<Contravariant<Middle> Function(String)>());

  // Contravariant<Upper> -> String </: Contravariant<Middle> -> String
  checkSubtypeFailure(typeRep<String Function(Contravariant<Upper>)>(),
      typeRep<String Function(Contravariant<Middle>)>());

  // String -> Invariant<Upper> </: String -> Invariant<Middle>
  checkSubtypeFailure(typeRep<Invariant<Upper> Function(String)>(),
      typeRep<Invariant<Middle> Function(String)>());

  // Invariant<Upper> -> String </: Invariant<Middle> -> String
  checkSubtypeFailure(typeRep<String Function(Invariant<Upper>)>(),
      typeRep<String Function(Invariant<Middle>)>());

  // String -> Invariant<Lower> </: String -> Invariant<Middle>
  checkSubtypeFailure(typeRep<Invariant<Lower> Function(String)>(),
      typeRep<Invariant<Middle> Function(String)>());

  // Invariant<Lower> -> String <: Invariant<Middle> -> String
  checkSubtypeFailure(typeRep<String Function(Invariant<Lower>)>(),
      typeRep<String Function(Invariant<Middle>)>());

  // String -> LegacyCovariant<Upper> </: String -> LegacyCovariant<Middle>
  checkSubtypeFailure(typeRep<LegacyCovariant<Upper> Function(String)>(),
      typeRep<LegacyCovariant<Middle> Function(String)>());

  // LegacyCovariant<Lower> -> String </: LegacyCovariant<Middle> -> String
  checkSubtypeFailure(typeRep<String Function(LegacyCovariant<Lower>)>(),
      typeRep<String Function(LegacyCovariant<Middle>)>());
}
