// 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 this method throws FormatException if string is not
/// valid as a data IRI
/// @author sgrekhov@unipro.ru

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

main() {
  Expect.throws(() {UriData.parse("data:text/plain;a=b;base64;,dataaaa");},
      (e) => e is FormatException);
  Expect.throws(() {UriData.parse("data:text/plain;a=b;base64;,dataaaa");},
      (e) => e is FormatException);
  Expect.throws(() {UriData.parse("http:text/plain;a=b;base64,dataaaa");},
      (e) => e is FormatException);
  Expect.throws(() {UriData.parse("data:");},
      (e) => e is FormatException);
}
