// 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.

// @dart = 2.9

/// @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 the [codeUnits] start with the encoding of a [unicodeBomCharacterRune],
/// that character is discarded.
/// ...
/// @description Checks that if the [codeUnits] start with the encoding of a
/// [unicodeBomCharacterRune], that character is discarded
/// Test allowMalformed = true
/// @issue 28834
/// @author sgrekhov@unipro.ru

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

main() {
  Utf8Codec codec = new Utf8Codec();
  for (int i = 0; i < 128; i++) {
    String s = new String.fromCharCode(i);
    List<int> toDecode = [];
    toDecode.addAll(codec.encode(
        new String.fromCharCodes([unicodeBomCharacterRune])));
    toDecode.add(i);
    Expect.equals(s, codec.decode(toDecode, allowMalformed: true));
  }

  List<int> toDecode = [];
  toDecode.addAll(codec.encode(
      new String.fromCharCodes([unicodeBomCharacterRune])));
  toDecode.addAll([208, 154, 208, 184, 209, 128,
    208, 184, 208, 187, 208, 187, 208, 184, 209, 134, 208, 176, 32]);
  Expect.equals("Кириллица ", codec.decode(toDecode, allowMalformed: true));
}
