// 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 toString()
 * Returns a string representation of this object.
 * @description Checks that this method returns correct string representation of
 * the data URI. Test data URIs created by fromString() constructor
 * @author sgrekhov@unipro.ru
 */
import "dart:convert";
import "../../../Utils/expect.dart";
import "../Uri/UriDataEncoder.lib.dart";

check(String content, String mimeType, Encoding? encoding,
    Map<String, String> parameters, bool base64) {
  UriData uriData = new UriData.fromString(content, mimeType: mimeType,
      encoding: encoding, parameters: parameters, base64: base64);

  Expect.equals("data:" + encodeString(mimeType, encoding: encoding) +
      map2query(parameters) +
      (encoding == null ? "": ";charset=" + encoding.name) +
      (base64 ? ";base64" : "") + "," +
      (base64 ? base64Encode(content, encoding) : encodeString(content,
          encoding: encoding)), uriData.toString());
}

String map2query(Map<String, String> map) {
  StringBuffer sb = new StringBuffer();
  Iterator it = map.keys.iterator;
  while (it.moveNext()) {
    sb.write(";" + encodeString(it.current) + "=" +
        encodeString(map[it.current]!, encoding: Encoding.getByName("utf-8")));
  }
  return sb.toString();
}

String base64Encode(String str, Encoding? encoding) {
  List<int> bytes = [];
  Iterator it = str.runes.iterator;
  while (it.moveNext()) {
    int i = it.current;
    if (encoding != null) {
      List<int> codes = encoding.encode(new String.fromCharCode(i));
      bytes.addAll(codes);
    } else {
      bytes.add(i);
    }
  }
  return base64.encode(bytes);
}

main() {
  Encoding? utf8 = Encoding.getByName("utf-8");
  check("content", "mime/Type", null, {}, false);
  check("content", "mime/Type", utf8, {}, false);
  check("content", "mime/Type", utf8, {}, true);
  check("content data", "mime / Type ", null, {" a ": " b "}, true);
  check("Кириллица", "mime / Type ", utf8, {}, false);
  check("Кириллица", "mime / Type ", utf8, {}, true);
  check("а", "mime / Type ", utf8, {}, true);
  check(reserved, "mime / Type ", null, {}, true);
  check(reserved, "mime / Type ", null, {}, false);
  check(reserved, "mime / Type ", null, {"charset": "utf-8"}, true);
  check(unreserved, "mime / Type ", null, {}, true);
  check(unreserved, "mime / Type ", null, {}, false);
  check(unreserved, "mime / Type ", null, {"charset": "utf-8"}, true);
  check("content", "кириллица/прекрасна", utf8, {}, true);
  check("content", "кириллица/прекрасна", utf8, {}, false);
  check("content", "image/gif", null, {" a " : " b "}, false);
}
