// 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 Uri.dataFromString(
 *  String content, {
 *  String mimeType,
 *  Encoding encoding,
 *  Map<String, String> parameters,
 *  bool base64: false
 *  })
 * Creates a data: URI containing the content string.
 * ...
 * If encoding is not provided and parameters has a charset entry, that name is
 * looked up using Encoding.getByName, and if the lookup returns an encoding,
 * that encoding is used to convert content to bytes. If providing both an
 * encoding and a charset parameter, they should agree, otherwise decoding
 * won't be able to use the charset parameter to determine the encoding.
 * ...
 * @description Checks that if both an encoding and a charset parameter are
 * specified and they disagree, then encoding parameter is used
 * @author sgrekhov@unipro.ru
 */
import "dart:convert";
import "../../../Utils/expect.dart";
import "UriDataEncoder.lib.dart";

check(String content, Map<String, String> parameters) {
  Uri uri = new Uri.dataFromString(content, parameters: parameters);

  Expect.equals(encodeString(content, encoding:
    Encoding.getByName(parameters["charset"])), uri.data?.contentText);
  Expect.equals("text/plain", uri.data?.mimeType);
  Expect.mapEquals(parameters, uri.data?.parameters);
  Expect.equals("data:;charset=" + parameters["charset"].toString() + "," +
      encodeString(content, encoding: Encoding.getByName(parameters["charset"])),
      uri.data.toString());

  Expect.equals("data", uri.scheme);
  Expect.equals("", uri.userInfo);
  Expect.equals("", uri.host);
  Expect.equals(0, uri.port);
  Expect.equals("", uri.fragment);
}

main() {
  String content = "Non-ASCII: Кириллица прекрасна!";
  Encoding? encoding = Encoding.getByName("utf-8");

  Expect.throws(() {
    new Uri.dataFromString(content, encoding: Encoding.getByName("US-ASCII"),
        parameters: {"charset": "utf-8"});
  });

  Uri uri = new Uri.dataFromString("Non-ASCII: Кириллица прекрасна!",
      encoding: encoding, parameters: {"charset": "US-ASCII"});
  Expect.equals(encodeString(content, encoding: encoding), uri.data?.contentText);
  Expect.equals("text/plain", uri.data?.mimeType);
  Expect.mapEquals({"charset": "US-ASCII"}, uri.data?.parameters);
  Expect.equals("data:;charset=US-ASCII," +
      encodeString(content, encoding: encoding), uri.data.toString());

  Expect.equals("data", uri.scheme);
  Expect.equals("", uri.userInfo);
  Expect.equals("", uri.host);
  Expect.equals(0, uri.port);
  Expect.equals("", uri.fragment);
}
