// 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.

/// @assertionfactory DoubleLinkedQueue.from(Iterable elements)
/// Creates a double-linked queue containing all elements.
/// The element order in the queue is as if the elements were added using
/// addLast in the order provided by elements.iterator.
/// @description Checks constructor with custom Iterable.
/// @author kaigorodov

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

class CustomIterator<T> implements Iterator<T> {
  CustomIterator(List<T> list)
      : _array = list,
        _length = list.length,
        _pos = -1 {}

  bool moveNext() {
    if (_pos + 1 < _length) {
      _pos++;
      return true;
    } else {
      return false;
    }
  }

  T get current {
    if (_pos < 0) {
      throw new StateError("No element selected yet, use moveNext()");
    }

    if (_pos >= _length) {
      throw new StateError("Impossible: current position >= length.");
    }

    return _array[_pos];
  }

  final List<T> _array;
  final int _length;
  int _pos;
}

class IterableClass extends IterableBase {
  List internalArray = [1, 2, 3];

  Iterator get iterator {
    return new CustomIterator(internalArray);
  }
}

void check(DoubleLinkedQueue l, Iterable c) {
  Expect.equals(l.length, c.length);
  c.forEach((var element) {
    Expect.equals(l.removeFirst(), element);
  });
}

main() {
  DoubleLinkedQueue<int> list = new DoubleLinkedQueue.from(new IterableClass());
  check(list, [1, 2, 3]);

  IterableClass copy = new IterableClass();
  copy.internalArray = [null, null, "sdsd", copy];
  check(new DoubleLinkedQueue.from(copy), [null, null, "sdsd", copy]);
}
