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

import "package:expect/expect.dart";

main() {
  test(String s) {
    List<int> units = s.codeUnits;
    List<int> expectedUnits = <int>[];
    for (int i = 0; i < s.length; i++) {
      expectedUnits.add(s.codeUnitAt(i));
    }

    Expect.equals(s.length, units.length);
    for (int i = 0; i < s.length; i++) {
      Expect.equals(s.codeUnitAt(i), units.elementAt(i));
    }

    // for-in
    var res = [];
    for (int unit in units) {
      res.add(unit);
    }
    Expect.listEquals(expectedUnits, res);

    // .map
    Expect.listEquals(expectedUnits.map((x) => x.toRadixString(16)).toList(),
        units.map((x) => x.toRadixString(16)).toList());

    if (s == "") {
      Expect.throwsStateError(() => units.first);
      Expect.throwsStateError(() => units.last);
      Expect.throwsRangeError(() => units[0]);
      Expect.throwsUnsupportedError(() => units[0] = 499);
      Expect.listEquals([], units.sublist(0, 0));
      Expect.equals(-1, units.indexOf(42));
      Expect.equals(-1, units.lastIndexOf(499));
    } else {
      Expect.equals(s.codeUnitAt(0), units.first);
      Expect.equals(s.codeUnitAt(s.length - 1), units.last);
      Expect.equals(s.codeUnitAt(0), units[0]);
      Expect.throwsUnsupportedError(() => units[0] = 499);
      List<int> sub = units.sublist(1);
      Expect.listEquals(s.substring(1, s.length).codeUnits, sub);
      Expect.equals(-1, units.indexOf(-1));
      Expect.equals(0, units.indexOf(units[0]));
      Expect.equals(-1, units.lastIndexOf(-1));
      Expect.equals(
          units.length - 1, units.lastIndexOf(units[units.length - 1]));
    }

    Iterable reversed = units.reversed;
    int i = units.length - 1;
    for (int codeUnit in reversed) {
      Expect.equals(units[i--], codeUnit);
    }
  }

  test("");
  test("abc");
  test("\x00\u0000\u{000000}");
  test("\u{ffff}\u{10000}\u{10ffff}");
  String string = new String.fromCharCodes(
      [0xdc00, 0xd800, 61, 0xd9ab, 0xd9ab, 0xddef, 0xddef, 62, 0xdc00, 0xd800]);
  test(string);
  string = "\x00\x7f\xff\u0100\ufeff\uffef\uffff"
      "\u{10000}\u{12345}\u{1d800}\u{1dc00}\u{1ffef}\u{1ffff}";
  test(string);

  // Reading each unit of a surrogate pair works.
  var r = "\u{10000}".codeUnits;
  var it = r.iterator;
  Expect.isTrue(it.moveNext());
  Expect.equals(0xD800, it.current);
  Expect.isTrue(it.moveNext());
  Expect.equals(0xDC00, it.current);
}
