// 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 UriData.fromString(
///  String content, {
///  String mimeType,
///  Encoding encoding,
///  Map<String, String> parameters,
///  bool base64: false
///  })
/// Creates a data: URI containing the content string.
/// Equivalent to new Uri.dataFromString(...).data, but may be more efficient if
/// the uri itself isn't used.
/// @description Checks that this constructor creates an expected UriData. Test
/// parameters parameter specified
/// @author sgrekhov@unipro.ru

import "dart:convert";
import "../../../Utils/expect.dart";
import "../Uri/UriDataEncoder.lib.dart";

check(String content, Map<String, String> parameters) {
  UriData uriData = new UriData.fromString(content, parameters: parameters);

  Expect.equals(encodeString(content), uriData.contentText);
  Expect.equals("text/plain", uriData.mimeType);
  Expect.mapEquals(parameters, uriData.parameters);
  Expect.equals("data:" + map2query(parameters) + "," + encodeString(content),
      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();
}

main() {
  check("Some data", {"a": "b", "c": "d"});
  check("", {});
  check(reserved, {});
  check(unreserved, {"a": "b c"});
  check("Some data", {"a 1": "b"});
  check("Some data", {"a": "Кириллица прекрасна!"});
}
