ba40d9bece
Change-Id: I73edeeaf4934899b71d6335dcb4b4b54dce46bae Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/426340 Auto-Submit: Bob Nystrom <rnystrom@google.com> Reviewed-by: Nate Biggs <natebiggs@google.com> Commit-Queue: Nate Biggs <natebiggs@google.com>
95 lines
2.2 KiB
Dart
95 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);
|
|
}
|