// 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";

void main() {
  Expect.equals("", new String.fromCharCodes(new List(0)));
  Expect.equals("", new String.fromCharCodes([]));
  Expect.equals("", new String.fromCharCodes(const []));
  Expect.equals("AB", new String.fromCharCodes([65, 66]));
  Expect.equals("AB", new String.fromCharCodes(const [65, 66]));
  Expect.equals("Ærø", new String.fromCharCodes(const [0xc6, 0x72, 0xf8]));
  Expect.equals("\u{1234}", new String.fromCharCodes([0x1234]));
  Expect.equals("\u{12345}*", new String.fromCharCodes([0x12345, 42]));
  Expect.equals("", new String.fromCharCodes(new List()));
  {
    var a = <int>[];
    a.add(65);
    a.add(66);
    Expect.equals("AB", new String.fromCharCodes(a));
  }

  // Long list (bug 6919).
  for (int len in [499, 500, 501, 999, 100000]) {
    List<int> list = new List(len);
    for (int i = 0; i < len; i++) {
      list[i] = 65 + (i % 26);
    }
    for (int i = len - 9; i < len; i++) {
      list[i] = 48 + (len - i);
    }
    // We should not throw a stack overflow here.
    String long = new String.fromCharCodes(list);
    // Minimal sanity checking on the string.
    Expect.isTrue(long.startsWith('ABCDE'));
    Expect.isTrue(long.endsWith('987654321'));
    int middle = len ~/ 2;
    middle -= middle % 26;
    Expect.equals('XYZABC', long.substring(middle - 3, middle + 3));
    Expect.equals(len, long.length);
  }

  // Should work with iterables and non-default-lists (http://dartbug.com/8922)
  Expect.equals("CBA", new String.fromCharCodes([65, 66, 67].reversed));
  Expect.equals(
      "BCD", new String.fromCharCodes([65, 66, 67].map((x) => x + 1)));
  Expect.equals(
      "AC", new String.fromCharCodes([0x41, 0x42, 0x43].where((x) => x.isOdd)));
  Expect.equals(
      "CE",
      new String.fromCharCodes(
          [0x41, 0x42, 0x43].where((x) => x.isOdd).map((x) => x + 2)));
  Expect.equals(
      "ABC", new String.fromCharCodes(new Iterable.generate(3, (x) => 65 + x)));
  Expect.equals("ABC", new String.fromCharCodes("ABC".codeUnits));
  Expect.equals(
      "BCD", new String.fromCharCodes("ABC".codeUnits.map((x) => x + 1)));
  Expect.equals("BCD", new String.fromCharCodes("ABC".runes.map((x) => x + 1)));

  var nonBmpCharCodes = [0, 0xD812, 0xDC34, 0x14834, 0xDC34, 0xD812];
  var nonBmp = new String.fromCharCodes(nonBmpCharCodes);
  Expect.equals(7, nonBmp.length);
  Expect.equals(0, nonBmp.codeUnitAt(0));
  Expect.equals(0xD812, nonBmp.codeUnitAt(1)); // Separated surrogate pair
  Expect.equals(0xDC34, nonBmp.codeUnitAt(2));
  Expect.equals(0xD812, nonBmp.codeUnitAt(3)); // Single non-BMP code point.
  Expect.equals(0xDC34, nonBmp.codeUnitAt(4));
  Expect.equals(0xDC34, nonBmp.codeUnitAt(5)); // Unmatched surrogate.
  Expect.equals(0xD812, nonBmp.codeUnitAt(6)); // Unmatched surrogate.

  var reversedNonBmp = new String.fromCharCodes(nonBmpCharCodes.reversed);
  Expect.equals(7, reversedNonBmp.length);
  Expect.equals(0, reversedNonBmp.codeUnitAt(6));
  Expect.equals(0xD812, reversedNonBmp.codeUnitAt(5));
  Expect.equals(0xDC34, reversedNonBmp.codeUnitAt(4));
  Expect.equals(0xDC34, reversedNonBmp.codeUnitAt(3));
  Expect.equals(0xD812, reversedNonBmp.codeUnitAt(2));
  Expect.equals(0xDC34, reversedNonBmp.codeUnitAt(1));
  Expect.equals(0xD812, reversedNonBmp.codeUnitAt(0));

  Expect.equals(nonBmp, new String.fromCharCodes(nonBmp.codeUnits));
  Expect.equals(nonBmp, new String.fromCharCodes(nonBmp.runes));
}
