// Copyright (c) 2015, 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.

import "package:expect/expect.dart";
import "dart:convert";
import "dart:typed_data";

main() {
  testMediaType();

  testRoundTrip("");
  testRoundTrip("a");
  testRoundTrip("ab");
  testRoundTrip("abc");
  testRoundTrip("abcd");
  testRoundTrip("Content with special%25 characters: # ? = % # ? = %");
  testRoundTrip("blåbærgrød", utf8);
  testRoundTrip("blåbærgrød", latin1);

  testUriEquals("data:,abc?d");
  testUriEquals("DATA:,ABC?D");
  testUriEquals("data:,a%20bc?d");
  testUriEquals("DATA:,A%20BC?D");
  testUriEquals("data:,abc?d%23e"); // # must and will be is escaped.

  // Test that UriData.uri normalizes path and query.

  testUtf8Encoding("\u1000\uffff");
  testBytes();
  testInvalidCharacters();
  testNormalization();
  testErrors();
}

void testMediaType() {
  for (var mimeType in ["", "text/plain", "Text/PLAIN", "text/javascript"]) {
    for (var charset in ["", "US-ASCII", "UTF-8"]) {
      for (var base64 in ["", ";base64"]) {
        bool isBase64 = base64.isNotEmpty;
        // Parsing the URI from source:
        var charsetParameter = charset.isEmpty ? "" : ";charset=$charset";
        var text = "data:$mimeType$charsetParameter$base64,";
        var uri = UriData.parse(text);

        String expectedCharset = charset.isEmpty ? "US-ASCII" : charset;
        String expectedMimeType = mimeType.isEmpty ? "text/plain" : mimeType;

        Expect.equals(text, "$uri");
        Expect.equals(expectedMimeType, uri.mimeType);
        Expect.isTrue(uri.isMimeType(expectedMimeType));
        Expect.isTrue(uri.isMimeType(expectedMimeType.toUpperCase()));
        Expect.isTrue(uri.isMimeType(expectedMimeType.toLowerCase()));
        Expect.equals(expectedCharset, uri.charset);
        Expect.isTrue(uri.isCharset(expectedCharset));
        Expect.isTrue(uri.isCharset(expectedCharset.toLowerCase()));
        Expect.isTrue(uri.isCharset(expectedCharset.toUpperCase()));
        var expectedEncoding = Encoding.getByName(expectedCharset);
        if (expectedEncoding != null) {
          Expect.isTrue(uri.isEncoding(expectedEncoding));
        }
        Expect.equals(isBase64, uri.isBase64);

        // Creating the URI using a constructor:
        var encoding = Encoding.getByName(charset);
        uri = UriData.fromString(
          "",
          mimeType: mimeType,
          encoding: encoding,
          base64: isBase64,
        );
        expectedMimeType =
            (mimeType.isEmpty || mimeType.toLowerCase() == "text/plain")
            ? "text/plain"
            : mimeType;
        expectedEncoding = encoding;
        expectedCharset = expectedEncoding?.name ?? "US-ASCII";
        var expectedText =
            "data:"
            "${expectedMimeType == "text/plain" ? "" : expectedMimeType}"
            "${charset.isEmpty ? "" : ";charset=$expectedCharset"}"
            "${isBase64 ? ";base64" : ""}"
            ",";

        Expect.equals(expectedText, "$uri");
        Expect.equals(expectedMimeType, uri.mimeType);
        Expect.isTrue(uri.isMimeType(expectedMimeType));
        Expect.isTrue(uri.isMimeType(expectedMimeType.toUpperCase()));
        Expect.isTrue(uri.isMimeType(expectedMimeType.toLowerCase()));
        Expect.equals(expectedCharset, uri.charset);
        Expect.isTrue(uri.isCharset(expectedCharset));
        Expect.isTrue(uri.isCharset(expectedCharset.toLowerCase()));
        Expect.isTrue(uri.isCharset(expectedCharset.toUpperCase()));
        if (expectedEncoding != null) {
          Expect.isTrue(uri.isEncoding(expectedEncoding));
        }
        Expect.equals(isBase64, uri.isBase64);
      }
    }
  }
}

void testRoundTrip(String content, [Encoding? encoding]) {
  UriData dataUri = new UriData.fromString(content, encoding: encoding);
  Expect.isFalse(dataUri.isBase64);
  Uri uri = dataUri.uri;
  expectUriEquals(new Uri.dataFromString(content, encoding: encoding), uri);

  if (encoding != null) {
    UriData dataUriParams = new UriData.fromString(
      content,
      parameters: {"charset": encoding.name},
    );
    Expect.equals("$dataUri", "$dataUriParams");
  }

  Expect.equals(encoding ?? ascii, Encoding.getByName(dataUri.charset));
  Expect.equals(content, dataUri.contentAsString(encoding: encoding));
  Expect.equals(content, dataUri.contentAsString());
  Expect.equals(content, (encoding ?? ascii).decode(dataUri.contentAsBytes()));

  uri = dataUri.uri;
  Expect.equals(uri.toString(), dataUri.toString());
  Expect.equals(dataUri.toString(), new UriData.fromUri(uri).toString());

  dataUri = new UriData.fromBytes(content.codeUnits);
  Expect.listEquals(content.codeUnits, dataUri.contentAsBytes());
  Expect.equals(content, dataUri.contentAsString(encoding: latin1));

  uri = dataUri.uri;
  Expect.equals(uri.toString(), dataUri.toString());
  Expect.equals(dataUri.toString(), new UriData.fromUri(uri).toString());
  // Check that the URI is properly normalized.
  expectUriEquals(uri, Uri.parse("$uri"));
}

