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

/// @assertion Iterable<E> skip(int count)
/// Returns an [Iterable] that provides all but the first [count] elements.
/// When the returned iterable is iterated, it starts iterating over this, first
/// skipping past the initial [count] elements.
/// After that, the remaining elements are iterated in the same order as in this
/// iterable.
/// @description checks that an [Iterable] that skips the first n elements is
/// returned.
/// @author kaigorodov

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

check(List a, int n) {
  DoubleLinkedQueue queue = new DoubleLinkedQueue.from(a);
  Iterable it = queue.skip(n);
  Expect.equals(queue.length - n, it.length);
  int k = 0;
  for (var el in it) {
    Expect.equals(queue.elementAt(n + k), el);
    k++;
  }      
}

main() {
  check([1, 2, -3, 4], 4);
  check([1, 2, -3, 4], 0);
  check([11, 2, -3, 4], 2);
  check([1, 22, -3, 4], 4);
  check(const[1, 2, -5, -6, 100], 0);
  check(const[1, -1, 2, -5, -6], 1);
  check(const[0, 0, 1, 2, -5, -6], 2);
  check(const[0, 0, 1, 2, -5, -6], 6);
}
