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:49 UTC

[struts] 06/23: WW-5233 Copies Tiles OGNL 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 fe815e8795e3beb5fd499ffdc611572946c02fca
Author: Lukasz Lenart <lu...@apache.org>
AuthorDate: Sun Oct 2 13:27:34 2022 +0200

    WW-5233 Copies Tiles OGNL related tests
---
 .../tiles/ognl/AnyScopePropertyAccessorTest.java   | 152 ++++++++++++++
 .../tiles/ognl/DelegatePropertyAccessorTest.java   | 111 ++++++++++
 .../NestedObjectDelegatePropertyAccessorTest.java  | 106 ++++++++++
 .../tiles/ognl/OGNLAttributeEvaluatorTest.java     | 229 +++++++++++++++++++++
 .../tiles/ognl/ScopePropertyAccessorTest.java      |  91 ++++++++
 ...pplicationContextNestedObjectExtractorTest.java |  51 +++++
 ...ContextPropertyAccessorDelegateFactoryTest.java | 189 +++++++++++++++++
 7 files changed, 929 insertions(+)

diff --git a/plugins/tiles/src/test/java/org/apache/tiles/ognl/AnyScopePropertyAccessorTest.java b/plugins/tiles/src/test/java/org/apache/tiles/ognl/AnyScopePropertyAccessorTest.java
new file mode 100644
index 000000000..c7f3465cc
--- /dev/null
+++ b/plugins/tiles/src/test/java/org/apache/tiles/ognl/AnyScopePropertyAccessorTest.java
@@ -0,0 +1,152 @@
+/*
+ * 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.ognl;
+
+import org.apache.tiles.request.Request;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+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;
+
+/**
+ * Tests {@link AnyScopePropertyAccessor}.
+ */
+public class AnyScopePropertyAccessorTest {
+
+    /**
+     * The accessor to test.
+     */
+    private AnyScopePropertyAccessor accessor;
+
+    /**
+     * Sets up the test.
+     */
+    @Before
+    public void setUp() {
+        accessor = new AnyScopePropertyAccessor();
+    }
+
+    /**
+     * Test method for {@link AnyScopePropertyAccessor#getProperty(Map, Object, Object)}.
+     */
+    @Test
+    public void testGetProperty() {
+        Request request = createMock(Request.class);
+        Map<String, Object> oneScope = createMock(Map.class);
+        Map<String, Object> twoScope = createMock(Map.class);
+
+        expect(request.getAvailableScopes()).andReturn(Arrays.asList("one", "two")).anyTimes();
+        expect(request.getContext("one")).andReturn(oneScope).anyTimes();
+        expect(request.getContext("two")).andReturn(twoScope).anyTimes();
+        expect(oneScope.containsKey("name1")).andReturn(true);
+        expect(oneScope.get("name1")).andReturn("value1");
+        expect(oneScope.containsKey("name2")).andReturn(false);
+        expect(oneScope.containsKey("name3")).andReturn(false);
+        expect(twoScope.containsKey("name2")).andReturn(true);
+        expect(twoScope.get("name2")).andReturn("value2");
+        expect(twoScope.containsKey("name3")).andReturn(false);
+
+        replay(request, oneScope, twoScope);
+        assertEquals("value1", accessor.getProperty(null, request, "name1"));
+        assertEquals("value2", accessor.getProperty(null, request, "name2"));
+        assertNull(accessor.getProperty(null, request, "name3"));
+        verify(request, oneScope, twoScope);
+    }
+
+    @Test
+    public void testGetSourceAccessor() {
+        Request request = createMock(Request.class);
+        Map<String, Object> oneScope = createMock(Map.class);
+        Map<String, Object> twoScope = createMock(Map.class);
+
+        expect(request.getAvailableScopes()).andReturn(Arrays.asList("one", "two")).anyTimes();
+        expect(request.getContext("one")).andReturn(oneScope).anyTimes();
+        expect(request.getContext("two")).andReturn(twoScope).anyTimes();
+        expect(oneScope.containsKey("name1")).andReturn(true);
+        expect(oneScope.containsKey("name2")).andReturn(false);
+        expect(oneScope.containsKey("name3")).andReturn(false);
+        expect(twoScope.containsKey("name2")).andReturn(true);
+        expect(twoScope.containsKey("name3")).andReturn(false);
+
+        replay(request, oneScope, twoScope);
+        assertEquals(".getContext(\"one\").get(index)", accessor.getSourceAccessor(null, request, "name1"));
+        assertEquals(".getContext(\"two\").get(index)", accessor.getSourceAccessor(null, request, "name2"));
+        assertNull(accessor.getSourceAccessor(null, request, "name3"));
+        verify(request, oneScope, twoScope);
+    }
+
+    @Test
+    public void testGetSourceSetter() {
+        Request request = createMock(Request.class);
+        Map<String, Object> oneScope = createMock(Map.class);
+        Map<String, Object> twoScope = createMock(Map.class);
+
+        expect(request.getAvailableScopes()).andReturn(Arrays.asList("one", "two")).anyTimes();
+        expect(request.getContext("one")).andReturn(oneScope).anyTimes();
+        expect(request.getContext("two")).andReturn(twoScope).anyTimes();
+        expect(oneScope.containsKey("name1")).andReturn(true);
+        expect(oneScope.containsKey("name2")).andReturn(false);
+        expect(oneScope.containsKey("name3")).andReturn(false);
+        expect(twoScope.containsKey("name2")).andReturn(true);
+        expect(twoScope.containsKey("name3")).andReturn(false);
+
+        replay(request, oneScope, twoScope);
+        assertEquals(".getContext(\"one\").put(index, target)", accessor.getSourceSetter(null, request, "name1"));
+        assertEquals(".getContext(\"two\").put(index, target)", accessor.getSourceSetter(null, request, "name2"));
+        assertEquals(".getContext(\"one\").put(index, target)", accessor.getSourceSetter(null, request, "name3"));
+        verify(request, oneScope, twoScope);
+    }
+
+    /**
+     * Test method for {@link AnyScopePropertyAccessor#setProperty(Map, Object, Object, Object)}.
+     */
+    @Test
+    public void testSetProperty() {
+        Request request = createMock(Request.class);
+        Map<String, Object> oneScope = createMock(Map.class);
+        Map<String, Object> twoScope = createMock(Map.class);
+
+        expect(request.getAvailableScopes()).andReturn(Arrays.asList("one", "two")).anyTimes();
+        expect(request.getContext("one")).andReturn(oneScope).anyTimes();
+        expect(request.getContext("two")).andReturn(twoScope).anyTimes();
+        expect(oneScope.containsKey("name1")).andReturn(true);
+        expect(oneScope.put("name1", "otherValue1")).andReturn("value1");
+        expect(oneScope.containsKey("name2")).andReturn(false);
+        expect(oneScope.containsKey("name3")).andReturn(false);
+        expect(twoScope.containsKey("name2")).andReturn(true);
+        expect(twoScope.put("name2", "otherValue2")).andReturn("value2");
+        expect(twoScope.containsKey("name3")).andReturn(false);
+        expect(oneScope.put("name3", "otherValue3")).andReturn(null);
+
+        replay(request, oneScope, twoScope);
+        accessor.setProperty(null, request, "name1", "otherValue1");
+        accessor.setProperty(null, request, "name2", "otherValue2");
+        accessor.setProperty(null, request, "name3", "otherValue3");
+        verify(request, oneScope, twoScope);
+    }
+
+}
diff --git a/plugins/tiles/src/test/java/org/apache/tiles/ognl/DelegatePropertyAccessorTest.java b/plugins/tiles/src/test/java/org/apache/tiles/ognl/DelegatePropertyAccessorTest.java
new file mode 100644
index 000000000..fc5470d74
--- /dev/null
+++ b/plugins/tiles/src/test/java/org/apache/tiles/ognl/DelegatePropertyAccessorTest.java
@@ -0,0 +1,111 @@
+/*
+ * 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.ognl;
+
+import ognl.OgnlContext;
+import ognl.OgnlException;
+import ognl.PropertyAccessor;
+import org.junit.Test;
+
+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;
+
+/**
+ * Tests {@link DelegatePropertyAccessor}.
+ */
+public class DelegatePropertyAccessorTest {
+
+    /**
+     * Test method for {@link DelegatePropertyAccessor#getProperty(Map, Object, Object)}.
+     *
+     * @throws OgnlException If something goes wrong.
+     */
+    @Test
+    public void testGetProperty() throws OgnlException {
+        PropertyAccessorDelegateFactory<Integer> factory = createMock(PropertyAccessorDelegateFactory.class);
+        PropertyAccessor mockAccessor = createMock(PropertyAccessor.class);
+        Map<String, Object> context = createMock(Map.class);
+        expect(factory.getPropertyAccessor("property", 1)).andReturn(mockAccessor);
+        expect(mockAccessor.getProperty(context, 1, "property")).andReturn("value");
+
+        replay(factory, mockAccessor, context);
+        PropertyAccessor accessor = new DelegatePropertyAccessor<>(factory);
+        assertEquals("value", accessor.getProperty(context, 1, "property"));
+        verify(factory, mockAccessor, context);
+    }
+
+    /**
+     * Test method for {@link DelegatePropertyAccessor#setProperty(Map, Object, Object, Object)}.
+     *
+     * @throws OgnlException If something goes wrong.
+     */
+    @Test
+    public void testSetProperty() throws OgnlException {
+        PropertyAccessorDelegateFactory<Integer> factory = createMock(PropertyAccessorDelegateFactory.class);
+        PropertyAccessor mockAccessor = createMock(PropertyAccessor.class);
+        Map<String, Object> context = createMock(Map.class);
+        expect(factory.getPropertyAccessor("property", 1)).andReturn(mockAccessor);
+        mockAccessor.setProperty(context, 1, "property", "value");
+
+        replay(factory, mockAccessor, context);
+        PropertyAccessor accessor = new DelegatePropertyAccessor<>(factory);
+        accessor.setProperty(context, 1, "property", "value");
+        verify(factory, mockAccessor, context);
+    }
+
+    /**
+     * Test method for {@link DelegatePropertyAccessor#getSourceAccessor(OgnlContext, Object, Object)}.
+     */
+    @Test
+    public void testGetSourceAccessor() {
+        PropertyAccessorDelegateFactory<Integer> factory = createMock(PropertyAccessorDelegateFactory.class);
+        PropertyAccessor mockAccessor = createMock(PropertyAccessor.class);
+        OgnlContext context = createMock(OgnlContext.class);
+        expect(factory.getPropertyAccessor("property", 1)).andReturn(mockAccessor);
+        expect(mockAccessor.getSourceAccessor(context, 1, "property")).andReturn("method");
+
+        replay(factory, mockAccessor, context);
+        PropertyAccessor accessor = new DelegatePropertyAccessor<>(factory);
+        assertEquals("method", accessor.getSourceAccessor(context, 1, "property"));
+        verify(factory, mockAccessor, context);
+    }
+
+    /**
+     * Test method for {@link DelegatePropertyAccessor#getSourceSetter(OgnlContext, Object, Object)}.
+     */
+    @Test
+    public void testGetSourceSetter() {
+        PropertyAccessorDelegateFactory<Integer> factory = createMock(PropertyAccessorDelegateFactory.class);
+        PropertyAccessor mockAccessor = createMock(PropertyAccessor.class);
+        OgnlContext context = createMock(OgnlContext.class);
+        expect(factory.getPropertyAccessor("property", 1)).andReturn(mockAccessor);
+        expect(mockAccessor.getSourceSetter(context, 1, "property")).andReturn("method");
+
+        replay(factory, mockAccessor, context);
+        PropertyAccessor accessor = new DelegatePropertyAccessor<>(factory);
+        assertEquals("method", accessor.getSourceSetter(context, 1, "property"));
+        verify(factory, mockAccessor, context);
+    }
+}
diff --git a/plugins/tiles/src/test/java/org/apache/tiles/ognl/NestedObjectDelegatePropertyAccessorTest.java b/plugins/tiles/src/test/java/org/apache/tiles/ognl/NestedObjectDelegatePropertyAccessorTest.java
new file mode 100644
index 000000000..0425d3c1c
--- /dev/null
+++ b/plugins/tiles/src/test/java/org/apache/tiles/ognl/NestedObjectDelegatePropertyAccessorTest.java
@@ -0,0 +1,106 @@
+/*
+ * 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.ognl;
+
+import ognl.OgnlContext;
+import ognl.OgnlException;
+import ognl.PropertyAccessor;
+import org.junit.Test;
+
+import java.util.Map;
+
+import static org.easymock.EasyMock.*;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Tests {@link NestedObjectDelegatePropertyAccessor}.
+ */
+public class NestedObjectDelegatePropertyAccessorTest {
+
+    /**
+     * Test method for {@link NestedObjectDelegatePropertyAccessor#getProperty(Map, Object, Object)}.
+     * @throws OgnlException If something goes wrong.
+     */
+    @Test
+    public void testGetProperty() throws OgnlException {
+        NestedObjectExtractor<Integer> nestedObjectExtractor = createMock(NestedObjectExtractor.class);
+        PropertyAccessor propertyAccessor = createMock(PropertyAccessor.class);
+        Map<String, Object> context = createMock(Map.class);
+        expect(propertyAccessor.getProperty(context, "nested", "property")).andReturn("value");
+        expect(nestedObjectExtractor.getNestedObject(1)).andReturn("nested");
+
+        replay(nestedObjectExtractor, propertyAccessor, context);
+        PropertyAccessor accessor = new NestedObjectDelegatePropertyAccessor<>(nestedObjectExtractor, propertyAccessor);
+        assertEquals("value", accessor.getProperty(context, 1, "property"));
+        verify(nestedObjectExtractor, propertyAccessor, context);
+    }
+
+    /**
+     * Test method for {@link NestedObjectDelegatePropertyAccessor#setProperty(Map, Object, Object, Object)}.
+     * @throws OgnlException If something goes wrong.
+     */
+    @Test
+    public void testSetProperty() throws OgnlException {
+        NestedObjectExtractor<Integer> nestedObjectExtractor = createMock(NestedObjectExtractor.class);
+        PropertyAccessor propertyAccessor = createMock(PropertyAccessor.class);
+        Map<String, Object> context = createMock(Map.class);
+        propertyAccessor.setProperty(context, "nested", "property", "value");
+        expect(nestedObjectExtractor.getNestedObject(1)).andReturn("nested");
+
+        replay(nestedObjectExtractor, propertyAccessor, context);
+        PropertyAccessor accessor = new NestedObjectDelegatePropertyAccessor<>(nestedObjectExtractor, propertyAccessor);
+        accessor.setProperty(context, 1, "property", "value");
+        verify(nestedObjectExtractor, propertyAccessor, context);
+    }
+
+    /**
+     * Test method for {@link NestedObjectDelegatePropertyAccessor#getSourceAccessor(OgnlContext, Object, Object)}.
+     */
+    @Test
+    public void testGetSourceAccessor() {
+        NestedObjectExtractor<Integer> nestedObjectExtractor = createMock(NestedObjectExtractor.class);
+        PropertyAccessor propertyAccessor = createMock(PropertyAccessor.class);
+        OgnlContext context = createMock(OgnlContext.class);
+        expect(propertyAccessor.getSourceAccessor(context, "nested", "property")).andReturn("method");
+        expect(nestedObjectExtractor.getNestedObject(1)).andReturn("nested");
+
+        replay(nestedObjectExtractor, propertyAccessor, context);
+        PropertyAccessor accessor = new NestedObjectDelegatePropertyAccessor<>(nestedObjectExtractor, propertyAccessor);
+        assertEquals("method", accessor.getSourceAccessor(context, 1, "property"));
+        verify(nestedObjectExtractor, propertyAccessor, context);
+    }
+
+    /**
+     * Test method for {@link NestedObjectDelegatePropertyAccessor#getSourceSetter(OgnlContext, Object, Object)}.
+     */
+    @Test
+    public void testGetSourceSetter() {
+        NestedObjectExtractor<Integer> nestedObjectExtractor = createMock(NestedObjectExtractor.class);
+        PropertyAccessor propertyAccessor = createMock(PropertyAccessor.class);
+        OgnlContext context = createMock(OgnlContext.class);
+        expect(propertyAccessor.getSourceSetter(context, "nested", "property")).andReturn("method");
+        expect(nestedObjectExtractor.getNestedObject(1)).andReturn("nested");
+
+        replay(nestedObjectExtractor, propertyAccessor, context);
+        PropertyAccessor accessor = new NestedObjectDelegatePropertyAccessor<>(nestedObjectExtractor, propertyAccessor);
+        assertEquals("method", accessor.getSourceSetter(context, 1, "property"));
+        verify(nestedObjectExtractor, propertyAccessor, context);
+    }
+
+}
diff --git a/plugins/tiles/src/test/java/org/apache/tiles/ognl/OGNLAttributeEvaluatorTest.java b/plugins/tiles/src/test/java/org/apache/tiles/ognl/OGNLAttributeEvaluatorTest.java
new file mode 100644
index 000000000..fbfe2081b
--- /dev/null
+++ b/plugins/tiles/src/test/java/org/apache/tiles/ognl/OGNLAttributeEvaluatorTest.java
@@ -0,0 +1,229 @@
+/*
+ * $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.ognl;
+
+import ognl.OgnlException;
+import ognl.OgnlRuntime;
+import ognl.PropertyAccessor;
+import org.apache.tiles.api.Attribute;
+import org.apache.tiles.api.Expression;
+import org.apache.tiles.core.evaluator.EvaluationException;
+import org.apache.tiles.request.ApplicationContext;
+import org.apache.tiles.request.Request;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.HashMap;
+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;
+
+/**
+ * Tests {@link OGNLAttributeEvaluator}.
+ *
+ * @version $Rev$ $Date$$
+ */
+public class OGNLAttributeEvaluatorTest {
+
+    /**
+     * The evaluator to test.
+     */
+    private OGNLAttributeEvaluator evaluator;
+
+    /**
+     * The request object to use.
+     */
+    private Request request;
+
+    /**
+     * The application context.
+     */
+    private ApplicationContext applicationContext;
+
+    /**
+     * Sets up the test.
+     *
+     * @throws OgnlException If something goes wrong.
+     */
+    @Before
+    public void setUp() throws OgnlException {
+        PropertyAccessor objectPropertyAccessor = OgnlRuntime.getPropertyAccessor(Object.class);
+        PropertyAccessor applicationContextPropertyAccessor = new NestedObjectDelegatePropertyAccessor<>(
+            new TilesApplicationContextNestedObjectExtractor(),
+            objectPropertyAccessor
+        );
+        PropertyAccessor anyScopePropertyAccessor = new AnyScopePropertyAccessor();
+        PropertyAccessor scopePropertyAccessor = new ScopePropertyAccessor();
+        PropertyAccessorDelegateFactory<Request> factory = new TilesContextPropertyAccessorDelegateFactory(
+            objectPropertyAccessor,
+            applicationContextPropertyAccessor,
+            anyScopePropertyAccessor,
+            scopePropertyAccessor
+        );
+        PropertyAccessor tilesRequestAccessor = new DelegatePropertyAccessor<>(factory);
+        OgnlRuntime.setPropertyAccessor(Request.class, tilesRequestAccessor);
+        evaluator = new OGNLAttributeEvaluator();
+        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 = createMock(Request.class);
+        expect(request.getContext("request")).andReturn(requestScope)
+            .anyTimes();
+        expect(request.getContext("session")).andReturn(sessionScope)
+            .anyTimes();
+        expect(request.getContext("application")).andReturn(applicationScope)
+            .anyTimes();
+        expect(request.getAvailableScopes()).andReturn(Arrays.asList("request", "session", "application"))
+            .anyTimes();
+        applicationContext = createMock(ApplicationContext.class);
+        expect(request.getApplicationContext()).andReturn(applicationContext)
+            .anyTimes();
+        expect(applicationContext.getApplicationScope()).andReturn(applicationScope)
+            .anyTimes();
+        replay(request, applicationContext);
+    }
+
+    /**
+     * Tears down the test.
+     */
+    @After
+    public void tearDown() {
+        verify(request, applicationContext);
+    }
+
+    /**
+     * Tests
+     * {@link OGNLAttributeEvaluator#evaluate(Attribute, Request)}.
+     */
+    @Test
+    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 OGNLAttributeEvaluator#evaluate(String, Request)}.
+     */
+    @Test
+    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", "String literal", evaluator
+            .evaluate(expression, request));
+    }
+
+    /**
+     * Tests {@link OGNLAttributeEvaluator#evaluate(String, Request)}.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testEvaluateNull() {
+        evaluator.evaluate((String) null, request);
+    }
+
+    /**
+     * Tests {@link OGNLAttributeEvaluator#evaluate(String, Request)}.
+     */
+    @Test(expected = EvaluationException.class)
+    public void testEvaluateOgnlException() {
+        evaluator.evaluate("wrong|||!!!!yes###", 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/ognl/ScopePropertyAccessorTest.java b/plugins/tiles/src/test/java/org/apache/tiles/ognl/ScopePropertyAccessorTest.java
new file mode 100644
index 000000000..86b29449c
--- /dev/null
+++ b/plugins/tiles/src/test/java/org/apache/tiles/ognl/ScopePropertyAccessorTest.java
@@ -0,0 +1,91 @@
+/*
+ * 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.ognl;
+
+import org.apache.tiles.request.Request;
+import org.junit.Before;
+import org.junit.Test;
+
+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;
+
+/**
+ * Tests {@link ScopePropertyAccessor}.
+ */
+public class ScopePropertyAccessorTest {
+
+    /**
+     * The accessor to test.
+     */
+    private ScopePropertyAccessor accessor;
+
+    /**
+     * Sets up the test.
+     */
+    @Before
+    public void setUp() {
+        accessor = new ScopePropertyAccessor();
+    }
+
+    /**
+     * Test method for {@link ScopePropertyAccessor#getProperty(Map, Object, Object)}.
+     */
+    @Test
+    public void testGetProperty() {
+        Request request = createMock(Request.class);
+        Map<String, Object> oneScope = createMock(Map.class);
+
+        expect(request.getContext("one")).andReturn(oneScope);
+
+        replay(request);
+        assertEquals(oneScope, accessor.getProperty(null, request, "oneScope"));
+        assertNull(accessor.getProperty(null, request, "whatever"));
+        verify(request);
+    }
+
+    @Test
+    public void testGetSourceAccessor() {
+        Request request = createMock(Request.class);
+
+        replay(request);
+        assertEquals(".getContext(\"one\")", accessor.getSourceAccessor(null, request, "oneScope"));
+        assertNull(accessor.getSourceAccessor(null, request, "whatever"));
+        verify(request);
+    }
+
+    @Test
+    public void testGetSourceSetter() {
+        assertNull(accessor.getSourceSetter(null, null, "whatever"));
+    }
+
+    /**
+     * Test method for {@link ScopePropertyAccessor#setProperty(Map, Object, Object, Object)}.
+     */
+    @Test
+    public void testSetProperty() {
+        accessor.setProperty(null, null, "whatever", "whateverValue");
+    }
+
+}
diff --git a/plugins/tiles/src/test/java/org/apache/tiles/ognl/TilesApplicationContextNestedObjectExtractorTest.java b/plugins/tiles/src/test/java/org/apache/tiles/ognl/TilesApplicationContextNestedObjectExtractorTest.java
new file mode 100644
index 000000000..b791a646c
--- /dev/null
+++ b/plugins/tiles/src/test/java/org/apache/tiles/ognl/TilesApplicationContextNestedObjectExtractorTest.java
@@ -0,0 +1,51 @@
+/*
+ * 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.ognl;
+
+import org.apache.tiles.request.ApplicationContext;
+import org.apache.tiles.request.Request;
+import org.junit.Test;
+
+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 TilesApplicationContextNestedObjectExtractor}.
+ */
+public class TilesApplicationContextNestedObjectExtractorTest {
+
+    /**
+     * Tests {@link TilesApplicationContextNestedObjectExtractor#getNestedObject(Request)}.
+     */
+    @Test
+    public void testGetNestedObject() {
+        Request request = createMock(Request.class);
+        ApplicationContext applicationContext = createMock(ApplicationContext.class);
+        expect(request.getApplicationContext()).andReturn(applicationContext);
+
+        replay(request, applicationContext);
+        NestedObjectExtractor<Request> extractor = new TilesApplicationContextNestedObjectExtractor();
+        assertEquals(applicationContext, extractor.getNestedObject(request));
+        verify(request, applicationContext);
+    }
+}
diff --git a/plugins/tiles/src/test/java/org/apache/tiles/ognl/TilesContextPropertyAccessorDelegateFactoryTest.java b/plugins/tiles/src/test/java/org/apache/tiles/ognl/TilesContextPropertyAccessorDelegateFactoryTest.java
new file mode 100644
index 000000000..8a70ae220
--- /dev/null
+++ b/plugins/tiles/src/test/java/org/apache/tiles/ognl/TilesContextPropertyAccessorDelegateFactoryTest.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.ognl;
+
+import ognl.PropertyAccessor;
+import org.apache.tiles.request.ApplicationContext;
+import org.apache.tiles.request.Request;
+import org.junit.Test;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Tests {@link TilesContextPropertyAccessorDelegateFactory}.
+ */
+public class TilesContextPropertyAccessorDelegateFactoryTest {
+
+    /**
+     * Test method for
+     * {@link TilesContextPropertyAccessorDelegateFactory#getPropertyAccessor(String, Request)}
+     * .
+     */
+    @Test
+    public void testGetPropertyAccessorRequest() {
+        PropertyAccessor objectPropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor applicationContextPropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor requestScopePropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor sessionScopePropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor applicationScopePropertyAccessor = createMock(PropertyAccessor.class);
+        Request request = createMock(Request.class);
+
+        replay(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
+            sessionScopePropertyAccessor, applicationScopePropertyAccessor, request);
+        PropertyAccessorDelegateFactory<Request> factory = new TilesContextPropertyAccessorDelegateFactory(
+            objectPropertyAccessor, applicationContextPropertyAccessor,
+            requestScopePropertyAccessor, sessionScopePropertyAccessor);
+        assertEquals(objectPropertyAccessor, factory.getPropertyAccessor("writer", request));
+
+        verify(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
+            sessionScopePropertyAccessor, applicationScopePropertyAccessor, request);
+    }
+
+    /**
+     * Test method for
+     * {@link TilesContextPropertyAccessorDelegateFactory#getPropertyAccessor(String, Request)}
+     * .
+     */
+    @Test
+    public void testGetPropertyAccessorApplication() {
+        PropertyAccessor objectPropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor applicationContextPropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor requestScopePropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor sessionScopePropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor applicationScopePropertyAccessor = createMock(PropertyAccessor.class);
+        Request request = createMock(Request.class);
+
+        replay(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
+            sessionScopePropertyAccessor, applicationScopePropertyAccessor, request);
+        PropertyAccessorDelegateFactory<Request> factory = new TilesContextPropertyAccessorDelegateFactory(
+            objectPropertyAccessor, applicationContextPropertyAccessor,
+            requestScopePropertyAccessor, sessionScopePropertyAccessor);
+        assertEquals(applicationContextPropertyAccessor, factory.getPropertyAccessor("initParams", request));
+
+        verify(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
+            sessionScopePropertyAccessor, applicationScopePropertyAccessor, request);
+    }
+
+    /**
+     * Test method for
+     * {@link TilesContextPropertyAccessorDelegateFactory#getPropertyAccessor(String, Request)}
+     * .
+     */
+    @Test
+    public void testGetPropertyAccessorRequestScope() {
+        PropertyAccessor objectPropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor applicationContextPropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor requestScopePropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor sessionScopePropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor applicationScopePropertyAccessor = createMock(PropertyAccessor.class);
+        Request request = createMock(Request.class);
+
+        replay(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
+            sessionScopePropertyAccessor, applicationScopePropertyAccessor, request);
+        PropertyAccessorDelegateFactory<Request> factory = new TilesContextPropertyAccessorDelegateFactory(
+            objectPropertyAccessor, applicationContextPropertyAccessor,
+            requestScopePropertyAccessor, sessionScopePropertyAccessor);
+        assertEquals(requestScopePropertyAccessor, factory.getPropertyAccessor("attribute", request));
+
+        verify(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
+            sessionScopePropertyAccessor, applicationScopePropertyAccessor, request);
+    }
+
+    /**
+     * Test method for
+     * {@link TilesContextPropertyAccessorDelegateFactory#getPropertyAccessor(String, Request)}
+     * .
+     */
+    @Test
+    public void testGetPropertyAccessorSessionScope() {
+        PropertyAccessor objectPropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor applicationContextPropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor requestScopePropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor sessionScopePropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor applicationScopePropertyAccessor = createMock(PropertyAccessor.class);
+        Request request = createMock(Request.class);
+
+        replay(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
+            sessionScopePropertyAccessor, applicationScopePropertyAccessor, request);
+        PropertyAccessorDelegateFactory<Request> factory = new TilesContextPropertyAccessorDelegateFactory(
+            objectPropertyAccessor, applicationContextPropertyAccessor,
+            requestScopePropertyAccessor, sessionScopePropertyAccessor);
+        assertEquals(requestScopePropertyAccessor, factory.getPropertyAccessor("attribute", request));
+
+        verify(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
+            sessionScopePropertyAccessor, applicationScopePropertyAccessor, request);
+    }
+
+    /**
+     * Test method for
+     * {@link TilesContextPropertyAccessorDelegateFactory#getPropertyAccessor(String, Request)}
+     * .
+     */
+    @Test
+    public void testGetPropertyAccessorApplicationScope() {
+        PropertyAccessor objectPropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor applicationContextPropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor requestScopePropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor sessionScopePropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor applicationScopePropertyAccessor = createMock(PropertyAccessor.class);
+        Request request = createMock(Request.class);
+        ApplicationContext applicationContext = createMock(ApplicationContext.class);
+
+        replay(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
+            sessionScopePropertyAccessor, applicationScopePropertyAccessor, request, applicationContext);
+        PropertyAccessorDelegateFactory<Request> factory = new TilesContextPropertyAccessorDelegateFactory(
+            objectPropertyAccessor, applicationContextPropertyAccessor,
+            requestScopePropertyAccessor, sessionScopePropertyAccessor);
+        assertEquals(requestScopePropertyAccessor, factory.getPropertyAccessor("attribute", request));
+
+        verify(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
+            sessionScopePropertyAccessor, applicationScopePropertyAccessor, request, applicationContext);
+    }
+
+    /**
+     * Test method for
+     * {@link TilesContextPropertyAccessorDelegateFactory#getPropertyAccessor(String, Request)}
+     * .
+     */
+    @Test
+    public void testGetPropertyAccessorRequestScopeDefault() {
+        PropertyAccessor objectPropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor applicationContextPropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor requestScopePropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor sessionScopePropertyAccessor = createMock(PropertyAccessor.class);
+        PropertyAccessor applicationScopePropertyAccessor = createMock(PropertyAccessor.class);
+        Request request = createMock(Request.class);
+        ApplicationContext applicationContext = createMock(ApplicationContext.class);
+
+        replay(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
+            sessionScopePropertyAccessor, applicationScopePropertyAccessor, request, applicationContext);
+        PropertyAccessorDelegateFactory<Request> factory = new TilesContextPropertyAccessorDelegateFactory(
+            objectPropertyAccessor, applicationContextPropertyAccessor,
+            requestScopePropertyAccessor, sessionScopePropertyAccessor);
+        assertEquals(requestScopePropertyAccessor, factory.getPropertyAccessor("attribute", request));
+
+        verify(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
+            sessionScopePropertyAccessor, applicationScopePropertyAccessor, request, applicationContext);
+    }
+
+}