/*
 * $Id$
 *
 * 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.tiles.jsp.taglib;

import static org.easymock.EasyMock.*;
import static org.easymock.classextension.EasyMock.*;
import static org.junit.Assert.*;

import java.io.IOException;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.TagData;
import javax.servlet.jsp.tagext.VariableInfo;

import org.apache.tiles.Attribute;
import org.apache.tiles.AttributeContext;
import org.apache.tiles.TilesContainer;
import org.apache.tiles.access.TilesAccess;
import org.apache.tiles.request.ApplicationContext;
import org.apache.tiles.request.jsp.JspRequest;
import org.apache.tiles.request.scope.ReflectionContextResolver;
import org.apache.tiles.request.util.ApplicationAccess;
import org.junit.Before;
import org.junit.Test;

/**
 * Tests {@link UseAttributeTag}.
 *
 * @version $Rev$ $Date$
 */
public class UseAttributeTagTest {

    /**
     * The tag to test.
     */
    private UseAttributeTag tag;

    /**
     * Sets up the test.
     */
    @Before
    public void setUp() {
        tag = new UseAttributeTag();
    }

    /**
     * Test method for {@link org.apache.tiles.jsp.taglib.UseAttributeTag#execute(org.apache.tiles.request.Request)}.
     * @throws IOException 
     * @throws JspException 
     */
    @Test
    public void testExecute() throws JspException, IOException {
        JspFragment jspBody = createMock(JspFragment.class);
        PageContext pageContext = createMock(PageContext.class);
        JspTag parent = createMock(JspTag.class);
        ApplicationContext applicationContext = createMock(ApplicationContext.class);
        HttpServletRequest httpServletRequest = createMock(HttpServletRequest.class);
        HttpServletResponse httpServletResponse = createMock(HttpServletResponse.class);
        @SuppressWarnings("unchecked")
        Map<String, Object> applicationScope = createMock(Map.class);
        TilesContainer container = createMock(TilesContainer.class);
        AttributeContext attributeContext = createMock(AttributeContext.class);
        Attribute attribute = createMock(Attribute.class);
        expect(pageContext.getAttribute(
                ApplicationAccess.APPLICATION_CONTEXT_ATTRIBUTE,
                PageContext.APPLICATION_SCOPE)).andReturn(applicationContext);
        expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
        expect(applicationScope.get(ApplicationAccess.CONTEXT_RESOLVER_ATTRIBUTE)).andReturn(new ReflectionContextResolver()).anyTimes();
        expect(pageContext.getRequest()).andReturn(httpServletRequest);
        expect(pageContext.getResponse()).andReturn(httpServletResponse);
        expect(pageContext.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, PageContext.REQUEST_SCOPE)).andReturn(container);
        expect(container.getAttributeContext(isA(JspRequest.class))).andReturn(attributeContext);
        expect(attributeContext.getAttribute("name")).andReturn(attribute);
        expect(container.evaluate(isA(Attribute.class), isA(JspRequest.class))).andReturn(new Integer(1));
        pageContext.setAttribute("id", new Integer(1), PageContext.PAGE_SCOPE);
        replay(jspBody, pageContext, parent, 
               applicationContext, httpServletRequest, httpServletResponse, 
               applicationScope, container, attributeContext, attribute);
        tag.setName("name");
        tag.setScope("page");
        tag.setId("id");
        tag.setIgnore(false);
        tag.setJspContext(pageContext);
        tag.setJspBody(jspBody);
        tag.setParent(parent);
        tag.doTag();
        verify(jspBody, pageContext, parent, 
               applicationContext, httpServletRequest, httpServletResponse, 
               container, attributeContext, attribute);
    }

    /**
     * Test method for {@link org.apache.tiles.jsp.taglib.UseAttributeTag#setId(java.lang.String)}.
     */
    @Test
    public void testSetId() {
        tag.setId("id");
        assertEquals("id", tag.getId());
    }

    /**
     * Test method for {@link org.apache.tiles.jsp.taglib.UseAttributeTag#getScope()}.
     */
    @Test
    public void testGetScope() {
        tag.setScope("scope");
        assertEquals("scope", tag.getScope());
    }

    /**
     * Test method for {@link org.apache.tiles.jsp.taglib.UseAttributeTag#setName(java.lang.String)}.
     */
    @Test
    public void testSetName() {
        tag.setName("name");
        assertEquals("name", tag.getName());
    }

    /**
     * Test method for {@link org.apache.tiles.jsp.taglib.UseAttributeTag#setIgnore(boolean)}.
     */
    @Test
    public void testSetIgnore() {
        tag.setIgnore(true);
        assertTrue(tag.isIgnore());
    }

    /**
     * Test method for {@link org.apache.tiles.jsp.taglib.UseAttributeTag#setClassname(java.lang.String)}.
     */
    @Test
    public void testSetClassname() {
        tag.setClassname("classname");
        assertEquals("classname", tag.getClassname());
    }

    /**
     * Test method for {@link org.apache.tiles.jsp.taglib.UseAttributeTag#getScriptingVariable()}.
     */
    @Test
    public void testGetScriptingVariable() {
        tag.setName("name");
        assertEquals("name", tag.getScriptingVariable());
        tag.setId("id");
        assertEquals("id", tag.getScriptingVariable());
    }

    /**
     * Tests {@link UseAttributeTag.Tei}.
     */
    @Test
    public void testTei() {
        TagData tagData = createMock(TagData.class);

        expect(tagData.getAttributeString("classname")).andReturn("my.Clazz");
        expect(tagData.getAttributeString("id")).andReturn("id");

        replay(tagData);
        UseAttributeTag.Tei tei = new UseAttributeTag.Tei();
        VariableInfo[] infos = tei.getVariableInfo(tagData);
        assertEquals(1, infos.length);
        VariableInfo info = infos[0];
        assertEquals("id", info.getVarName());
        assertEquals("my.Clazz", info.getClassName());
        assertTrue(info.getDeclare());
        assertEquals(VariableInfo.AT_END, info.getScope());
        verify(tagData);
    }

    /**
     * Tests {@link UseAttributeTag.Tei}.
     */
    @Test
    public void testTeiDefaults() {
        TagData tagData = createMock(TagData.class);

        expect(tagData.getAttributeString("classname")).andReturn(null);
        expect(tagData.getAttributeString("id")).andReturn(null);
        expect(tagData.getAttributeString("name")).andReturn("name");

        replay(tagData);
        UseAttributeTag.Tei tei = new UseAttributeTag.Tei();
        VariableInfo[] infos = tei.getVariableInfo(tagData);
        assertEquals(1, infos.length);
        VariableInfo info = infos[0];
        assertEquals("name", info.getVarName());
        assertEquals("java.lang.Object", info.getClassName());
        assertTrue(info.getDeclare());
        assertEquals(VariableInfo.AT_END, info.getScope());
        verify(tagData);
    }
}
