/*
 * 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 E first
 * Returns the first element.
 * Throws a StateError if this is empty. Otherwise returs the first element
 * in the iteration order, equivalent to (iterator..moveNext())..current.
 * @description Checks that the first element of the list is returned.
 * @author kaigorodov
 * @author sgrekhov@unipro.ru
 */
library first_A01_t02;
import "../../../Utils/expect.dart";

test(Iterable create([Iterable content]), {bool isSet: false}) {
  const head = -1;
  Iterable a = create();
  Expect.equals(0, a.length);
  a = create([head]);
  Expect.equals(head, a.first);
  if (!isSet) {
    a = create([head, 1]);
    Expect.equals(head, a.first);

    List b = new List.filled(1000, null);
    b[0] = head;
    b[999] = "top";
    a = create(b);
    Expect.equals(head, a.first);

    a = create([-2, 0, "0", false, -1]);
    Expect.equals(-2, a.first);

    a = create([0, null, "0", false]);
    Expect.equals(0, a.first);
  } else {
    // Set may be unordered so the first element is unpredictable
    // just test that something is returned
    a = create([head, 1]);
    Expect.isNotNull(a.first);

    a = create([-2, 0, 0, false, -1]);
    Expect.isNotNull(a.first);

    a = create([0, 0.5, 0, false]);
    Expect.isNotNull(a.first);
  }
}