void testUtf8Encoding(String content) {
  UriData uri = new UriData.fromString(content, encoding: utf8);
  Expect.equals(content, uri.contentAsString(encoding: utf8));
  Expect.listEquals(utf8.encode(content), uri.contentAsBytes());
}

void testInvalidCharacters() {
  // SPACE, CTL and tspecial, plus '%' and '#' (URI gen-delim)
  // This contains all ASCII character that are not valid in attribute/value
  // parts.
  var invalid =
      '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x7f'
      ' ()<>@,;:"/[]?=%#\x80\u{1000}\u{10000}';
  var invalidNoSlash = invalid.replaceAll('/', '');
  var dataUri = new UriData.fromString(
    invalid,
    encoding: utf8,
    mimeType: "$invalidNoSlash/$invalidNoSlash",
    parameters: {invalid: invalid},
  );

  Expect.equals(invalid, dataUri.contentAsString());
  Expect.equals("$invalidNoSlash/$invalidNoSlash", dataUri.mimeType);
  Expect.equals(invalid, dataUri.parameters[invalid]);

  var uri = dataUri.uri;
  Expect.equals("$uri", "$dataUri");
  expectUriEquals(uri, Uri.parse("$uri")); // Check that it's canonicalized.
  Expect.equals("$dataUri", new UriData.fromUri(uri).toString());
}

void testBytes() {
  void testList(List<int> list) {
    var dataUri = new UriData.fromBytes(list);
    Expect.equals("application/octet-stream", dataUri.mimeType);
    Expect.isTrue(dataUri.isBase64);
    Expect.listEquals(list, dataUri.contentAsBytes());

    dataUri = new UriData.fromBytes(list, percentEncoded: true);
    Expect.equals("application/octet-stream", dataUri.mimeType);
    Expect.isFalse(dataUri.isBase64);
    Expect.listEquals(list, dataUri.contentAsBytes());

    var string = new String.fromCharCodes(list);

    dataUri = new UriData.fromString(string, encoding: latin1);
    Expect.equals("text/plain", dataUri.mimeType);
    Expect.isFalse(dataUri.isBase64);
    Expect.listEquals(list, dataUri.contentAsBytes());

    dataUri = new UriData.fromString(string, encoding: latin1, base64: true);
    Expect.equals("text/plain", dataUri.mimeType);
    Expect.isTrue(dataUri.isBase64);
    Expect.listEquals(list, dataUri.contentAsBytes());
  }

  void testLists(List<int> list) {
    testList(list);
    for (int i = 0; i < 27; i++) {
      testList(list.sublist(i, i + i)); // All lengths from 0 to 27.
    }
  }

  var bytes = new Uint8List(512);
  for (int i = 0; i < bytes.length; i++) {
    bytes[i] = i;
  }
  testLists(bytes);
  testLists(new List.from(bytes));
  testLists(new List.unmodifiable(bytes));
}

void testNormalization() {
  // Base-64 normalization.

  // Normalized URI-alphabet characters.
  Expect.equals(
    "data:;base64,AA/+",
    UriData.parse("data:;base64,AA_-").toString(),
  );
  // Normalized escapes.
  Expect.equals(
    "data:;base64,AB==",
    UriData.parse("data:;base64,A%42=%3D").toString(),
  );
  Expect.equals(
    "data:;base64,/+/+",
    UriData.parse("data:;base64,%5F%2D%2F%2B").toString(),
  );
  // Normalized padded data.
  Expect.equals(
    "data:;base64,AA==",
    UriData.parse("data:;base64,AA%3D%3D").toString(),
  );
  Expect.equals(
    "data:;base64,AAA=",
    UriData.parse("data:;base64,AAA%3D").toString(),
  );
  // Normalized unpadded data.
  Expect.equals(
    "data:;base64,AA==",
    UriData.parse("data:;base64,AA").toString(),
  );
  Expect.equals(
    "data:;base64,AAA=",
    UriData.parse("data:;base64,AAA").toString(),
  );

  // "URI normalization" of non-base64 content.
  var uri = UriData.parse("data:,\x20\xa0");
  Expect.equals("data:,%20%C2%A0", uri.toString());
  uri = UriData.parse("data:,x://x@y:[z]:42/p/./?q=x&y=z#?#\u1234\u{12345}");
  Expect.equals(
    "data:,x://x@y:%5Bz%5D:42/p/./?q=x&y=z%23?%23%E1%88%B4%F0%92%8D%85",
    uri.toString(),
  );
}

