// Copyright (c) 2013, 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 RuneIterator.at(String string, int index)
 * A moveNext will use the rune starting at [index] the current value, and a
 * movePrevious
 * will use the rune ending just before [index] as the the current value.
 * @description Checks that moveNext and movePrevious set [current] correctly.
 * @author msyabro
 */
import "../../../Utils/expect.dart";

check(string, pos, current, prev) {
  var it = new RuneIterator.at(string, pos);
  it.moveNext();
  Expect.equals(current, it.current);

  it = new RuneIterator.at(string, pos);
  it.movePrevious();
  Expect.equals(prev, it.current);
}

main() {
  check('', 0, -1, -1);
  check('a', 1, -1, 0x61);
  check('\u{10000}', 0, 0x10000, -1);
  check('\u{10000}\u{10001}\x01', 2, 0x10001, 0x10000);
  check('\u{10000}\u{10001}\x01', 4, 0x01, 0x10001);
  check('string', 2, 0x72, 0x74);
  check('string', 3, 0x69, 0x72);
}
