/*
 * 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.
 *
 * Converts the content to a bytes using encoding or the charset specified in
 * parameters (defaulting to US-ASCII if not specified or unrecognized), then
 * encodes the bytes into the resulting data URI.
 *
 * Defaults to encoding using percent-encoding (any non-ASCII or non-URI-valid
 * bytes is replaced by a percent encoding). If base64 is true, the bytes are
 * instead encoded using BASE64.
 *
 * 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.
 *
 * If mimeType and/or parameters are supplied, they are added to the created
 * URI. If any of these contain characters that are not allowed in the data URI,
 * the character is percent-escaped. If the character is non-ASCII, it is first
 * UTF-8 encoded and then the bytes are percent encoded. An omitted mimeType in
 * a data URI means text/plain, just as an omitted charset parameter defaults to
 * meaning US-ASCII.
 * @description Checks that this constructor creates an expected Uri. Test
 * default parameters
 * @author sgrekhov@unipro.ru
 */
import "../../../Utils/expect.dart";
import "UriDataEncoder.lib.dart";

check(String content) {
  Uri uri = new Uri.dataFromString(content);

  Expect.equals(encodeString(content), uri.data?.contentText);
  Expect.equals("text/plain", uri.data?.mimeType);
  Expect.mapEquals({}, uri.data?.parameters);
  Expect.equals("data:," + encodeString(content), 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() {
  check("");
  check(reserved);
  check(unreserved);

  String s = "";
  for (int i = 0; i < 128; i++) {
    s += new String.fromCharCode(i);
  }
  check(s);
}
