/*
 * Copyright 2007 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.http.client;

import com.google.gwt.junit.client.GWTTestCase;

/**
 * Tests for the URL utility class.
 */
public class URLTest extends GWTTestCase {

  private final String DECODED_URL = "http://www.foo \u00E9+bar.com/1_!~*'();/?@&=+$,#";
  private final String DECODED_URL_COMPONENT = "-_.!~*'():/#?@ \u00E9+";
  private final String ENCODED_URL = "http://www.foo%20%C3%A9+bar.com/1_!~*'();/?@&=+$,#";
  private final String ENCODED_URL_COMPONENT = "-_.!~*'()%3A%2F%23%3F%40%20%C3%A9%2B";
  private final String ENCODED_URL_COMPONENT_QS = "-_.!~*'()%3A%2F%23%3F%40+%C3%A9%2B";

  public String getModuleName() {
    return "com.google.gwt.http.HttpSuite";
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.URL#decode(java.lang.String)}.
   */
  public void testDecode() {
    try {
      URL.decode(null);
      fail("Expected NullPointerException");
    } catch (NullPointerException ex) {
      // expected exception was thrown
    }

    assertEquals("", URL.decode(""));
    assertEquals(" ", URL.decode(" "));

    String actualURL = URL.decode(ENCODED_URL);
    assertEquals(DECODED_URL, actualURL);
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.URL#decodeComponent(java.lang.String)}.
   */
  @SuppressWarnings("deprecation")
  public void testDecodeComponent() {
    try {
      URL.decodeComponent(null);
      fail("Expected NullPointerException");
    } catch (NullPointerException ex) {
      // expected exception was thrown
    }

    assertEquals("", URL.decodeComponent(""));
    assertEquals(" ", URL.decodeComponent(" "));
    assertEquals(" ", URL.decodeComponent("+"));
    assertEquals(" ", URL.decodeComponent("%20"));

    String actualURLComponent = URL.decodeComponent(ENCODED_URL_COMPONENT);
    assertEquals(DECODED_URL_COMPONENT, actualURLComponent);

    actualURLComponent = URL.decodeComponent(ENCODED_URL_COMPONENT_QS);
    assertEquals(DECODED_URL_COMPONENT, actualURLComponent);
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.URL#decodeComponent(java.lang.String,boolean)}.
   */
  @SuppressWarnings("deprecation")
  public void testDecodeComponent2() {
    try {
      URL.decodeComponent(null);
      fail("Expected NullPointerException");
    } catch (NullPointerException ex) {
      // expected exception was thrown
    }

    assertEquals("", URL.decodeComponent("", false));
    assertEquals("", URL.decodeComponent("", true));
    assertEquals(" ", URL.decodeComponent(" ", false));
    assertEquals(" ", URL.decodeComponent(" ", true));
    assertEquals("+", URL.decodeComponent("+", false));
    assertEquals(" ", URL.decodeComponent("+", true));
    assertEquals(" ", URL.decodeComponent("%20", false));
    assertEquals(" ", URL.decodeComponent("%20", true));

    String actualURLComponent = URL.decodeComponent(ENCODED_URL_COMPONENT, false);
    assertEquals(DECODED_URL_COMPONENT, actualURLComponent);

    actualURLComponent = URL.decodeComponent(ENCODED_URL_COMPONENT_QS, true);
    assertEquals(DECODED_URL_COMPONENT, actualURLComponent);
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.URL#decodePathSegment(java.lang.String,boolean)}.
   */
  public void testDecodePathSegment() {
    try {
      URL.decodePathSegment(null);
      fail("Expected NullPointerException");
    } catch (NullPointerException ex) {
      // expected exception was thrown
    }

    assertEquals("", URL.decodePathSegment(""));
    assertEquals(" ", URL.decodePathSegment(" "));
    assertEquals("+", URL.decodePathSegment("+"));
    assertEquals(" ", URL.decodePathSegment("%20"));

    String actualURLComponent = URL.decodePathSegment(ENCODED_URL_COMPONENT);
    assertEquals(DECODED_URL_COMPONENT, actualURLComponent);
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.URL#decodeQueryString(java.lang.String)}.
   */
  public void testDecodeQueryString() {
    try {
      URL.decodeQueryString(null);
      fail("Expected NullPointerException");
    } catch (NullPointerException ex) {
      // expected exception was thrown
    }

    assertEquals("", URL.decodeQueryString(""));
    assertEquals(" ", URL.decodeQueryString(" "));
    assertEquals(" ", URL.decodeQueryString("+"));
    assertEquals(" ", URL.decodeQueryString("%20"));

    String actualURLComponent = URL.decodeQueryString(ENCODED_URL_COMPONENT);
    assertEquals(DECODED_URL_COMPONENT, actualURLComponent);

    actualURLComponent = URL.decodeQueryString(ENCODED_URL_COMPONENT_QS);
    assertEquals(DECODED_URL_COMPONENT, actualURLComponent);
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.URL#encode(java.lang.String)}.
   */
  public void testEncode() {
    try {
      URL.encode(null);
      fail("Expected NullPointerException");
    } catch (NullPointerException ex) {
      // expected exception was thrown
    }

    assertEquals("", URL.encode(""));
    assertEquals("%20",URL.encode(" "));

    String actualURL = URL.encode(DECODED_URL);
    assertEquals(ENCODED_URL, actualURL);
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.URL#encodeComponent(java.lang.String)}.
   */
  @SuppressWarnings("deprecation")
  public void testEncodeComponent() {
    try {
      URL.encodeComponent(null);
      fail("Expected NullPointerException");
    } catch (NullPointerException ex) {
      // expected exception was thrown
    }

    assertEquals("", URL.encodeComponent(""));
    assertEquals("+", URL.encodeComponent(" "));

    String actualURLComponent = URL.encodeComponent(DECODED_URL_COMPONENT);
    assertEquals(ENCODED_URL_COMPONENT_QS, actualURLComponent);
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.URL#encodeComponent(java.lang.String,boolean)}.
   */
  @SuppressWarnings("deprecation")
  public void testEncodeComponent2() {
    try {
      URL.encodeComponent(null, false);
      fail("Expected NullPointerException");
    } catch (NullPointerException ex) {
      // expected exception was thrown
    }

    try {
      URL.encodeComponent(null, true);
      fail("Expected NullPointerException");
    } catch (NullPointerException ex) {
      // expected exception was thrown
    }

    assertEquals("", URL.encodeComponent("", false));
    assertEquals("", URL.encodeComponent("", true));
    assertEquals("%20", URL.encodeComponent(" ", false));
    assertEquals("+", URL.encodeComponent(" ", true));

    String actualURLComponent = URL.encodeComponent(DECODED_URL_COMPONENT, false);
    assertEquals(ENCODED_URL_COMPONENT, actualURLComponent);

    actualURLComponent = URL.encodeComponent(DECODED_URL_COMPONENT, true);
    assertEquals(ENCODED_URL_COMPONENT_QS, actualURLComponent);
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.URL#encodePathSegment(java.lang.String,boolean)}.
   */
  public void testEncodePathSegment() {
    try {
      URL.encodePathSegment(null);
      fail("Expected NullPointerException");
    } catch (NullPointerException ex) {
      // expected exception was thrown
    }

    assertEquals("", URL.encodePathSegment(""));
    assertEquals("%20", URL.encodePathSegment(" "));

    String actualURLComponent = URL.encodePathSegment(DECODED_URL_COMPONENT);
    assertEquals(ENCODED_URL_COMPONENT, actualURLComponent);
  }

  /**
   * Test method for
   * {@link com.google.gwt.http.client.URL#encodeQueryString(java.lang.String)}.
   */
  public void testEncodeQueryString() {
    try {
      URL.encodeQueryString(null);
      fail("Expected NullPointerException");
    } catch (NullPointerException ex) {
      // expected exception was thrown
    }

    assertEquals("", URL.encodeQueryString(""));
    assertEquals("+", URL.encodeQueryString(" "));

    String actualURLComponent = URL.encodeQueryString(DECODED_URL_COMPONENT);
    assertEquals(ENCODED_URL_COMPONENT_QS, actualURLComponent);
  }
}
