// 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 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);
}
