// 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 List<int> contentAsBytes()
/// The content part of the data URI as bytes.
/// If the data is Base64 encoded, it will be decoded to bytes.
///
/// If the data is not Base64 encoded, it will be decoded by unescaping
/// percent-escaped characters and returning byte values of each unescaped
/// character. The bytes will not be, e.g., UTF-8 decoded.
/// @description Checks that this method returns the content part of the data URI
/// as bytes. Test not Base64 encoded strings
/// @author sgrekhov@unipro.ru

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

check(String content, [Encoding? encoding]) {
  UriData uriData = new UriData.fromString(content, encoding: encoding);
  List<int> expected = content.codeUnits;
  if (encoding != null) {
    expected = string2bytes(content, encoding);
  }
  Expect.listEquals(expected, uriData.contentAsBytes());
}

List<int> string2bytes(String str, Encoding? encoding) {
  List<int> bytes = [];
  Iterator i = str.codeUnits.iterator;
  while (i.moveNext()) {
    int charCode = i.current;
    String char = new String.fromCharCode(charCode);
    List<int>? codes = encoding?.encode(char);
    if (codes != null) {
      bytes.addAll(codes);
    }
  }
  return bytes;
}

main() {
  check("Some data");
  check("Non-ASCII: Кириллица прекрасна", Encoding.getByName("utf-8"));
}
