// Copyright (c) 2012, 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";
import "dart:typed_data";

main() {
  Iterable<int> iter(count, [values]) => values is List
      ? new Iterable<int>.generate(count, (x) => values[x])
      : new Iterable<int>.generate(count, (x) => values);
  void test(String expect, Iterable<int> iter, [int start = 0, int? end]) {
    var actual = new String.fromCharCodes(iter, start, end);
    Expect.equals(
      expect,
      actual,
      '$iter:${iter.runtimeType}[${start > 0 ? start : ""}:${end ?? ""}]',
    );
  }

  testThrows(iterable, [start = 0, end]) {
    Expect.throws(() {
      new String.fromCharCodes(iterable, start, end);
    });
  }

  test("", iter(0));
  test("", <int>[]);
  test("", const <int>[]);
  test("", new List<int>.empty());
  test("", new Uint8List(0));
  test("", new Uint16List(0));
  test("", new Uint32List(0));
  test("", "".codeUnits);

  test("\x00", iter(1, 0));
  test("\x00", [0]);
  test("\x00", const [0]);
  test("\x00", new List<int>.filled(1, 0));
  test("\x00", new Uint8List(1));
  test("\x00", new Uint16List(1));
  test("\x00", new Uint32List(1));
  test("\x00", "\x00".codeUnits);

  test("\xff", iter(1, 255));
  test("\xFF", [255]);
  test("\xFF", const [255]);
  test("\xFF", new List<int>.filled(1, 255));
  test("\xFF", new Uint8List(1)..[0] = 255);
  test("\xFF", new Uint16List(1)..[0] = 255);
  test("\xFF", new Uint32List(1)..[0] = 255);
  test("\xFF", "\xFF".codeUnits);

  test("\u0100", iter(1, 256));
  test("\u0100", [256]);
  test("\u0100", const [256]);
  test("\u0100", new List<int>.filled(1, 256));
  test("\u0100", new Uint16List(1)..[0] = 256);
  test("\u0100", new Uint32List(1)..[0] = 256);
  test("\u0100", "\u0100".codeUnits);

  test("\uffff", iter(1, 65535));
  test("\uffff", [65535]);
  test("\uffff", const [65535]);
  test("\uffff", new List<int>.filled(1, 65535));
  test("\uffff", new Uint16List(1)..[0] = 65535);
  test("\uffff", new Uint32List(1)..[0] = 65535);
  test("\uffff", "\uffff".codeUnits);

  test("\u{10000}", iter(1, 65536));
  test("\u{10000}", [65536]);
  test("\u{10000}", const [65536]);
  test("\u{10000}", new List<int>.filled(1, 65536));
  test("\u{10000}", new Uint32List(1)..[0] = 65536);
  test("\u{10000}", "\u{10000}".codeUnits);

  test("\u{10FFFF}", iter(1, 0x10FFFF));
  test("\u{10FFFF}", [0x10FFFF]);
  test("\u{10FFFF}", const [0x10FFFF]);
  test("\u{10FFFF}", new List<int>.filled(1, 0x10FFFF));
  test("\u{10FFFF}", new Uint32List(1)..[0] = 0x10FFFF);

  test("\u{10ffff}", iter(2, [0xDBFF, 0xDFFF]));
  test("\u{10ffff}", [0xDBFF, 0xDFFF]);
  test("\u{10ffff}", const [0xDBFF, 0xDFFF]);
  test(
    "\u{10ffff}",
    new List<int>.filled(2, -1)
      ..[0] = 0xDBFF
      ..[1] = 0xDFFF,
  );
  test(
    "\u{10ffff}",
    new Uint16List(2)
      ..[0] = 0xDBFF
      ..[1] = 0xDFFF,
  );
  test(
    "\u{10ffff}",
    new Uint32List(2)
      ..[0] = 0xDBFF
      ..[1] = 0xDFFF,
  );
  test("\u{10FFFF}", "\u{10FFFF}".codeUnits);

  var leadSurrogate = "\u{10ffff}"[0];
  test(leadSurrogate, iter(1, 0xDBFF));
  test(leadSurrogate, [0xDBFF]);
  test(leadSurrogate, const [0xDBFF]);
  test(leadSurrogate, new List<int>.filled(1, 0xDBFF));
  test(leadSurrogate, new Uint16List(1)..[0] = 0xDBFF);
  test(leadSurrogate, new Uint32List(1)..[0] = 0xDBFF);
  test(leadSurrogate, leadSurrogate.codeUnits);

  var tailSurrogate = "\u{10ffff}"[1];
  test(tailSurrogate, iter(1, 0xDFFF));
  test(tailSurrogate, [0xDFFF]);
  test(tailSurrogate, const [0xDFFF]);
  test(tailSurrogate, new List<int>.filled(1, 0xDFFF));
  test(tailSurrogate, new Uint16List(1)..[0] = 0xDFFF);
  test(tailSurrogate, new Uint32List(1)..[0] = 0xDFFF);
  test(tailSurrogate, tailSurrogate.codeUnits);

  testThrows(null);
  testThrows("not an iterable");
  testThrows(42);
  testThrows([-1]);
  testThrows(new List<int>.filled(1, -1));
  testThrows(const [-1]);
  testThrows(new Int8List(1)..[0] = -1);
  testThrows(new Int16List(1)..[0] = -1);
  testThrows(new Int32List(1)..[0] = -1);
  testThrows([0x110000]);
  testThrows(new List<int>.filled(1, 0x110000));
  testThrows(const [0x110000]);
  testThrows(new Int32List(1)..[0] = 0x110000);

  // Check start/end
  var list = const [0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48];
  for (var iterable in [
    iter(list.length, list),
    list.toList(growable: true),
    list.toList(growable: false),
    list,
    new Uint8List(8)..setRange(0, 8, list),
    new Uint16List(8)..setRange(0, 8, list),
    new Uint32List(8)..setRange(0, 8, list),
    "ABCDEFGH".codeUnits,
  ]) {
    test("ABCDEFGH", iterable);
    // start provided, end is null.
    test("ABCDEFGH", iterable, 0);
    test("BCDEFGH", iterable, 1);
    test("H", iterable, 7);
    test("", iterable, 8);
    test("", iterable, 10);
    // start = 0, end provided.
    test("ABCDEFGH", iterable, 0);
    test("A", iterable, 0, 1);
    test("AB", iterable, 0, 2);
    test("ABCDEFG", iterable, 0, 7);
    test("ABCDEFGH", iterable, 0, 8);
    test("ABCDEFGH", iterable, 0, 10);
    test("", iterable, 0, 0);
    // Both provided and start > 0.
    test("GH", iterable, 6, 8);
    test("GH", iterable, 6, 10);
    test("DE", iterable, 3, 5);
    test("", iterable, 8, 10);
    test("", iterable, 10, 12);
    test("", iterable, 3, 3);
  }
  // Can split surrogates in input, but not a single big code point.
  test(leadSurrogate, [0xDBFF, 0xDFFF], 0, 1);
  test(tailSurrogate, [0xDBFF, 0xDFFF], 1);
  test("\u{10FFFF}", [0x10FFFF], 0, 1);

  void testThrowsRange(iterable, [start = 0, end]) {
    Expect.throwsRangeError(
      () => new String.fromCharCodes(iterable, start, end),
    );
  }

  // Test varying slices of the code units of a string.
  testSubstring(string) {
    var codes = string.codeUnits;
    int length = string.length;
    for (var iterable in [
      iter(length, codes),
      codes.toList(growable: true),
      codes.toList(growable: false),
      new Uint16List(length)..setRange(0, length, codes),
      new Int32List(length)..setRange(0, length, codes),
      new Uint32List(length)..setRange(0, length, codes),
      codes,
    ]) {
      var newString = new String.fromCharCodes(iterable);
      Expect.equals(string, newString);
      for (int i = 0; i < length; i = i * 2 + 1) {
        test(string.substring(i), iterable, i);
        test(string.substring(0, i), iterable, 0, i);
        for (int j = 0; i + j < length; j = j * 2 + 1) {
          test(string.substring(i, i + j), iterable, i, i + j);
        }
      }

      testThrowsRange(iterable, -1);
      testThrowsRange(iterable, 0, -1);
      testThrowsRange(iterable, 2, 1);

      // Positions after end are acceptable.
      test(string, iterable, 0, length + 1);
      test(
        string.substring(string.length ~/ 2),
        iterable,
        string.length ~/ 2,
        length + 1,
      );
      test("", iterable, length + 1);
      test("", iterable, length + 1, length + 2);
    }
  }

  testSubstring("");
  testSubstring("ABCDEFGH");
  // length > 128
  testSubstring("ABCDEFGH" * 33);
  testSubstring("\x00" * 357);
  // length > 128 and non-ASCII.
  testSubstring("\uFFFD\uFFFE\u{10000}\u{10ffff}c\x00" * 37);

  // Large List.
  var megaList = ("abcde" * 200000).codeUnits.toList();
  test("abcde" * 199998, megaList, 5, 999995);
  // Large Uint8List.
  test("abcde" * 199998, new Uint8List.fromList(megaList), 5, 999995);

  const cLatin1 = const [0x00, 0xff];
  const cUtf16 = const [0x00, 0xffff, 0xdfff, 0xdbff, 0xdfff, 0xdbff];
  const cCodepoints = const [0x00, 0xffff, 0xdfff, 0x10ffff, 0xdbff];
  List<int> gLatin1 = cLatin1.toList(growable: true);
  List<int> gUtf16 = cUtf16.toList(growable: true);
  List<int> gCodepoints = cCodepoints.toList(growable: true);
  List<int> fLatin1 = cLatin1.toList(growable: false);
  List<int> fUtf16 = cUtf16.toList(growable: false);
  List<int> fCodepoints = cCodepoints.toList(growable: false);
  Uint8List bLatin1 = new Uint8List(2)..setRange(0, 2, cLatin1);
  Uint16List wLatin1 = new Uint16List(2)..setRange(0, 2, cLatin1);
  Uint16List wUtf16 = new Uint16List(6)..setRange(0, 6, cUtf16);
  Uint32List lLatin1 = new Uint32List(2)..setRange(0, 2, cLatin1);
  Uint32List lUtf16 = new Uint32List(6)..setRange(0, 6, cUtf16);
  Uint32List lCodepoints = new Uint32List(5)..setRange(0, 5, cCodepoints);
  Uint8List bvLatin1 = new Uint8List.view(bLatin1.buffer);
  Uint16List wvLatin1 = new Uint16List.view(wLatin1.buffer);
  Uint16List wvUtf16 = new Uint16List.view(wUtf16.buffer);
  Uint32List lvLatin1 = new Uint32List.view(lLatin1.buffer);
  Uint32List lvUtf16 = new Uint32List.view(lUtf16.buffer);
  Uint32List lvCodepoints = new Uint32List.view(lCodepoints.buffer);
  var buffer = new Uint8List(200).buffer;
  Uint8List bbLatin1 = new Uint8List.view(buffer, 3, 2)..setAll(0, bLatin1);
  Uint16List wbLatin1 = new Uint16List.view(buffer, 8, 2)..setAll(0, wLatin1);
  Uint16List wbUtf16 = new Uint16List.view(buffer, 16, 6)..setAll(0, wUtf16);
  Uint32List lbLatin1 = new Uint32List.view(buffer, 32, 2)..setAll(0, lLatin1);
  Uint32List lbUtf16 = new Uint32List.view(buffer, 64, 6)..setAll(0, lUtf16);
  Uint32List lbCodepoints = new Uint32List.view(buffer, 128, 5)
    ..setAll(0, lCodepoints);

  String sLatin1 = "\x00\xff";
  String sUnicode =
      "\x00\uffff$tailSurrogate$leadSurrogate$tailSurrogate$leadSurrogate";
  for (int i = 0; i < 2; i++) {
    for (int j = i + 1; j < 2; j++) {
      test(sLatin1.substring(i, j), cLatin1, i, j);
      test(sLatin1.substring(i, j), gLatin1, i, j);
      test(sLatin1.substring(i, j), fLatin1, i, j);
      test(sLatin1.substring(i, j), bLatin1, i, j);
      test(sLatin1.substring(i, j), wLatin1, i, j);
      test(sLatin1.substring(i, j), lLatin1, i, j);
      test(sLatin1.substring(i, j), bvLatin1, i, j);
      test(sLatin1.substring(i, j), wvLatin1, i, j);
      test(sLatin1.substring(i, j), lvLatin1, i, j);
      test(sLatin1.substring(i, j), bbLatin1, i, j);
      test(sLatin1.substring(i, j), wbLatin1, i, j);
      test(sLatin1.substring(i, j), lbLatin1, i, j);
    }
  }
  for (int i = 0; i < 6; i++) {
    for (int j = i + 1; j < 6; j++) {
      test(sUnicode.substring(i, j), cUtf16, i, j);
      test(sUnicode.substring(i, j), gUtf16, i, j);
      test(sUnicode.substring(i, j), fUtf16, i, j);
      test(sUnicode.substring(i, j), wUtf16, i, j);
      test(sUnicode.substring(i, j), lUtf16, i, j);
      test(sUnicode.substring(i, j), wvUtf16, i, j);
      test(sUnicode.substring(i, j), lvUtf16, i, j);
      test(sUnicode.substring(i, j), wbUtf16, i, j);
      test(sUnicode.substring(i, j), lbUtf16, i, j);
    }
  }
  for (int i = 0; i < 5; i++) {
    for (int j = i + 1; j < 5; j++) {
      int stringEnd = j < 4 ? j : j + 1;
      test(sUnicode.substring(i, stringEnd), cCodepoints, i, j);
      test(sUnicode.substring(i, stringEnd), gCodepoints, i, j);
      test(sUnicode.substring(i, stringEnd), fCodepoints, i, j);
      test(sUnicode.substring(i, stringEnd), lCodepoints, i, j);
      test(sUnicode.substring(i, stringEnd), lvCodepoints, i, j);
      test(sUnicode.substring(i, stringEnd), lbCodepoints, i, j);
    }
  }
}
