// Copyright (c) 2015, 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.
// SharedOptions=--supermixin

import "package:expect/expect.dart";

bool inCheckedMode() {
  try {
    var i = 42;
    String s = i;
  } on TypeError catch (e) {
    return true;
  }
  return false;
}

class MS<
    U,
    V
    extends U //# 01: static type warning
    > {}

class M<
    U
    extends V //# 01: continued
    ,
    V> extends MS<V, U> {}

class NS<
    U
    extends V //# 01: continued
    ,
    V> {}

class N<
    U,
    V
    extends U //# 01: continued
    > extends NS<V, U> {}

class S<T> {}

class MNA<U, V, W> extends S<List<U>>
    with M<List<V>, List<U>>, N<List<W>, List<W>> {}

class MNA2<U, V, W> = S<List<U>> with M<List<W>, List<W>>, N<List<U>, List<V>>;

class MNA3<U, V, W> extends S<List<U>>
    with MNA<U, V, W>, MNA2<List<U>, List<V>, List<W>> {}

class MNA4<U, V, W> = S<List<U>>
    with MNA<U, V, W>, MNA2<List<U>, List<V>, List<W>>;

main() {
  new MNA<num, int, bool>();
  new MNA2<num, int, bool>();
  new MNA3<num, int, bool>();
  new MNA4<num, int, bool>();
  bool shouldThrow = false
      || inCheckedMode() //# 01: continued
      ;
  if (shouldThrow) {
    // Type parameter U of M must extend type parameter V, but
    // type argument List<num> is not a subtype of List<int>.
    Expect.throws(() => new MNA<int, num, bool>(), (e) => e is TypeError);
    // Type parameter V of N must extend type parameter U, but
    // type argument List<num> is not a subtype of List<int>.
    Expect.throws(() => new MNA2<int, num, bool>(), (e) => e is TypeError);
    // Type parameter V of N must extend type parameter U, but
    // type argument List<List<num>> is not a subtype of List<List<int>>.
    Expect.throws(() => new MNA3<int, num, bool>(), (e) => e is TypeError);
    // Type parameter V of N must extend type parameter U, but
    // type argument List<List<num>> is not a subtype of List<List<int>>.
    Expect.throws(() => new MNA4<int, num, bool>(), (e) => e is TypeError);
  } else {
    new MNA<int, num, bool>();
    new MNA2<int, num, bool>();
    new MNA3<int, num, bool>();
    new MNA4<int, num, bool>();
  }
}
