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

void main() {
  Expect.equals("", new String.fromCharCodes(new List.empty()));
  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]));
  {
    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.filled(len, -1);
    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));
}
