// Copyright (c) 2016, 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.

/// @assertion  bool any(bool f(E element))
/// Checks whether any [element] of this iterable satisfies [test].
/// Checks every [element] in iteration order, and returns [true] if any of them
/// make [test] return [true], otherwise returns [false].
/// @description Checks that [any] returns correct value
/// @author iarkh@unipro.ru

import "../../../Utils/expect.dart";
import "dart:collection";

class MyIterable extends Object with IterableMixin {
  List _content;

  MyIterable(): _content = new List.empty(growable: true);

  MyIterable.from(Iterable content): _content = new List.from(content);

  Iterator get iterator {
    return _content.iterator;
  }
}

main() {
  MyIterable iterable = new MyIterable.from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
  Expect.isTrue(iterable.any((e) => e > 0));
  Expect.isTrue(iterable.any((e) => e < 10));
  Expect.isFalse(iterable.any((e) => e is String));
  Expect.isTrue(iterable.any((e) => e is int));

  iterable = new MyIterable.from([1, 2, 3, 4, 5, "a", "b", "c", "d", "e"]);
  Expect.isTrue(iterable.any((e) => e is String));
  Expect.isTrue(iterable.any((e) => e is int));

  iterable = new MyIterable.from(["a", "b", "c", "d", "e"]);
  Expect.isTrue(iterable.any((e) => e is String));
  Expect.isFalse(iterable.any((e) => e is int));
}
