// Copyright (c) 2017, 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.

/// @assertion String decode(List<int> codeUnits, {bool allowMalformed})
/// Decodes the UTF-8 codeUnits (a list of unsigned 8-bit integers) to the
/// corresponding string.
/// ...
/// If allowMalformed is true the decoder replaces invalid (or unterminated)
/// character sequences with the Unicode Replacement character U+FFFD (�).
/// Otherwise it throws a FormatException.
/// @description Checks that this method throws FormatException for invalid or
/// unterminated character sequences
/// Invalid characters taken from
/// http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
/// @issue 28832
/// @author sgrekhov@unipro.ru

import "dart:convert";
import "../../../Utils/expect.dart";

check(List<int> toDecode) {
  Utf8Codec codec = new Utf8Codec();
  Expect.throws(() {
    codec.decode(toDecode);
  }, (e) => e is FormatException);

  Expect.throws(() {
    codec.decode(toDecode, allowMalformed: false);
  }, (e) => e is FormatException);
}

main() {
  //Sequence of all 64 possible continuation bytes (0x80-0xBF)
  for (int i = 0x80; i <= 0xBF; i++) {
    check([i]);
  }

  // All 32 first bytes of 2-byte sequences (0xc0-0xdf)
  for (int i = 0xC0; i <= 0xDF; i++) {
    check([i]);
  }

  // All 16 first bytes of 3-byte sequences (0xe0-0xef)
  for (int i = 0xE0; i <= 0xEF; i++) {
    check([i]);
  }

  // All 8 first bytes of 4-byte sequences (0xf0-0xf7)
  for (int i = 0xF0; i <= 0xF7; i++) {
    check([i]);
  }

  // All 4 first bytes of 5-byte sequences (0xf8-0xfb)
  for (int i = 0xF8; i <= 0xFB; i++) {
    check([i]);
  }

  // All 2 first bytes of 6-byte sequences (0xfc-0xfd)
  for (int i = 0xFC; i <= 0xFD; i++) {
    check([i]);
  }

  // The following two bytes cannot appear in a correct UTF-8 string
  check([0xFE]);
  check([0xFF]);
  check([0xFE, 0xFE, 0xFF, 0xFF]);

  // Overlong ASCII character
  check([0xC0, 0xAF]);
  check([0xE0, 0x80, 0xAF]);
  check([0xF0, 0x80, 0x80, 0xAF]);
  check([0xF8, 0x80, 0x80, 0x80, 0xAF]);
  check([0xFC, 0x80, 0x80, 0x80, 0x80, 0xAF]);

  // Maximum overlong sequences
  check([0xC1, 0xBF]);
  check([0xE0, 0x9F, 0xBF]);
  check([0xF0, 0x8F, 0xBF, 0xBF]);
  check([0xF8, 0x87, 0xBF, 0xBF, 0xBF]);
  check([0xFC, 0x83, 0xBF, 0xBF, 0xBF, 0xBF]);

  // Overlong representation of the NUL character
  check([0xC0, 0x80]);
  check([0xE0, 0x80, 0x80]);
  check([0xF0, 0x80, 0x80, 0x80]);
  check([0xF8, 0x80, 0x80, 0x80, 0x80]);
  check([0xFC, 0x80, 0x80, 0x80, 0x80, 0x80]);

  // Single UTF-16 surrogates
  check([0xED, 0xA0, 0x80]);
  check([0xED, 0xAD, 0xBF]);
  check([0xED, 0xAD, 0x80]);
  check([0xED, 0xAF, 0xBF]);
  check([0xED, 0xB0, 0x80]);
  check([0xED, 0xBE, 0x80]);
  check([0xED, 0xBF, 0xBF]);

  // Paired UTF-16 surrogates
  check([0xED, 0xA0, 0x80, 0xED, 0xB0, 0x80]);
  check([0xED, 0xA0, 0x80, 0xED, 0xBF, 0xBF]);
  check([0xED, 0xAD, 0xBF, 0xED, 0xB0, 0x80]);
  check([0xED, 0xAD, 0xBF, 0xED, 0xBF, 0xBF]);
  check([0xED, 0xAE, 0x80, 0xED, 0xB0, 0x80]);
  check([0xED, 0xAE, 0x80, 0xED, 0xBF, 0xBF]);
  check([0xED, 0xAF, 0xBF, 0xED, 0xB0, 0x80]);
  check([0xED, 0xAF, 0xBF, 0xED, 0xBF, 0xBF]);
}
