mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 10:48:25 +00:00
912005267d
Change-Id: I46be49b2effec3e38a3dc44cd45cfe736f77fa78 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/182680 Commit-Queue: Sigmund Cherem <sigmund@google.com> Reviewed-by: Joshua Litt <joshualitt@google.com> Reviewed-by: Nicholas Shahan <nshahan@google.com> Reviewed-by: Stephen Adams <sra@google.com>
97 lines
2.2 KiB
Dart
97 lines
2.2 KiB
Dart
// Copyright (c) 2011, 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.
|
|
|
|
import "dart:collection";
|
|
import "package:expect/expect.dart";
|
|
|
|
// Test foreach (aka. for-in) functionality.
|
|
|
|
testIterator(List expect, Iterable input) {
|
|
int i = 0;
|
|
for (var value in input) {
|
|
Expect.isTrue(i < expect.length);
|
|
Expect.equals(expect[i], value);
|
|
i += 1;
|
|
}
|
|
Expect.equals(expect.length, i);
|
|
|
|
i = 0;
|
|
var value2;
|
|
for (value2 in input) {
|
|
Expect.isTrue(i < expect.length);
|
|
Expect.equals(expect[i], value2);
|
|
i += 1;
|
|
}
|
|
Expect.equals(expect.length, i);
|
|
}
|
|
|
|
class MyIterable<T> extends IterableBase<T> {
|
|
final List<T> values;
|
|
MyIterable(List<T> values) : this.values = values;
|
|
Iterator<T> get iterator {
|
|
return new MyListIterator<T>(values);
|
|
}
|
|
}
|
|
|
|
class MyListIterator<T> implements Iterator<T> {
|
|
final List<T> values;
|
|
int index;
|
|
MyListIterator(List<T> values)
|
|
: this.values = values,
|
|
index = -1;
|
|
|
|
bool moveNext() => ++index < values.length;
|
|
T get current {
|
|
assert(0 <= index && index < values.length);
|
|
return values[index];
|
|
}
|
|
}
|
|
|
|
void main() {
|
|
testIterator([], []);
|
|
testIterator([], new MyIterable([]));
|
|
testIterator([1], [1]);
|
|
testIterator([1], new MyIterable([1]));
|
|
testIterator([1, 2, 3], [1, 2, 3]);
|
|
testIterator([1, 2, 3], new MyIterable([1, 2, 3]));
|
|
testIterator(["a", "b", "c"], ["a", "b", "c"]);
|
|
testIterator(["a", "b", "c"], new MyIterable(["a", "b", "c"]));
|
|
|
|
// Several nested for-in's.
|
|
for (var x in [
|
|
[
|
|
["a"]
|
|
]
|
|
]) {
|
|
for (var y in x) {
|
|
for (var z in y) {
|
|
Expect.equals("a", z);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Simultaneous iteration of the same iterable.
|
|
for (var iterable in [
|
|
[1, 2, 3],
|
|
new MyIterable([1, 2, 3])
|
|
]) {
|
|
int result = 0;
|
|
for (var x in iterable) {
|
|
for (var y in iterable) {
|
|
result += x * y;
|
|
}
|
|
}
|
|
Expect.equals(36, result);
|
|
}
|
|
|
|
// Using the same variable (showing that the expression is evaluated
|
|
// in the outer scope).
|
|
int result = 0;
|
|
var x = [1, 2, 3];
|
|
for (var x in x) {
|
|
result += x;
|
|
}
|
|
Expect.equals(6, result);
|
|
}
|