// 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 parse(String uri)
/// Parses a string as a data URI.
///
/// The string must have the format:
///
/// 'data:' (type '/' subtype)? (';' attribute '=' value)* (';base64')? ',' data
/// where type, subtype, attribute and value are specified in RFC-2045, and data
/// is a sequence of URI-characters (RFC-2396 uric).
///
/// This means that all the characters must be ASCII, but the URI may contain
/// percent-escapes for non-ASCII byte values that need an interpretation to be
/// converted to the corresponding string.
///
/// Parsing doesn't check the validity of any part, it just checks that the input
/// has the correct structure with the correct sequence of /, ;, = and ,
/// delimiters.
///
/// Accessing the individual parts may fail later if they turn out to have
/// content that can't be decoded successfully as a string.
/// @description Checks that valid data URI is parsed as expected
/// @author sgrekhov@unipro.ru

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

check(String uri, String data, String mimeType, Map<String, String> parameters,
    String charset, bool isBase64) {
  UriData uriData = UriData.parse(uri);

  Expect.equals(data, uriData.contentText);
  Expect.equals(mimeType, uriData.mimeType);
  Expect.mapEquals(parameters, uriData.parameters);
  Expect.equals(charset, uriData.charset);
  Expect.equals(isBase64, uriData.isBase64);
}

main() {
  check("data:text/plain;a=b;base64,dataaaa", "dataaaa=", "text/plain",
    {"a": "b"}, "US-ASCII", true);
  check("data:;a=b;base64,dataaaa", "dataaaa=", "text/plain", {"a": "b"},
      "US-ASCII", true);
  check("data:;a=b;charset=utf-8;base64,dataaaa", "dataaaa=", "text/plain",
      {"a": "b", "charset": "utf-8"}, "utf-8", true);
  check("data:image/gif;a=b;charset=utf-8;base64,dataaaa", "dataaaa=",
      "image/gif", {"a": "b", "charset": "utf-8"}, "utf-8", true);
  check("data:a/b;a=b,dataaaa", "dataaaa", "a/b", {"a": "b"}, "US-ASCII", false);
  check("data:a/b;a=b,", "", "a/b", {"a": "b"}, "US-ASCII", false);
  check("data:,", "", "text/plain", {}, "US-ASCII", false);

  String data = " Some data % ";
  check("data:a/b;a=b," + Uri.encodeComponent(data), Uri.encodeComponent(data),
      "a/b", {"a": "b"}, "US-ASCII", false);
}
