// 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 last
 * Returns the last element.
 * Throws a StateError if this is empty. Otherwise may iterate through the
 * elements and returns the last one seen. Some iterables may have more
 * efficient ways to find the last element (for example a list can directly
 * access the last element, without iterating through the previous ones).
 * @description Checks that the last element of the list is returned.
 * @author kaigorodov
 */
library last_A01_t01;
 
import "../../../Utils/expect.dart";

test(Iterable create([Iterable content]), {bool isSet:false}) {

  check(Iterable source) {
    if (isSet) {
      //  for Sets, we can only check that returned element belongs to the set
      Expect.isTrue(source.contains(create(source).last));
    } else {
      Expect.equals(source.last, create(source).last);
    }
  }

  List a = new List.empty(growable: true);
  a.add(0);
  check(a);

  a.add(1);
  check(a);

  a.add(1);
  check(a);

  List b = new List.filled(1000, null);
  b[999] = 999;
  a.addAll(b);
  check(b);

  a.length = 2001;
  a[2000] = 2001;
  check(a);

  a = new List.filled(10, null);
  a[9] = 9;
  check(a);

  a = [null, 0, 0, false, -1];
  check(a);

  a = const [null, 0, 0, false, 100];
  check(a);
}
