// 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);
}
