/**
   * Asserts that both URLs are equal, comparing credentials and properties as requested. If both
   * the <code>compareCredentials</code> and <code>compareProperties</code> parameters are <code>
   * true</code>, this method asserts that the hashcode of both URLs are the same.
   *
   * @param url1 first url to test
   * @param url2 second url to test
   * @param compareCredentials if <code>true</code>, the login and password parts of both FileURL
   *     need to be equal (case-sensitive) for the FileURL instances to be equal
   * @param compareProperties if <code>true</code>, all properties need to be equal (case-sensitive)
   *     in both FileURL for them to be equal
   */
  protected void assertEquals(
      FileURL url1, FileURL url2, boolean compareCredentials, boolean compareProperties) {
    assert url1.equals(url2, compareCredentials, compareProperties);
    assert url2.equals(url1, compareCredentials, compareProperties);

    // Compare hash codes only if both flags are true.
    if (compareCredentials && compareProperties) assert url1.hashCode() == url2.hashCode();
  }
  /**
   * Creates a URL from the given parts, ensuring that parsing it yields the given parts, and
   * returns it.
   *
   * @param login login part, may be <code>null</code>
   * @param password password part, may be <code>null</code>
   * @param host host part, may be <code>null</code>
   * @param port port part, <code>-1</code> for none
   * @param path path part
   * @param query query part, may be <code>null</code>
   * @return a URL corresponding to the given parts
   * @throws MalformedURLException if the URL cannot be parsed
   */
  protected FileURL getURL(
      String login, String password, String host, int port, String path, String query)
      throws MalformedURLException {
    String scheme = getScheme();
    StringBuffer sb = new StringBuffer(scheme + "://");

    if (host != null) {
      if (login != null) {
        sb.append(login);

        if (password != null) {
          sb.append(':');
          sb.append(password);
        }

        sb.append('@');
      }

      sb.append(host);

      if (port != -1) {
        sb.append(':');
        sb.append(port);
      }
    }

    path = getSchemePath(path);
    sb.append(path);

    if (query != null) {
      sb.append('?');
      sb.append(query);
    }

    // Assert that each of the url's parts match

    FileURL url = FileURL.getFileURL(sb.toString());

    assert scheme.equals(url.getScheme());

    if (host != null) {
      if (login != null) {
        assert login.equals(url.getLogin());
        assert url.containsCredentials();

        if (password != null) assert password.equals(url.getPassword());

        assert new Credentials(login, password).equals(url.getCredentials(), true);
      }

      assert host.equals(url.getHost());
      assert port == url.getPort();
    }

    if (query != null && !isQueryParsed()) {
      assert url.getQuery() == null;
      path = path + "?" + query;
    } else if (query == null) assert url.getQuery() == null;
    else assert query.equals(url.getQuery());

    assertPathEquals(path, url);

    // Test the URL's string representation
    assert url.equals(FileURL.getFileURL(url.toString(true, false)));
    assert url.equals(FileURL.getFileURL(url.toString(false, false)), false, false);

    return url;
  }
 /**
  * Asserts that both URLs are not equal, comparing credentials and properties as requested.
  *
  * @param url1 first url to test
  * @param url2 second url to test
  * @param compareCredentials if <code>true</code>, the login and password parts of both FileURL
  *     need to be equal (case-sensitive) for the FileURL instances to be equal
  * @param compareProperties if <code>true</code>, all properties need to be equal (case-sensitive)
  *     in both FileURL for them to be equal
  */
 protected void assertNotEquals(
     FileURL url1, FileURL url2, boolean compareCredentials, boolean compareProperties) {
   assert !url1.equals(url2, compareCredentials, compareProperties);
   assert !url2.equals(url1, compareCredentials, compareProperties);
 }
 /**
  * Asserts that both URLs are not equal.
  *
  * @param url1 first url to test
  * @param url2 second url to test
  */
 protected void assertNotEquals(FileURL url1, FileURL url2) {
   assert !url1.equals(url2);
   assert !url2.equals(url1);
 }
 /**
  * Asserts that both URLs are equal, and that their hashcodes are the same.
  *
  * @param url1 first url to test
  * @param url2 second url to test
  */
 protected void assertEquals(FileURL url1, FileURL url2) {
   assert url1.equals(url2);
   assert url2.equals(url1);
   assert url1.hashCode() == url2.hashCode();
 }