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

// @dart = 2.9

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