|  | // Copyright (c) 2013, 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"; | 
|  |  | 
|  | main() { | 
|  | testEmpty(name, Iterable<int> it, [depth = 2]) { | 
|  | Expect.isTrue(it.isEmpty, name); | 
|  | Expect.isFalse(it.isNotEmpty, name); | 
|  | Expect.equals(0, it.length, name); | 
|  | Expect.isFalse(it.contains(null), name); | 
|  | Expect.isFalse(it.any((x) => true), name); | 
|  | Expect.isTrue(it.every((x) => false), name); | 
|  | Expect.throwsStateError(() => it.first, name); | 
|  | Expect.throwsStateError(() => it.last, name); | 
|  | Expect.throwsStateError(() => it.single, name); | 
|  | Expect.throwsRangeError(() => it.elementAt(0), name); | 
|  | Expect.throwsStateError(() => it.reduce((a, b) => a), name); | 
|  | Expect.throwsStateError(() => it.singleWhere((_) => true), name); | 
|  | Expect.equals(42, it.fold(42, (a, b) => "not 42"), name); | 
|  | Expect.equals(42, it.firstWhere((v) => true, orElse: () => 42), name); | 
|  | Expect.equals(42, it.lastWhere((v) => true, orElse: () => 42), name); | 
|  | Expect.equals("", it.join("separator"), name); | 
|  | Expect.equals("()", it.toString(), name); | 
|  | Expect.listEquals([], it.toList(), name); | 
|  | Expect.listEquals([], it.toList(growable: false), name); | 
|  | Expect.listEquals([], it.toList(growable: true), name); | 
|  | Expect.equals(0, it.toSet().length, name); | 
|  | // Doesn't throw: | 
|  | it.forEach((v) => throw v); | 
|  | for (var v in it) { | 
|  | throw v; | 
|  | } | 
|  | // Check that returned iterables are also empty. | 
|  | if (depth > 0) { | 
|  | testEmpty("$name-map", it.map((x) => x), depth - 1); | 
|  | testEmpty("$name-where", it.where((x) => true), depth - 1); | 
|  | testEmpty("$name-expand", it.expand((x) => [x]), depth - 1); | 
|  | testEmpty("$name-skip", it.skip(1), depth - 1); | 
|  | testEmpty("$name-take", it.take(2), depth - 1); | 
|  | testEmpty("$name-skipWhile", it.skipWhile((v) => false), depth - 1); | 
|  | testEmpty("$name-takeWhile", it.takeWhile((v) => true), depth - 1); | 
|  | } | 
|  | } | 
|  |  | 
|  | testType(name, it, [depth = 2]) { | 
|  | Expect.isTrue(it is Iterable<int>, name); | 
|  | Expect.isFalse(it is Iterable<String>, name); | 
|  | if (depth > 0) { | 
|  | testType("$name-where", it.where((_) => true), depth - 1); | 
|  | testType("$name-skip", it.skip(1), depth - 1); | 
|  | testType("$name-take", it.take(1), depth - 1); | 
|  | testType("$name-skipWhile", it.skipWhile((_) => false), depth - 1); | 
|  | testType("$name-takeWhile", it.takeWhile((_) => true), depth - 1); | 
|  | testType("$name-toList", it.toList(), depth - 1); | 
|  | testType("$name-toList", it.toList(growable: false), depth - 1); | 
|  | testType("$name-toList", it.toList(growable: true), depth - 1); | 
|  | testType("$name-toSet", it.toSet(), depth - 1); | 
|  | } | 
|  | } | 
|  |  | 
|  | test(name, it) { | 
|  | testEmpty(name, it); | 
|  | testType(name, it); | 
|  | } | 
|  |  | 
|  | test("const", const Iterable<int>.empty()); | 
|  | test("new", new Iterable<int>.empty()); | 
|  | } |