// 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 '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));
  }

  testDecodeSlice();
  testErrorOffset();
}

void testDecodeSlice() {
  var decoder = UTF8.decoder; // Doesn't allow malformed.
  var ascii = [0x41, 0x42, 0x43, 0x44, 0x45];
  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));

  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 utf8 = [0xc2, 0x81, 0xc2, 0x82, 0xe1, 0x81, 0x81];
  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));
  Expect.throws(() => decoder.convert(utf8, 1));
  Expect.throws(() => decoder.convert(utf8, 0, 1));
  Expect.throws(() => decoder.convert(utf8, 2, 5));
}

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);
  }

  // Bad encoding, points to first bad byte.
  testExn([0x80, 0x00], 0);
  testExn([0xC0, 0x00], 1);
  testExn([0xE0, 0x00], 1);
  testExn([0xE0, 0x80, 0x00], 2);
  testExn([0xF0, 0x00], 1);
  testExn([0xF0, 0x80, 0x00], 2);
  testExn([0xF0, 0x80, 0x80, 0x00], 3);
  testExn([0xF8, 0x00], 0);
  // Short encoding, points to end.
  testExn([0xC0], 1);
  testExn([0xE0], 1);
  testExn([0xE0, 0x80], 2);
  testExn([0xF0], 1);
  testExn([0xF0, 0x80], 2);
  testExn([0xF0, 0x80, 0x80], 3);
  // Overlong encoding, points to start of encoding.
  testExn([0xC0, 0x80], 0);
  testExn([0xC1, 0xBF], 0);
  testExn([0xE0, 0x80, 0x80], 0);
  testExn([0xE0, 0x9F, 0xBF], 0);
  testExn([0xF0, 0x80, 0x80, 0x80], 0);
  testExn([0xF0, 0x8F, 0xBF, 0xBF], 0);
  // Invalid character (value too large, over 0x10FFFF).
  testExn([0xF4, 0x90, 0x80, 0x80], 0);
  testExn([0xF7, 0xBF, 0xBF, 0xBF], 0);
}
