// 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:convert';
import 'dart:typed_data' show Uint8List;
import 'unicode_tests.dart';

String decode(List<int> bytes) => new Utf8Decoder().convert(bytes);

void main() {
  for (var test in UNICODE_TESTS) {
    List<int> bytes = test[0];
    String expected = test[1];
    Expect.stringEquals(expected, decode(bytes));
    Expect.stringEquals(expected, decode(new Uint8List.fromList(bytes)));
  }

  testDecodeSlice();
  testErrorOffset();
}

void testDecodeSlice() {
  var decoder = utf8.decoder; // Doesn't allow malformed.

  testAscii(List<int> ascii) {
    Expect.equals("ABCDE", decoder.convert(ascii));
    Expect.equals("ABCDE", decoder.convert(ascii, 0));
    Expect.equals("ABCDE", decoder.convert(ascii, 0, ascii.length));
    Expect.equals("CDE", decoder.convert(ascii, 2));
    Expect.equals("BCD", decoder.convert(ascii, 1, 4));
    Expect.equals("ABCD", decoder.convert(ascii, 0, 4));

    if (ascii is Uint8List) {
      Expect.equals("ABCDE", decoder.convert(Uint8List.sublistView(ascii, 0)));
      Expect.equals("ABCDE",
          decoder.convert(Uint8List.sublistView(ascii, 0, ascii.length)));
      Expect.equals("CDE", decoder.convert(Uint8List.sublistView(ascii, 2)));
      Expect.equals("BCD", decoder.convert(Uint8List.sublistView(ascii, 1, 4)));
      Expect.equals(
          "ABCD", decoder.convert(Uint8List.sublistView(ascii, 0, 4)));
    }

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

  var ascii = [0x41, 0x42, 0x43, 0x44, 0x45];
  testAscii(ascii);
  testAscii(new Uint8List.fromList(ascii));

  testUtf8(List<int> utf8) {
    Expect.equals("\u0081\u0082\u1041", decoder.convert(utf8));
    Expect.equals("\u0082\u1041", decoder.convert(utf8, 2));
    Expect.equals("\u0081\u0082", decoder.convert(utf8, 0, 4));
    Expect.equals("\u0082", decoder.convert(utf8, 2, 4));

    if (utf8 is Uint8List) {
      Expect.equals("\u0081\u0082\u1041",
          decoder.convert(Uint8List.sublistView(utf8, 0)));
      Expect.equals(
          "\u0082\u1041", decoder.convert(Uint8List.sublistView(utf8, 2)));
      Expect.equals(
          "\u0081\u0082", decoder.convert(Uint8List.sublistView(utf8, 0, 4)));
      Expect.equals(
          "\u0082", decoder.convert(Uint8List.sublistView(utf8, 2, 4)));
    }

    Expect.throws(() => decoder.convert(utf8, 1));
    Expect.throws(() => decoder.convert(utf8, 0, 1));
    Expect.throws(() => decoder.convert(utf8, 2, 5));
  }

  var utf8bytes = [0xc2, 0x81, 0xc2, 0x82, 0xe1, 0x81, 0x81];
  testUtf8(utf8bytes);
  testUtf8(new Uint8List.fromList(utf8bytes));
}

void testErrorOffset() {
  // Test that failed convert calls have an offset in the exception.
  testExn(input, offset) {
    Expect.throws(() {
      utf8.decoder.convert(input);
    }, (e) => e is FormatException && input == e.source && offset == e.offset);

    var typed = new Uint8List.fromList(input);
    Expect.throws(() {
      utf8.decoder.convert(typed);
    }, (e) => e is FormatException && typed == e.source && offset == e.offset);
  }

  // Bad encoding, points to first bad byte.
  testExn([0x80, 0x00], 0);
  testExn([0xC2, 0x00], 1);
  testExn([0xE2, 0x00], 1);
  testExn([0xE2, 0x80, 0x00], 2);
  testExn([0xF2, 0x00], 1);
  testExn([0xF2, 0x80, 0x00], 2);
  testExn([0xF2, 0x80, 0x80, 0x00], 3);
  testExn([0xF8, 0x00], 0);
  // Short encoding, points to end.
  testExn([0xC2], 1);
  testExn([0xE2], 1);
  testExn([0xE2, 0x80], 2);
  testExn([0xF2], 1);
  testExn([0xF2, 0x80], 2);
  testExn([0xF2, 0x80, 0x80], 3);
  // Overlong encoding, points to byte that gave enough information to conclude
  // that it was overlong.
  testExn([0xC0, 0x80], 0);
  testExn([0xC1, 0xBF], 0);
  testExn([0xE0, 0x80, 0x80], 1);
  testExn([0xE0, 0x9F, 0xBF], 1);
  testExn([0xF0, 0x80, 0x80, 0x80], 1);
  testExn([0xF0, 0x8F, 0xBF, 0xBF], 1);
  // Invalid character (value too large, over 0x10FFFF).
  testExn([0xF4, 0x90, 0x80, 0x80], 1);
  testExn([0xF7, 0xBF, 0xBF, 0xBF], 0);
}
