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

import 'package:expect/expect.dart';

void main() {
  Expect.throwsTypeError(() {
    List<int> l = [1, 2, 3].where((x) => x.isEven).map((x) => x + 1);
  }, 'Iterable<int> should fail implicit cast to List<int>');

  Iterable<int> l = [1, 2, 3].where((x) => x.isEven).map((x) => x + 1);
  Expect.isFalse(l is List<int>, 'Iterable<int> is not a subtype of List<int>');

  C<Object> c = C<Object>(1);
  Iterable<bool Function(Object)> myList = c.f(); // works

  Expect.throwsTypeError(() {
    C<Object> c = C<Object>(1);
    List<bool Function(Object)> myList = c.f();
  }, "f() returns an Iterable, not a List");

  Expect.throwsTypeError(() {
    C<Object> c = C<int>(1);
    List<bool Function(Object)> myList = c.f();
  }, "f() returns an Iterable, not a List");

  Expect.throwsTypeError(() {
    C<Object> c = C<int>(1);
    Iterable<bool Function(Object)> myList = c.f();
  }, "f() returns functions accepting int, not Object");

  {
    C<Iterable<Object>> c = D<Object>([1]);
    Iterable<bool Function(Iterable<Object>)> myList = c.f();
  }

  Expect.throwsTypeError(() {
    C<Iterable<Object>> c = D<Object>([1]);
    List<bool Function(Iterable<Object>)> myList = c.f();
  }, "D.f() returns an Iterable, not a List");

  Expect.throwsTypeError(() {
    C<Iterable<Object>> c = D<int>([1]);
    Iterable<bool Function(Iterable<Object>)> myList = c.f();
  }, "D.f() returns functions accepting Iterable<int>, not Iterable<Object>");
}

class C<T> {
  final T t;
  C(this.t);
  Iterable<bool Function(T)> f() sync* {
    yield (T x) => x == t;
  }
}

class D<S> extends C<Iterable<S>> {
  D(Iterable<S> s) : super(s);
}