void testErrors() {
  // Invalid constructor parameters.
  Expect.throwsArgumentError(
    () => new UriData.fromBytes([], mimeType: "noslash"),
  );
  Expect.throwsArgumentError(() => new UriData.fromBytes([257]));
  Expect.throwsArgumentError(() => new UriData.fromBytes([-1]));
  Expect.throwsArgumentError(() => new UriData.fromBytes([0x10000000]));
  Expect.throwsArgumentError(
    () => new UriData.fromString("", mimeType: "noslash"),
  );

  Expect.throwsArgumentError(
    () => new Uri.dataFromBytes([], mimeType: "noslash"),
  );
  Expect.throwsArgumentError(() => new Uri.dataFromBytes([257]));
  Expect.throwsArgumentError(() => new Uri.dataFromBytes([-1]));
  Expect.throwsArgumentError(() => new Uri.dataFromBytes([0x10000000]));
  Expect.throwsArgumentError(
    () => new Uri.dataFromString("", mimeType: "noslash"),
  );

  // Empty parameters allowed, not an error.
  var uri = new UriData.fromString("", mimeType: "", parameters: {});
  Expect.equals("data:,", "$uri");
  // Empty parameter key or value is an error.
  Expect.throwsArgumentError(
    () => new UriData.fromString("", parameters: {"": "X"}),
  );
  Expect.throwsArgumentError(
    () => new UriData.fromString("", parameters: {"X": ""}),
  );

  // Not recognizing charset is an error.
  uri = UriData.parse("data:;charset=arglebargle,X");
  Expect.throws(() {
    uri.contentAsString();
  });
  // Doesn't throw if we specify the encoding.
  Expect.equals("X", uri.contentAsString(encoding: ascii));

  // Parse format.
  Expect.throwsFormatException(() => UriData.parse("notdata:,"));
  Expect.throwsFormatException(() => UriData.parse("text/plain,noscheme"));
  Expect.throwsFormatException(() => UriData.parse("data:noseparator"));
  Expect.throwsFormatException(() => UriData.parse("data:noslash,text"));
  Expect.throwsFormatException(
    () => UriData.parse("data:type/sub;noequals,text"),
  );
  Expect.throwsFormatException(() => UriData.parse("data:type/sub;knocomma="));
  Expect.throwsFormatException(
    () => UriData.parse("data:type/sub;k=v;nocomma"),
  );
  Expect.throwsFormatException(() => UriData.parse("data:type/sub;k=nocomma"));
  Expect.throwsFormatException(() => UriData.parse("data:type/sub;k=v;base64"));

  void formatError(String input) {
    Expect.throwsFormatException(
      () => UriData.parse("data:;base64,$input"),
      input,
    );
  }

  // Invalid base64 format (detected when parsed).
  for (var a = 0; a <= 4; a++) {
    for (var p = 0; p <= 4; p++) {
      // Base-64 encoding must have length divisible by four and no more
      // than two padding characters at the end.
      if (p < 3 && (a + p) % 4 == 0) continue;
      if (p == 0 && a > 1) continue;
      formatError("A" * a + "=" * p);
      formatError("A" * a + "%3D" * p);
    }
  }
  // Invalid base64 encoding: padding not at end.
  formatError("AA=A");
  formatError("A=AA");
  formatError("=AAA");
  formatError("A==A");
  formatError("==AA");
  formatError("===A");
  formatError("AAA%3D=");
  formatError("A%3D==");

  // Invalid unpadded data.
  formatError("A");
  formatError("AAAAA");

  // Invalid characters.
  formatError("AAA*");
  formatError("AAA\x00");
  formatError("AAA\\");
  formatError("AAA,");

  // Invalid escapes.
  formatError("AAA%25");
  formatError("AAA%7F");
  formatError("AAA%7F");
}

/// Checks that two [Uri]s are exactly the same.
expectUriEquals(Uri expect, Uri actual) {
  Expect.equals(expect.scheme, actual.scheme, "scheme");
  Expect.equals(expect.hasAuthority, actual.hasAuthority, "hasAuthority");
  Expect.equals(expect.userInfo, actual.userInfo, "userInfo");
  Expect.equals(expect.host, actual.host, "host");
  Expect.equals(expect.hasPort, actual.hasPort, "hasPort");
  Expect.equals(expect.port, actual.port, "port");
  Expect.equals(expect.port, actual.port, "port");
  Expect.equals(expect.hasQuery, actual.hasQuery, "hasQuery");
  Expect.equals(expect.query, actual.query, "query");
  Expect.equals(expect.hasFragment, actual.hasFragment, "hasFragment");
  Expect.equals(expect.fragment, actual.fragment, "fragment");
}

void testUriEquals(String uriText) {
  var data = UriData.parse(uriText);
  var uri = Uri.parse(uriText);
  Expect.equals(data.uri, uri);
  Expect.equals(data.toString(), uri.data.toString());
  Expect.equals(data.toString(), uri.toString());
}
