/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.openejb.util;

import junit.framework.TestCase;

import java.net.URI;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * @version $Rev$ $Date$
 */
public class URISupportTest extends TestCase {
    public void test() throws Exception {
        final URI absoluteA = new URI("/Users/dblevins/work/openejb3/container/openejb-jee/apple/");
        final URI absoluteB = new URI("/Users/dblevins/work/openejb3/container/openejb-core/foo.jar");

        final URI relativeB = URISupport.relativize(absoluteA, absoluteB);

        assertEquals("../../openejb-core/foo.jar", relativeB.toString());

        final URI resolvedB = absoluteA.resolve(relativeB);
        assertTrue(resolvedB.equals(absoluteB));
    }

    public void testFragment() throws Exception {
        final URI absoluteA = new URI("/Users/dblevins/work/openejb3/container/openejb-jee/apple/");
        final URI absoluteB = new URI("/Users/dblevins/work/openejb3/container/openejb-core/foo.jar#foo");

        final URI relativeB = URISupport.relativize(absoluteA, absoluteB);

        assertEquals("../../openejb-core/foo.jar#foo", relativeB.toString());

        final URI resolvedB = absoluteA.resolve(relativeB);
        assertTrue(resolvedB.equals(absoluteB));
    }

    public void testAddNewParameters() throws Exception {
        final Map<String, String> parameters = new HashMap<String, String>();
        parameters.put("create", "false");

        final URI uri = URISupport.addParameters(URLs.uri("vm://broker"), parameters);
        assertEquals("vm://broker?create=false", uri.toString());
    }

    public void testDoNotReplaceAnExistingParameters() throws Exception {
        final Map<String, String> parameters = new HashMap<String, String>();
        parameters.put("create", "false");

        final URI uri = URISupport.addParameters(URLs.uri("vm://broker?create=true"), parameters);
        assertEquals("vm://broker?create=true", uri.toString());
    }

    public void testAddToSetOfAlreadyExistingParameters() throws Exception {
        final Map<String, String> parameters = new HashMap<String, String>();
        parameters.put("create", "false");

        final URI uri = URISupport.addParameters(URLs.uri("vm://broker?foo=bar&boo=baz&welcome=helloworld"), parameters);
        final Map<String, String> actual = URISupport.parseParamters(uri);

        assertEquals(4, actual.size());
        assertEquals("bar", actual.get("foo"));
        assertEquals("baz", actual.get("boo"));
        assertEquals("helloworld", actual.get("welcome"));
        assertEquals("false", actual.get("create"));
    }

    public void testAddToSetOfAlreadyExistingParametersButDontOverwriteExistingParameter() throws Exception {
        final Map<String, String> parameters = new HashMap<String, String>();
        parameters.put("create", "false");

        final URI uri = URISupport.addParameters(URLs.uri("vm://broker?foo=bar&boo=baz&welcome=helloworld&create=true"), parameters);
        final Map<String, String> actual = URISupport.parseParamters(uri);

        assertEquals(4, actual.size());
        assertEquals("bar", actual.get("foo"));
        assertEquals("baz", actual.get("boo"));
        assertEquals("helloworld", actual.get("welcome"));
        assertEquals("true", actual.get("create"));
    }

    public void testNullParameters() throws Exception {
        final URI initial = URLs.uri("vm://broker?foo=bar&boo=baz&welcome=helloworld&create=true");
        final URI uri = URISupport.addParameters(initial, null);

        assertEquals(initial, uri);
    }

    public void testEmptyParameters() throws Exception {
        final URI initial = URLs.uri("vm://broker?foo=bar&boo=baz&welcome=helloworld&create=true");
        final URI uri = URISupport.addParameters(initial, Collections.<String, String>emptyMap());

        assertEquals(initial, uri);
    }
}
