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