/*
* Copyright 2004-2015 the Seasar Foundation and the Others.
*
* 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 org.seasar.framework.container.assembler;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import junit.framework.TestCase;
import org.seasar.framework.beans.BeanDesc;
import org.seasar.framework.beans.PropertyDesc;
import org.seasar.framework.beans.factory.BeanDescFactory;
import org.seasar.framework.container.ComponentDef;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.external.servlet.HttpServletExternalContext;
import org.seasar.framework.container.external.servlet.HttpServletExternalContextComponentDefRegister;
import org.seasar.framework.container.impl.S2ContainerImpl;
import org.seasar.framework.mock.servlet.MockHttpServletRequest;
import org.seasar.framework.mock.servlet.MockHttpServletRequestImpl;
import org.seasar.framework.mock.servlet.MockHttpServletResponse;
import org.seasar.framework.mock.servlet.MockHttpServletResponseImpl;
import org.seasar.framework.mock.servlet.MockServletContext;
import org.seasar.framework.mock.servlet.MockServletContextImpl;
/**
* @author koichik
*
*/
public class AbstPropertyAssemblerTest extends TestCase {
S2Container container;
HttpServletExternalContext externalContext;
MockServletContext servletContext;
MockHttpServletRequest request;
MockHttpServletResponse response;
BeanDesc beanDesc;
PropertyDesc nameDesc;
PropertyDesc ageDesc;
PropertyDesc modelsDesc;
PropertyDesc magazinesDesc;
ComponentDef cd;
TestPage testPage;
TestPropertyAssembler assembler;
Set set;
protected void setUp() throws Exception {
super.setUp();
container = new S2ContainerImpl();
externalContext = new HttpServletExternalContext();
container.setExternalContext(externalContext);
servletContext = new MockServletContextImpl("/seasar2");
externalContext.setApplication(servletContext);
request = new MockHttpServletRequestImpl(servletContext, "/sersar2");
externalContext.setRequest(request);
response = new MockHttpServletResponseImpl(request);
externalContext.setResponse(response);
container
.setExternalContextComponentDefRegister(new HttpServletExternalContextComponentDefRegister());
container.register(TestPage.class, "testPage");
container.init();
beanDesc = BeanDescFactory.getBeanDesc(TestPage.class);
nameDesc = beanDesc.getPropertyDesc("name");
ageDesc = beanDesc.getPropertyDesc("age");
modelsDesc = beanDesc.getPropertyDesc("models");
magazinesDesc = beanDesc.getPropertyDesc("magazines");
cd = container.getComponentDef("testPage");
testPage = (TestPage) cd.getComponent();
assembler = new TestPropertyAssembler(cd);
set = new HashSet();
}
/**
* @throws Exception
*/
public void testBindParameter() throws Exception {
request.setParameter("name", "Hoge");
request.setParameter("age", "30");
request.setParameter("models", new String[] { "Yuri", "Nao", "Maki" });
request.setParameter("magazines",
new String[] { "CanCam", "JJ", "Ray" });
assembler.bindExternally(beanDesc, cd, testPage, set);
assertEquals(4, set.size());
assertEquals("Hoge", testPage.name);
assertEquals(30, testPage.age);
assertEquals(3, testPage.models.length);
assertEquals("Yuri", testPage.models[0]);
assertEquals("Nao", testPage.models[1]);
assertEquals("Maki", testPage.models[2]);
assertEquals(3, testPage.magazines.size());
assertEquals("CanCam", testPage.magazines.get(0));
assertEquals("JJ", testPage.magazines.get(1));
assertEquals("Ray", testPage.magazines.get(2));
}
/**
* @throws Exception
*/
public void testBindHeader() throws Exception {
request.addHeader("name", "Hoge");
request.addHeader("age", "30");
request.addHeader("models", "Yuri");
request.addHeader("models", "Nao");
request.addHeader("models", "Maki");
request.addHeader("magazines", "CanCam");
request.addHeader("magazines", "JJ");
request.addHeader("magazines", "Ray");
assembler.bindExternally(beanDesc, cd, testPage, set);
assertEquals(4, set.size());
assertEquals("Hoge", testPage.name);
assertEquals(30, testPage.age);
assertEquals(3, testPage.models.length);
assertEquals("Yuri", testPage.models[0]);
assertEquals("Nao", testPage.models[1]);
assertEquals("Maki", testPage.models[2]);
assertEquals(3, testPage.magazines.size());
assertEquals("CanCam", testPage.magazines.get(0));
assertEquals("JJ", testPage.magazines.get(1));
assertEquals("Ray", testPage.magazines.get(2));
}
/**
* @throws Exception
*/
public void testPriority() throws Exception {
request.setParameter("name", "Foo");
request.addHeader("name", "Bar");
request.setParameter("age", "20");
request.addHeader("age", "30");
assembler.bindExternally(beanDesc, cd, testPage, set);
assertEquals(2, set.size());
assertEquals("Foo", testPage.name);
assertEquals(20, testPage.age);
}
/**
* @throws Exception
*/
public void testExcept() throws Exception {
request.setParameter("name", "null");
assembler.bindExternally(beanDesc, cd, testPage, set);
assertEquals(1, set.size());
assertEquals("", testPage.name);
}
/**
* @throws Exception
*/
public void testTypeMismatch() throws Exception {
request.setParameter("contract", "hoge");
assembler.bindExternally(beanDesc, cd, testPage, set);
assertEquals(0, set.size());
assertEquals(null, testPage.contract);
}
/**
* @throws Exception
*/
public void testNotBind() throws Exception {
assembler.bindExternally(beanDesc, cd, testPage, set);
assertTrue(set.isEmpty());
assertNull(testPage.name);
assertEquals(0, testPage.age);
assertNull(testPage.models);
assertNull(testPage.magazines);
}
/**
*
*/
public static class TestPropertyAssembler extends AbstractPropertyAssembler {
/**
* @param componentDef
*/
public TestPropertyAssembler(ComponentDef componentDef) {
super(componentDef);
}
public void assemble(Object component) {
}
public void bindExternally(BeanDesc beanDesc,
ComponentDef componentDef, Object component, Set names) {
super.bindExternally(beanDesc, componentDef, component, names);
}
}
/**
*
*/
public static class TestPage {
String name;
int age;
String[] models;
List magazines;
Map contract;
/**
* @return
*/
public String getName() {
return name;
}
/**
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* @return
*/
public int getAge() {
return age;
}
/**
* @param age
*/
public void setAge(int age) {
this.age = age;
}
/**
* @return
*/
public String[] getModels() {
return models;
}
/**
* @param models
*/
public void setModels(String[] models) {
this.models = models;
}
/**
* @return
*/
public List getMagazines() {
return magazines;
}
/**
* @param magazines
*/
public void setMagazines(List magazines) {
this.magazines = magazines;
}
/**
* @return
*/
public Map getContract() {
return contract;
}
/**
* @param contract
*/
public void setContract(Map contract) {
this.contract = contract;
}
}
}