/*
 * $Id: MessagesMapTestCase.java 471754 2006-11-06 14:55:09Z husted $
 *
 * 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.struts.faces.util;


import java.util.Collections;
import java.util.Locale;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import org.apache.struts.util.MessageResources;


/**
 * <p>Unit tests for <code>MessagesMap</code>.</p>
 */

public class MessagesMapTestCase extends TestCase {


    // ------------------------------------------------------ Instance Variables


    /**
     * <p>The <code>MessagesMap</code> instance to be tested.</p>
     */
    protected MessagesMap map = null;


    /**
     * <p>The <code>MessageResources</code> instance containing the messages
     * used for testing.</p>
     */
    protected MessageResources resources = null;


    // ------------------------------------------------------------ Constructors


    /**
     * <p>Construct a new instance of this test case.</p>
     *
     * @param name Name of the test case
     */
    public MessagesMapTestCase(String name) {

        super(name);

    }


    // ---------------------------------------------------- Overall Test Methods


    /**
     * <p>Set up instance variables required by this test case.</p>
     */
    public void setUp() throws Exception {

        resources =
            MessageResources.getMessageResources
            ("org.apache.struts.faces.util.Bundle");
        map = new MessagesMap(resources, Locale.getDefault());

    }


    /**
     * <p>Return the tests included in this test suite.</p>
     */
    public static Test suite() {

        return new TestSuite(MessagesMapTestCase.class);

    }


    /**
     * <p>Tear down instance variables required by this test case.</p>
     */
    public void teaDown() throws Exception {

        map = null;
        resources = null;

    }


    // -------------------------------------------------- Individal Test Methods


    /**
     * <p>Test the <code>containsKey()</code> method.</p>
     */
    public void testContainsKey() throws Exception {

        // Positive tests
        assertTrue(map.containsKey("foo"));
        assertTrue(map.containsKey("bar"));
        assertTrue(map.containsKey("baz"));

        // Negative tests
        assertTrue(!map.containsKey("bop"));

    }


    /**
     * <p>Test the <code>get()</code> method.</p>
     */
    public void testGet() throws Exception {

        // Positive tests
        assertEquals("This is foo", (String) map.get("foo"));
        assertEquals("And this is bar", (String) map.get("bar"));
        assertEquals("We also have baz", (String) map.get("baz"));

        // Negative tests
        assertNull(map.get("bop"));

    }


    /**
     * <p>Test a pristine instance, and all unsupported methods.</p>
     */
    public void testPristine() throws Exception {

        // clear()
        try {
            map.clear();
            fail("clear() should have thrown UnsupportedOperationException");
        } catch (UnsupportedOperationException e) {
            ; // Expected result
        }

        // containsValue()
        try {
            map.containsValue("foo");
            fail("containsValue() should have thrown UnsupportedOperationException");
        } catch (UnsupportedOperationException e) {
            ; // Expected result
        }

        // entrySet()
        try {
            map.entrySet();
            fail("entrySet() should have thrown UnsupportedOperationException");
        } catch (UnsupportedOperationException e) {
            ; // Expected result
        }

        // keySet()
        try {
            map.keySet();
            fail("keySet() should have thrown UnsupportedOperationException");
        } catch (UnsupportedOperationException e) {
            ; // Expected result
        }

        // put()
        try {
            map.put("foo", "bar");
            fail("put() should have thrown UnsupportedOperationException");
        } catch (UnsupportedOperationException e) {
            ; // Expected result
        }

        // putAll()
        try {
            map.putAll(Collections.EMPTY_MAP);
            fail("putAll() should have thrown UnsupportedOperationException");
        } catch (UnsupportedOperationException e) {
            ; // Expected result
        }

        // remove()
        try {
            map.remove("foo");
            fail("remove() should have thrown UnsupportedOperationException");
        } catch (UnsupportedOperationException e) {
            ; // Expected result
        }

        // size()
        try {
            map.size();
            fail("size() should have thrown UnsupportedOperationException");
        } catch (UnsupportedOperationException e) {
            ; // Expected result
        }

        // size()
        try {
            map.values();
            fail("values() should have thrown UnsupportedOperationException");
        } catch (UnsupportedOperationException e) {
            ; // Expected result
        }

    }


}
