You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2022/11/27 08:24:48 UTC
[struts] 05/23: WW-5233 Copies Tiles EL related tests
This is an automated email from the ASF dual-hosted git repository.
lukaszlenart pushed a commit to branch WW-5233-tiles
in repository https://gitbox.apache.org/repos/asf/struts.git
commit 53e219931bd53f6b158604638e9ff72e391bc08a
Author: Lukasz Lenart <lu...@apache.org>
AuthorDate: Sun Oct 2 13:16:59 2022 +0200
WW-5233 Copies Tiles EL related tests
---
.../apache/tiles/el/ELAttributeEvaluatorTest.java | 189 +++++++++++++
.../org/apache/tiles/el/ELContextImplTest.java | 120 +++++++++
.../tiles/el/JspExpressionFactoryFactoryTest.java | 84 ++++++
.../org/apache/tiles/el/ScopeELResolverTest.java | 175 ++++++++++++
.../tiles/el/TilesContextBeanELResolverTest.java | 299 +++++++++++++++++++++
.../tiles/el/TilesContextELResolverTest.java | 189 +++++++++++++
6 files changed, 1056 insertions(+)
diff --git a/plugins/tiles/src/test/java/org/apache/tiles/el/ELAttributeEvaluatorTest.java b/plugins/tiles/src/test/java/org/apache/tiles/el/ELAttributeEvaluatorTest.java
new file mode 100644
index 000000000..8c1c794ba
--- /dev/null
+++ b/plugins/tiles/src/test/java/org/apache/tiles/el/ELAttributeEvaluatorTest.java
@@ -0,0 +1,189 @@
+/*
+ * 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.el;
+
+import com.sun.el.ExpressionFactoryImpl;
+import junit.framework.TestCase;
+import org.apache.tiles.api.Attribute;
+import org.apache.tiles.api.Expression;
+import org.apache.tiles.request.ApplicationContext;
+import org.apache.tiles.request.Request;
+import org.easymock.EasyMock;
+
+import javax.el.ArrayELResolver;
+import javax.el.BeanELResolver;
+import javax.el.CompositeELResolver;
+import javax.el.ELResolver;
+import javax.el.ListELResolver;
+import javax.el.MapELResolver;
+import javax.el.ResourceBundleELResolver;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Tests {@link ELAttributeEvaluator}.
+ */
+public class ELAttributeEvaluatorTest extends TestCase {
+
+ /**
+ * The evaluator to test.
+ */
+ private ELAttributeEvaluator evaluator;
+
+ /**
+ * The request object to use.
+ */
+ private Request request;
+
+ /** {@inheritDoc} */
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ evaluator = new ELAttributeEvaluator();
+ Map<String, Object> requestScope = new HashMap<>();
+ Map<String, Object> sessionScope = new HashMap<>();
+ Map<String, Object> applicationScope = new HashMap<>();
+ requestScope.put("object1", "value");
+ sessionScope.put("object2", 1);
+ applicationScope.put("object3", 2.0F);
+ requestScope.put("paulaBean", new PaulaBean());
+ request = EasyMock.createMock(Request.class);
+ EasyMock.expect(request.getContext("request")).andReturn(requestScope)
+ .anyTimes();
+ EasyMock.expect(request.getContext("session")).andReturn(sessionScope)
+ .anyTimes();
+ EasyMock.expect(request.getContext("application")).andReturn(
+ applicationScope).anyTimes();
+ EasyMock.expect(request.getAvailableScopes()).andReturn(
+ Arrays.asList("request", "session", "application")).anyTimes();
+ ApplicationContext applicationContext = EasyMock
+ .createMock(ApplicationContext.class);
+ EasyMock.expect(request.getApplicationContext()).andReturn(
+ applicationContext).anyTimes();
+ EasyMock.replay(request, applicationContext);
+
+ evaluator.setExpressionFactory(new ExpressionFactoryImpl());
+ ELResolver elResolver = new CompositeELResolver() {
+ {
+ BeanELResolver beanElResolver = new BeanELResolver(false);
+ add(new ScopeELResolver());
+ add(new TilesContextELResolver(beanElResolver));
+ add(new TilesContextBeanELResolver());
+ add(new ArrayELResolver(false));
+ add(new ListELResolver(false));
+ add(new MapELResolver(false));
+ add(new ResourceBundleELResolver());
+ add(beanElResolver);
+ }
+ };
+ evaluator.setResolver(elResolver);
+ }
+
+ /**
+ * Tests
+ * {@link ELAttributeEvaluator#evaluate(Attribute, Request)}.
+ */
+ public void testEvaluate() {
+ Attribute attribute = new Attribute();
+ attribute.setExpressionObject(new Expression("${requestScope.object1}"));
+ assertEquals("The value is not correct", "value", evaluator.evaluate(
+ attribute, request));
+ attribute.setExpressionObject(new Expression("${sessionScope.object2}"));
+ assertEquals("The value is not correct", 1, evaluator
+ .evaluate(attribute, request));
+ attribute.setExpressionObject(new Expression("${applicationScope.object3}"));
+ assertEquals("The value is not correct", 2.0F, evaluator
+ .evaluate(attribute, request));
+ attribute.setExpressionObject(new Expression("${object1}"));
+ assertEquals("The value is not correct", "value", evaluator.evaluate(
+ attribute, request));
+ attribute.setExpressionObject(new Expression("${object2}"));
+ assertEquals("The value is not correct", 1, evaluator
+ .evaluate(attribute, request));
+ attribute.setExpressionObject(new Expression("${object3}"));
+ assertEquals("The value is not correct", 2.0F, evaluator
+ .evaluate(attribute, request));
+ attribute.setExpressionObject(new Expression("${paulaBean.paula}"));
+ assertEquals("The value is not correct", "Brillant", evaluator
+ .evaluate(attribute, request));
+ attribute.setExpressionObject(new Expression("String literal"));
+ assertEquals("The value is not correct", "String literal", evaluator
+ .evaluate(attribute, request));
+ attribute.setValue(2);
+ assertEquals("The value is not correct", 2, evaluator
+ .evaluate(attribute, request));
+ attribute.setValue("${object1}");
+ assertEquals("The value has been evaluated", "${object1}", evaluator
+ .evaluate(attribute, request));
+ }
+
+ /**
+ * Tests
+ * {@link ELAttributeEvaluator#evaluate(String, Request)}.
+ */
+ public void testEvaluateString() {
+ String expression = "${requestScope.object1}";
+ assertEquals("The value is not correct", "value", evaluator.evaluate(
+ expression, request));
+ expression = "${sessionScope.object2}";
+ assertEquals("The value is not correct", 1, evaluator
+ .evaluate(expression, request));
+ expression = "${applicationScope.object3}";
+ assertEquals("The value is not correct", 2.0F, evaluator
+ .evaluate(expression, request));
+ expression = "${object1}";
+ assertEquals("The value is not correct", "value", evaluator.evaluate(
+ expression, request));
+ expression = "${object2}";
+ assertEquals("The value is not correct", 1, evaluator
+ .evaluate(expression, request));
+ expression = "${object3}";
+ assertEquals("The value is not correct", 2.0F, evaluator
+ .evaluate(expression, request));
+ expression = "${paulaBean.paula}";
+ assertEquals("The value is not correct", "Brillant", evaluator
+ .evaluate(expression, request));
+ expression = "String literal";
+ assertEquals("The value is not correct", expression, evaluator
+ .evaluate(expression, request));
+ }
+
+ /**
+ * This is The Brillant Paula Bean (sic) just like it was posted to:
+ * http://thedailywtf.com/Articles/The_Brillant_Paula_Bean.aspx
+ * I hope that there is no copyright on it.
+ */
+ public static class PaulaBean {
+
+ /**
+ * Paula is brillant, really.
+ */
+ private final String paula = "Brillant";
+
+ /**
+ * Returns brillant.
+ *
+ * @return "Brillant".
+ */
+ public String getPaula() {
+ return paula;
+ }
+ }
+}
diff --git a/plugins/tiles/src/test/java/org/apache/tiles/el/ELContextImplTest.java b/plugins/tiles/src/test/java/org/apache/tiles/el/ELContextImplTest.java
new file mode 100644
index 000000000..b9a835318
--- /dev/null
+++ b/plugins/tiles/src/test/java/org/apache/tiles/el/ELContextImplTest.java
@@ -0,0 +1,120 @@
+/*
+ * 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.el;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.el.ELResolver;
+import javax.el.FunctionMapper;
+import javax.el.ValueExpression;
+import javax.el.VariableMapper;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+/**
+ * Tests {@link ELContextImpl}.
+ */
+public class ELContextImplTest {
+
+ /**
+ * The EL context to test.
+ */
+ private ELContextImpl context;
+
+ /**
+ * The EL resolver.
+ */
+ private ELResolver resolver;
+
+ /**
+ * Sets up the test.
+ */
+ @Before
+ public void setUp() {
+ resolver = createMock(ELResolver.class);
+ context = new ELContextImpl(resolver);
+ }
+
+ /**
+ * Test method for {@link ELContextImpl#getELResolver()}.
+ */
+ @Test
+ public void testGetELResolver() {
+ replay(resolver);
+ assertEquals(resolver, context.getELResolver());
+ verify(resolver);
+ }
+
+ /**
+ * Test method for {@link ELContextImpl#setFunctionMapper(FunctionMapper)}.
+ */
+ @Test
+ public void testSetFunctionMapper() {
+ FunctionMapper functionMapper = createMock(FunctionMapper.class);
+
+ replay(resolver, functionMapper);
+ context.setFunctionMapper(functionMapper);
+ assertEquals(functionMapper, context.getFunctionMapper());
+ verify(resolver, functionMapper);
+ }
+
+ /**
+ * Test method for {@link ELContextImpl#setVariableMapper(VariableMapper)}.
+ */
+ @Test
+ public void testSetVariableMapper() {
+ VariableMapper variableMapper = createMock(VariableMapper.class);
+
+ replay(resolver, variableMapper);
+ context.setVariableMapper(variableMapper);
+ assertEquals(variableMapper, context.getVariableMapper());
+ verify(resolver, variableMapper);
+ }
+
+ /**
+ * Tests {@link ELContextImpl#getFunctionMapper()}.
+ */
+ @Test
+ public void testNullFunctionMapper() {
+ replay(resolver);
+ FunctionMapper functionMapper = context.getFunctionMapper();
+ assertNull(functionMapper.resolveFunction("whatever", "it_IT"));
+ verify(resolver);
+ }
+
+ /**
+ * Tests {@link ELContextImpl#getVariableMapper()}.
+ */
+ @Test
+ public void testVariableMapperImpl() {
+ ValueExpression expression = createMock(ValueExpression.class);
+
+ replay(resolver, expression);
+ VariableMapper variableMapper = context.getVariableMapper();
+ assertNull(variableMapper.resolveVariable("whatever"));
+ variableMapper.setVariable("var", expression);
+ assertEquals(expression, variableMapper.resolveVariable("var"));
+ verify(resolver, expression);
+ }
+}
diff --git a/plugins/tiles/src/test/java/org/apache/tiles/el/JspExpressionFactoryFactoryTest.java b/plugins/tiles/src/test/java/org/apache/tiles/el/JspExpressionFactoryFactoryTest.java
new file mode 100644
index 000000000..b7092e530
--- /dev/null
+++ b/plugins/tiles/src/test/java/org/apache/tiles/el/JspExpressionFactoryFactoryTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.el;
+
+import org.apache.tiles.request.ApplicationContext;
+import org.junit.Test;
+
+import javax.el.ExpressionFactory;
+import javax.servlet.ServletContext;
+import javax.servlet.jsp.JspApplicationContext;
+import javax.servlet.jsp.JspFactory;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Tests {@link JspExpressionFactoryFactory}.
+ */
+public class JspExpressionFactoryFactoryTest {
+
+ /**
+ * Test method for {@link JspExpressionFactoryFactory#getExpressionFactory()}.
+ */
+ @Test
+ public void testGetExpressionFactory() {
+ ApplicationContext applicationContext = createMock(ApplicationContext.class);
+ ServletContext servletContext = createMock(ServletContext.class);
+ JspFactory jspFactory = createMock(JspFactory.class);
+ JspApplicationContext jspApplicationContext = createMock(JspApplicationContext.class);
+ ExpressionFactory expressionFactory = createMock(ExpressionFactory.class);
+
+ expect(applicationContext.getContext()).andReturn(servletContext);
+ expect(jspFactory.getJspApplicationContext(servletContext)).andReturn(jspApplicationContext);
+ expect(jspApplicationContext.getExpressionFactory()).andReturn(expressionFactory);
+
+ replay(applicationContext, servletContext, jspFactory,
+ jspApplicationContext, expressionFactory);
+ JspFactory.setDefaultFactory(jspFactory);
+ JspExpressionFactoryFactory factory = new JspExpressionFactoryFactory();
+ factory.setApplicationContext(applicationContext);
+ assertEquals(expressionFactory, factory.getExpressionFactory());
+ verify(applicationContext, servletContext, jspFactory,
+ jspApplicationContext, expressionFactory);
+ }
+
+ /**
+ * Test method for {@link JspExpressionFactoryFactory#getExpressionFactory()}.
+ */
+ @Test(expected = IllegalArgumentException.class)
+ public void testSetApplicationContextIllegal() {
+ ApplicationContext applicationContext = createMock(ApplicationContext.class);
+ Integer servletContext = 1;
+
+ expect(applicationContext.getContext()).andReturn(servletContext);
+
+ replay(applicationContext);
+ try {
+ JspExpressionFactoryFactory factory = new JspExpressionFactoryFactory();
+ factory.setApplicationContext(applicationContext);
+ } finally {
+ verify(applicationContext);
+ }
+ }
+
+}
diff --git a/plugins/tiles/src/test/java/org/apache/tiles/el/ScopeELResolverTest.java b/plugins/tiles/src/test/java/org/apache/tiles/el/ScopeELResolverTest.java
new file mode 100644
index 000000000..bdd8d799e
--- /dev/null
+++ b/plugins/tiles/src/test/java/org/apache/tiles/el/ScopeELResolverTest.java
@@ -0,0 +1,175 @@
+/*
+ * 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.el;
+
+import org.apache.tiles.request.ApplicationContext;
+import org.apache.tiles.request.Request;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.el.ELContext;
+import java.beans.FeatureDescriptor;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests {@link ScopeELResolver}.
+ */
+public class ScopeELResolverTest {
+
+ /**
+ * The resolver to test.
+ */
+ private ScopeELResolver resolver;
+
+ /**
+ * {@inheritDoc}
+ */
+ @Before
+ public void setUp() {
+ resolver = new ScopeELResolver();
+ }
+
+ /**
+ * Tests {@link ScopeELResolver#getCommonPropertyType(ELContext, Object)}.
+ */
+ @Test
+ public void testGetCommonPropertyType() {
+ ELContext elContext = createMock(ELContext.class);
+
+ replay(elContext);
+ assertNull(resolver.getCommonPropertyType(elContext, 1));
+ assertEquals(Map.class, resolver.getCommonPropertyType(elContext, null));
+ verify(elContext);
+ }
+
+ /**
+ * Tests {@link ScopeELResolver#getFeatureDescriptors(ELContext, Object)}.
+ */
+ @Test
+ public void testGetFeatureDescriptors() {
+ ELContext elContext = createMock(ELContext.class);
+ Request request = createMock(Request.class);
+
+ expect(elContext.getContext(Request.class)).andReturn(request);
+ expect(request.getAvailableScopes()).andReturn(Arrays.asList("one", "two"));
+
+ replay(elContext, request);
+ assertFalse(resolver.getFeatureDescriptors(elContext, 1).hasNext());
+ Iterator<FeatureDescriptor> descriptors = resolver.getFeatureDescriptors(elContext, null);
+ FeatureDescriptor descriptor = descriptors.next();
+ assertEquals("oneScope", descriptor.getName());
+ descriptor = descriptors.next();
+ assertEquals("twoScope", descriptor.getName());
+ assertFalse(descriptors.hasNext());
+ verify(elContext, request);
+ }
+
+ /**
+ * Test method for
+ * {@link ScopeELResolver#getType(ELContext, Object, Object)}.
+ */
+ @Test
+ public void testGetType() {
+ Request request = createMock(Request.class);
+ ApplicationContext applicationContext = createMock(ApplicationContext.class);
+ ELContext context = new ELContextImpl(resolver);
+ replay(request, applicationContext);
+ context.putContext(Request.class, request);
+ context.putContext(ApplicationContext.class, applicationContext);
+ assertNull(resolver.getType(context, 1, "whatever"));
+ assertEquals("The requestScope object is not a map.", Map.class,
+ resolver.getType(context, null, "requestScope"));
+ assertEquals("The sessionScope object is not a map.", Map.class,
+ resolver.getType(context, null, "sessionScope"));
+ assertEquals("The applicationScope object is not a map.", Map.class,
+ resolver.getType(context, null, "applicationScope"));
+ }
+
+ /**
+ * Test method for
+ * {@link ScopeELResolver#getValue(ELContext, Object, Object)}.
+ */
+ @Test
+ public void testGetValue() {
+ Map<String, Object> requestScope = new HashMap<>();
+ requestScope.put("objectKey", "objectValue");
+ Map<String, Object> sessionScope = new HashMap<>();
+ sessionScope.put("sessionObjectKey", "sessionObjectValue");
+ Map<String, Object> applicationScope = new HashMap<>();
+ applicationScope.put("applicationObjectKey", "applicationObjectValue");
+ Request request = createMock(Request.class);
+ expect(request.getContext("request")).andReturn(requestScope);
+ expect(request.getContext("session")).andReturn(sessionScope);
+ ApplicationContext applicationContext = createMock(ApplicationContext.class);
+ expect(request.getContext("application")).andReturn(applicationScope);
+ ELContext context = new ELContextImpl(resolver);
+ replay(request, applicationContext);
+ context.putContext(Request.class, request);
+ context.putContext(ApplicationContext.class, applicationContext);
+ assertNull(resolver.getValue(context, 1, "whatever"));
+ assertEquals("The requestScope map does not correspond", requestScope,
+ resolver.getValue(context, null, "requestScope"));
+ assertEquals("The sessionScope map does not correspond", sessionScope,
+ resolver.getValue(context, null, "sessionScope"));
+ assertEquals("The applicationScope map does not correspond",
+ applicationScope, resolver.getValue(context, null,
+ "applicationScope"));
+ }
+
+ /**
+ * Tests {@link ScopeELResolver#isReadOnly(ELContext, Object, Object)}.
+ */
+ @Test
+ public void testIsReadOnly() {
+ ELContext elContext = createMock(ELContext.class);
+
+ replay(elContext);
+ assertTrue(resolver.isReadOnly(elContext, null, "whatever"));
+ verify(elContext);
+ }
+
+ /**
+ * Tests {@link ScopeELResolver#isReadOnly(ELContext, Object, Object)}.
+ */
+ @Test(expected = NullPointerException.class)
+ public void testIsReadOnlyNPE() {
+ resolver.isReadOnly(null, null, "whatever");
+ }
+
+ /**
+ * Tests {@link ScopeELResolver#setValue(ELContext, Object, Object, Object)}.
+ */
+ @Test
+ public void testSetValue() {
+ // Just to complete code coverage!
+ resolver.setValue(null, null, null, null);
+ }
+}
diff --git a/plugins/tiles/src/test/java/org/apache/tiles/el/TilesContextBeanELResolverTest.java b/plugins/tiles/src/test/java/org/apache/tiles/el/TilesContextBeanELResolverTest.java
new file mode 100644
index 000000000..5a1214ec2
--- /dev/null
+++ b/plugins/tiles/src/test/java/org/apache/tiles/el/TilesContextBeanELResolverTest.java
@@ -0,0 +1,299 @@
+/*
+ * 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.el;
+
+import org.apache.tiles.request.ApplicationContext;
+import org.apache.tiles.request.Request;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.el.ELContext;
+import java.beans.FeatureDescriptor;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests {@link TilesContextBeanELResolver}.
+ */
+public class TilesContextBeanELResolverTest {
+
+ /**
+ * The resolver to test.
+ */
+ private TilesContextBeanELResolver resolver;
+
+ /**
+ * Sets up the test.
+ */
+ @Before
+ public void setUp() {
+ resolver = new TilesContextBeanELResolver();
+ }
+
+ /**
+ * Test method for
+ * {@link TilesContextBeanELResolver#getCommonPropertyType(ELContext, Object)}.
+ */
+ @Test
+ public void testGetCommonPropertyType() {
+ Class<?> clazz = resolver.getCommonPropertyType(null, null);
+ assertEquals("The class is not correct", String.class, clazz);
+ clazz = resolver.getCommonPropertyType(null, "Base object");
+ assertNull("The class for non root objects must be null", clazz);
+ }
+
+ /**
+ * Test method for
+ * {@link TilesContextBeanELResolver#getFeatureDescriptors(ELContext, Object)}.
+ */
+ @Test
+ public void testGetFeatureDescriptors() {
+ Map<String, Object> requestScope = new HashMap<>();
+ Map<String, Object> sessionScope = new HashMap<>();
+ Map<String, Object> applicationScope = new HashMap<>();
+ requestScope.put("object1", "value");
+ sessionScope.put("object2", 1);
+ applicationScope.put("object3", 2.0F);
+ Request request = createMock(Request.class);
+ expect(request.getContext("request")).andReturn(requestScope)
+ .anyTimes();
+ expect(request.getContext("session")).andReturn(sessionScope)
+ .anyTimes();
+ ApplicationContext applicationContext = createMock(ApplicationContext.class);
+ expect(request.getContext("application")).andReturn(
+ applicationScope).anyTimes();
+ expect(request.getAvailableScopes()).andReturn(
+ Arrays.asList("request", "session", "application"))
+ .anyTimes();
+ replay(request, applicationContext);
+
+ ELContext context = new ELContextImpl(resolver);
+ context.putContext(Request.class, request);
+ context.putContext(ApplicationContext.class, applicationContext);
+
+ List<FeatureDescriptor> expected = new ArrayList<>();
+ resolver.collectBeanInfo(requestScope, expected);
+ resolver.collectBeanInfo(sessionScope, expected);
+ resolver.collectBeanInfo(applicationScope, expected);
+ Iterator<FeatureDescriptor> featureIt = resolver.getFeatureDescriptors(
+ context, null);
+ Iterator<FeatureDescriptor> expectedIt = expected.iterator();
+ while (featureIt.hasNext() && expectedIt.hasNext()) {
+ FeatureDescriptor expectedDescriptor = expectedIt.next();
+ FeatureDescriptor descriptor = featureIt.next();
+ assertEquals("The feature is not the same", expectedDescriptor
+ .getDisplayName(), descriptor.getDisplayName());
+ assertEquals("The feature is not the same", expectedDescriptor
+ .getName(), descriptor.getName());
+ assertEquals("The feature is not the same", expectedDescriptor
+ .getShortDescription(), descriptor.getShortDescription());
+ assertEquals("The feature is not the same", expectedDescriptor
+ .getValue("type"), descriptor.getValue("type"));
+ assertEquals("The feature is not the same", expectedDescriptor
+ .getValue("resolvableAtDesignTime"), descriptor
+ .getValue("resolvableAtDesignTime"));
+ assertEquals("The feature is not the same", expectedDescriptor
+ .isExpert(), descriptor.isExpert());
+ assertEquals("The feature is not the same", expectedDescriptor
+ .isHidden(), descriptor.isHidden());
+ assertEquals("The feature is not the same", expectedDescriptor
+ .isPreferred(), descriptor.isPreferred());
+ }
+ assertTrue("The feature descriptors are not of the same size",
+ !featureIt.hasNext() && !expectedIt.hasNext());
+ }
+
+ /**
+ * Test method for
+ * {@link TilesContextBeanELResolver#getType(ELContext, Object, Object)}.
+ */
+ @Test
+ public void testGetType() {
+ Map<String, Object> requestScope = new HashMap<>();
+ Map<String, Object> sessionScope = new HashMap<>();
+ Map<String, Object> applicationScope = new HashMap<>();
+ requestScope.put("object1", "value");
+ sessionScope.put("object2", 1);
+ applicationScope.put("object3", 2.0F);
+ Request request = createMock(Request.class);
+ expect(request.getContext("request")).andReturn(requestScope)
+ .anyTimes();
+ expect(request.getContext("session")).andReturn(sessionScope)
+ .anyTimes();
+ ApplicationContext applicationContext = createMock(ApplicationContext.class);
+ expect(request.getContext("application")).andReturn(
+ applicationScope).anyTimes();
+ expect(request.getAvailableScopes()).andReturn(
+ Arrays.asList("request", "session", "application"))
+ .anyTimes();
+ replay(request, applicationContext);
+
+ ELContext context = new ELContextImpl(resolver);
+ context.putContext(Request.class, request);
+ context.putContext(ApplicationContext.class, applicationContext);
+
+ assertEquals("The type is not correct", String.class, resolver.getType(
+ context, null, "object1"));
+ assertEquals("The type is not correct", Integer.class, resolver.getType(
+ context, null, "object2"));
+ assertEquals("The type is not correct", Float.class, resolver.getType(
+ context, null, "object3"));
+ assertNull(resolver.getType(context, 1, "whatever"));
+ assertNull(resolver.getType(context, null, "object4"));
+ verify(request, applicationContext);
+ }
+
+ /**
+ * Test method for
+ * {@link TilesContextBeanELResolver#getValue(ELContext, Object, Object)}.
+ */
+ @Test
+ public void testGetValue() {
+ Map<String, Object> requestScope = new HashMap<>();
+ Map<String, Object> sessionScope = new HashMap<>();
+ Map<String, Object> applicationScope = new HashMap<>();
+ requestScope.put("object1", "value");
+ sessionScope.put("object2", 1);
+ applicationScope.put("object3", 2.0F);
+ Request request = createMock(Request.class);
+ expect(request.getContext("request")).andReturn(requestScope)
+ .anyTimes();
+ expect(request.getContext("session")).andReturn(sessionScope)
+ .anyTimes();
+ ApplicationContext applicationContext = createMock(ApplicationContext.class);
+ expect(request.getContext("application")).andReturn(
+ applicationScope).anyTimes();
+ expect(request.getAvailableScopes()).andReturn(
+ Arrays.asList("request", "session", "application"))
+ .anyTimes();
+ replay(request, applicationContext);
+
+ ELContext context = new ELContextImpl(resolver);
+ context.putContext(Request.class, request);
+ context.putContext(ApplicationContext.class, applicationContext);
+
+ assertEquals("The value is not correct", "value", resolver.getValue(
+ context, null, "object1"));
+ assertEquals("The value is not correct", 1, resolver
+ .getValue(context, null, "object2"));
+ assertEquals("The value is not correct", 2.0F, resolver
+ .getValue(context, null, "object3"));
+ assertNull(resolver.getValue(context, 1, "whatever"));
+ }
+
+ /**
+ * Test method for
+ * {@link TilesContextBeanELResolver#isReadOnly(ELContext, Object, Object)}.
+ */
+ @Test
+ public void testIsReadOnlyELContextObjectObject() {
+ ELContext context = new ELContextImpl(resolver);
+ assertTrue("The value is not read only", resolver.isReadOnly(context,
+ null, null));
+ }
+
+ /**
+ * Test method for
+ * {@link TilesContextBeanELResolver#isReadOnly(ELContext, Object, Object)}.
+ */
+ @Test(expected = NullPointerException.class)
+ public void testIsReadOnlyNPE() {
+ resolver.isReadOnly(null, null, null);
+ }
+
+ /**
+ * Tests {@link TilesContextBeanELResolver#setValue(ELContext, Object, Object, Object)}.
+ */
+ @Test
+ public void testSetValue() {
+ // Just to complete code coverage!
+ resolver.setValue(null, null, null, null);
+ }
+
+ /**
+ * Test method for
+ * {@link TilesContextBeanELResolver#findObjectByProperty(ELContext, Object)}.
+ */
+ @Test
+ public void testFindObjectByProperty() {
+ Map<String, Object> requestScope = new HashMap<>();
+ Map<String, Object> sessionScope = new HashMap<>();
+ Map<String, Object> applicationScope = new HashMap<>();
+ requestScope.put("object1", "value");
+ sessionScope.put("object2", 1);
+ applicationScope.put("object3", 2.0F);
+ Request request = createMock(Request.class);
+ expect(request.getContext("request")).andReturn(requestScope)
+ .anyTimes();
+ expect(request.getContext("session")).andReturn(sessionScope)
+ .anyTimes();
+ ApplicationContext applicationContext = createMock(ApplicationContext.class);
+ expect(request.getContext("application")).andReturn(
+ applicationScope).anyTimes();
+ expect(request.getAvailableScopes()).andReturn(
+ Arrays.asList("request", "session", "application"))
+ .anyTimes();
+ replay(request, applicationContext);
+
+ ELContext context = new ELContextImpl(resolver);
+ context.putContext(Request.class, request);
+ context.putContext(ApplicationContext.class, applicationContext);
+
+ assertEquals("The value is not correct", "value", resolver
+ .findObjectByProperty(context, "object1"));
+ assertEquals("The value is not correct", 1, resolver
+ .findObjectByProperty(context, "object2"));
+ assertEquals("The value is not correct", 2.0F, resolver
+ .findObjectByProperty(context, "object3"));
+ }
+
+ /**
+ * Test method for
+ * {@link TilesContextBeanELResolver#getObject(Map, String)}.
+ */
+ @Test
+ public void testGetObject() {
+ Map<String, Object> map = new HashMap<>();
+ map.put("object1", "value");
+ assertEquals("The value is not correct", "value", resolver.getObject(
+ map, "object1"));
+ assertNull("The value is not null", resolver.getObject(map, "object2"));
+ assertNull("The value is not null", resolver.getObject(null, "object1"));
+ }
+
+ /**
+ * Tests {@link TilesContextBeanELResolver#collectBeanInfo(Map, List)}.
+ */
+ @Test
+ public void testCollectBeanInfoEmpty() {
+ resolver.collectBeanInfo(null, null);
+ }
+}
diff --git a/plugins/tiles/src/test/java/org/apache/tiles/el/TilesContextELResolverTest.java b/plugins/tiles/src/test/java/org/apache/tiles/el/TilesContextELResolverTest.java
new file mode 100644
index 000000000..c3685aaf9
--- /dev/null
+++ b/plugins/tiles/src/test/java/org/apache/tiles/el/TilesContextELResolverTest.java
@@ -0,0 +1,189 @@
+/*
+ * 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.el;
+
+import org.apache.tiles.request.ApplicationContext;
+import org.apache.tiles.request.Request;
+import org.apache.tiles.request.reflect.ClassUtil;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.el.ELContext;
+import javax.el.ELResolver;
+import java.beans.FeatureDescriptor;
+import java.beans.PropertyDescriptor;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests {@link TilesContextELResolver}.
+ */
+public class TilesContextELResolverTest {
+
+ /**
+ * The bean resolver.
+ */
+ private ELResolver beanElResolver;
+
+ /**
+ * The resolver to test.
+ */
+ private TilesContextELResolver resolver;
+
+ /**
+ * Sets up the test.
+ */
+ @Before
+ public void setUp() {
+ beanElResolver = createMock(ELResolver.class);
+ resolver = new TilesContextELResolver(beanElResolver);
+ }
+
+ /**
+ * Test method for
+ * {@link TilesContextELResolver#getCommonPropertyType(ELContext, Object)}.
+ */
+ @Test
+ public void testGetCommonPropertyTypeELContextObject() {
+ replay(beanElResolver);
+ Class<?> clazz = resolver.getCommonPropertyType(null, null);
+ assertEquals("The class is not correct", String.class, clazz);
+ clazz = resolver.getCommonPropertyType(null, "Base object");
+ assertNull("The class for non root objects must be null", clazz);
+ verify(beanElResolver);
+ }
+
+ /**
+ * Test method for
+ * {@link TilesContextELResolver#getFeatureDescriptors(ELContext, Object)}.
+ */
+ @Test
+ public void testGetFeatureDescriptorsELContextObject() {
+ replay(beanElResolver);
+ assertNull(resolver.getFeatureDescriptors(null, 1));
+ Map<String, PropertyDescriptor> expected = new LinkedHashMap<>();
+ ClassUtil.collectBeanInfo(Request.class, expected);
+ ClassUtil.collectBeanInfo(ApplicationContext.class, expected);
+ Iterator<FeatureDescriptor> featureIt = resolver.getFeatureDescriptors(
+ null, null);
+ Iterator<? extends FeatureDescriptor> expectedIt = expected.values().iterator();
+ while (featureIt.hasNext() && expectedIt.hasNext()) {
+ assertEquals("The feature is not the same", expectedIt.next(),
+ featureIt.next());
+ }
+ assertTrue("The feature descriptors are not of the same size",
+ !featureIt.hasNext() && !expectedIt.hasNext());
+ verify(beanElResolver);
+ }
+
+ /**
+ * Tests {@link TilesContextBeanELResolver#getType(ELContext, Object, Object)}.
+ */
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ @Test
+ public void testGetType() {
+ ELContext elContext = createMock(ELContext.class);
+ Request request = createMock(Request.class);
+ ApplicationContext applicationContext = createMock(ApplicationContext.class);
+
+ expect(elContext.getContext(Request.class)).andReturn(request);
+ expect(elContext.getContext(ApplicationContext.class)).andReturn(applicationContext);
+ expect(beanElResolver.getType(elContext, request, "responseCommitted")).andReturn((Class) Boolean.class);
+ expect(beanElResolver.getType(elContext, applicationContext, "initParams")).andReturn((Class) Map.class);
+ elContext.setPropertyResolved(true);
+ expectLastCall().times(2);
+
+ replay(beanElResolver, elContext, request, applicationContext);
+ assertNull(resolver.getType(elContext, 1, "whatever"));
+ assertEquals(Boolean.class, resolver.getType(elContext, null, "responseCommitted"));
+ assertEquals(Map.class, resolver.getType(elContext, null, "initParams"));
+ verify(beanElResolver, elContext, request, applicationContext);
+ }
+
+ /**
+ * Tests {@link TilesContextBeanELResolver#getValue(ELContext, Object, Object)}.
+ */
+ @Test
+ public void testGetValue() {
+ ELContext elContext = createMock(ELContext.class);
+ Request request = createMock(Request.class);
+ ApplicationContext applicationContext = createMock(ApplicationContext.class);
+ @SuppressWarnings("rawtypes")
+ Map map = createMock(Map.class);
+
+ expect(elContext.getContext(Request.class)).andReturn(request);
+ expect(elContext.getContext(ApplicationContext.class)).andReturn(applicationContext);
+ expect(beanElResolver.getValue(elContext, request, "responseCommitted")).andReturn(true);
+ expect(beanElResolver.getValue(elContext, applicationContext, "initParams")).andReturn(map);
+ elContext.setPropertyResolved(true);
+ expectLastCall().times(2);
+
+ replay(beanElResolver, elContext, request, applicationContext, map);
+ assertNull(resolver.getValue(elContext, 1, "whatever"));
+ assertEquals(true, resolver.getValue(elContext, null, "responseCommitted"));
+ assertEquals(map, resolver.getValue(elContext, null, "initParams"));
+ verify(beanElResolver, elContext, request, applicationContext, map);
+ }
+
+ /**
+ * Test method for
+ * {@link TilesContextELResolver#isReadOnly(ELContext, Object, Object)}.
+ */
+ @Test
+ public void testIsReadOnly() {
+ replay(beanElResolver);
+ ELContext context = new ELContextImpl(resolver);
+ assertTrue("The value is not read only", resolver.isReadOnly(context,
+ null, null));
+ verify(beanElResolver);
+ }
+
+ /**
+ * Test method for
+ * {@link TilesContextELResolver#isReadOnly(ELContext, Object, Object)}.
+ */
+ @Test(expected = NullPointerException.class)
+ public void testIsReadOnlyNPE() {
+ replay(beanElResolver);
+ try {
+ resolver.isReadOnly(null, null, null);
+ } finally {
+ verify(beanElResolver);
+ }
+ }
+
+ /**
+ * Tests {@link TilesContextELResolver#setValue(ELContext, Object, Object, Object)}.
+ */
+ @Test
+ public void testSetValue() {
+ // Just to complete code coverage!
+ resolver.setValue(null, null, null, null);
+ }
+}