// Copyright (c) 2013, 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";
import 'dart:convert';
import 'unicode_tests.dart';

List<int> encode(String str) => new Utf8Encoder().convert(str);
List<int> encode2(String str) => utf8.encode(str);

void main() {
  for (var test in UNICODE_TESTS) {
    List<int> bytes = test[0];
    String string = test[1];
    Expect.listEquals(bytes, encode(string));
    Expect.listEquals(bytes, encode2(string));
  }

  testEncodeSlice();
}

void testEncodeSlice() {
  var encoder = utf8.encoder;
  String ascii = "ABCDE";
  Expect.listEquals([0x41, 0x42, 0x43, 0x44, 0x45], encoder.convert(ascii));
  Expect.listEquals([0x41, 0x42, 0x43, 0x44, 0x45], encoder.convert(ascii, 0));
  Expect.listEquals(
      [0x41, 0x42, 0x43, 0x44, 0x45], encoder.convert(ascii, 0, 5));
  Expect.listEquals([0x42, 0x43, 0x44, 0x45], encoder.convert(ascii, 1));
  Expect.listEquals([0x41, 0x42, 0x43, 0x44], encoder.convert(ascii, 0, 4));
  Expect.listEquals([0x42, 0x43, 0x44], encoder.convert(ascii, 1, 4));

  Expect.throws(() => encoder.convert(ascii, -1)); //    start < 0.
  Expect.throws(() => encoder.convert(ascii, 6)); //     start > length
  Expect.throws(() => encoder.convert(ascii, 0, -1)); // end < 0
  Expect.throws(() => encoder.convert(ascii, 0, 6)); //  end > length
  Expect.throws(() => encoder.convert(ascii, 3, 2)); //  end < start

  var unicode = "\u0081\u0082\u1041\u{10101}";

  Expect.listEquals(
      [0xc2, 0x81, 0xc2, 0x82, 0xe1, 0x81, 0x81, 0xf0, 0x90, 0x84, 0x81],
      encoder.convert(unicode));
  Expect.listEquals(
      [0xc2, 0x81, 0xc2, 0x82, 0xe1, 0x81, 0x81, 0xf0, 0x90, 0x84, 0x81],
      encoder.convert(unicode, 0, unicode.length));
  Expect.listEquals([0xc2, 0x82, 0xe1, 0x81, 0x81, 0xf0, 0x90, 0x84, 0x81],
      encoder.convert(unicode, 1));
  Expect.listEquals(
      [0xc2, 0x82, 0xe1, 0x81, 0x81], encoder.convert(unicode, 1, 3));
  // Split in the middle of a surrogate pair.
  Expect.listEquals([0xc2, 0x82, 0xe1, 0x81, 0x81, 0xef, 0xbf, 0xbd],
      encoder.convert(unicode, 1, 4));
}
