TILESSB-11
Completed tests for tiles-autotag-core-runtime.

git-svn-id: https://svn.apache.org/repos/asf/tiles/sandbox/trunk/tiles-autotag@1037446 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/tiles-autotag-core-runtime/pom.xml b/tiles-autotag-core-runtime/pom.xml
index 90a3647..898f187 100644
--- a/tiles-autotag-core-runtime/pom.xml
+++ b/tiles-autotag-core-runtime/pom.xml
@@ -22,5 +22,11 @@
       	<version>4.7</version>
       	<scope>test</scope>
       </dependency>
+      <dependency>
+      	<groupId>org.easymock</groupId>
+      	<artifactId>easymock</artifactId>
+      	<version>3.0</version>
+      	<scope>test</scope>
+      </dependency>
   </dependencies>
 </project>
diff --git a/tiles-autotag-core-runtime/src/main/java/org/apache/tiles/autotag/core/runtime/composition/ComposeStackUtil.java b/tiles-autotag-core-runtime/src/main/java/org/apache/tiles/autotag/core/runtime/composition/ComposeStackUtil.java
index 4407beb..6eb91a0 100644
--- a/tiles-autotag-core-runtime/src/main/java/org/apache/tiles/autotag/core/runtime/composition/ComposeStackUtil.java
+++ b/tiles-autotag-core-runtime/src/main/java/org/apache/tiles/autotag/core/runtime/composition/ComposeStackUtil.java
@@ -31,7 +31,7 @@
  * Utilities to work with compose stacks.
  *
  * @version $Rev$ $Date$
- * @since 2.2.0
+ * @since 3.0.0
  */
 public final class ComposeStackUtil {
 
@@ -53,7 +53,7 @@
      * @param composeStack The compose stack to evaluate.
      * @param clazz The class to check.
      * @return The first ancestor that is assignable to the class, or null if not found.
-     * @since 2.2.0
+     * @since 3.0.0
      */
     public static Object findAncestorWithClass(Deque<Object> composeStack, Class<?> clazz) {
         for (Object obj : composeStack) {
@@ -70,7 +70,7 @@
      *
      * @param env The current FreeMarker environment.
      * @return The compose stack.
-     * @since 2.2.0
+     * @since 3.0.0
      */
     @SuppressWarnings("unchecked")
     public static Deque<Object> getComposeStack(Request request) {
diff --git a/tiles-autotag-core-runtime/src/test/java/org/apache/tiles/autotag/core/runtime/AbstractModelBodyTest.java b/tiles-autotag-core-runtime/src/test/java/org/apache/tiles/autotag/core/runtime/AbstractModelBodyTest.java
new file mode 100644
index 0000000..62c9b2f
--- /dev/null
+++ b/tiles-autotag-core-runtime/src/test/java/org/apache/tiles/autotag/core/runtime/AbstractModelBodyTest.java
@@ -0,0 +1,123 @@
+/**
+ *
+ */
+package org.apache.tiles.autotag.core.runtime;
+
+import static org.easymock.EasyMock.*;
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+
+import org.apache.tiles.autotag.core.runtime.util.NullWriter;
+import org.junit.Test;
+
+/**
+ * Tests {@link AbstractModelBody}.
+ *
+ * @version $Rev$ $Date$
+ */
+public class AbstractModelBodyTest {
+
+    /**
+     * Test method for {@link org.apache.tiles.autotag.core.runtime.AbstractModelBody#evaluate()}.
+     * @throws IOException If something goes wrong.
+     */
+    @Test
+    public void testEvaluate() throws IOException {
+        Writer writer = createMock(Writer.class);
+        AbstractModelBody modelBody = createMockBuilder(AbstractModelBody.class).withConstructor(writer).createMock();
+
+        modelBody.evaluate(writer);
+
+        replay(writer, modelBody);
+        modelBody.evaluate();
+        verify(writer, modelBody);
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.autotag.core.runtime.AbstractModelBody#evaluateAsString()}.
+     * @throws IOException If something goes wrong.
+     */
+    @Test
+    public void testEvaluateAsString() throws IOException {
+        AbstractModelBody modelBody = new MockModelBody(null, "return me");
+        assertEquals("return me", modelBody.evaluateAsString());
+
+        modelBody = new MockModelBody(null, "\n   \n");
+        assertNull(modelBody.evaluateAsString());
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.autotag.core.runtime.AbstractModelBody#evaluateAsString()}.
+     * @throws IOException If something goes wrong.
+     */
+    @Test(expected=IOException.class)
+    public void testEvaluateAsStringException() throws IOException {
+        Writer writer = createMock(Writer.class);
+        AbstractModelBody modelBody = createMockBuilder(AbstractModelBody.class).withConstructor(writer).createMock();
+
+        modelBody.evaluate(isA(StringWriter.class));
+        expectLastCall().andThrow(new IOException());
+
+        replay(writer, modelBody);
+        try {
+            modelBody.evaluateAsString();
+        } finally {
+            verify(writer, modelBody);
+        }
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.autotag.core.runtime.AbstractModelBody#evaluateWithoutWriting()}.
+     * @throws IOException If something goes wrong.
+     */
+    @Test
+    public void testEvaluateWithoutWriting() throws IOException {
+        Writer writer = createMock(Writer.class);
+        AbstractModelBody modelBody = createMockBuilder(AbstractModelBody.class).withConstructor(writer).createMock();
+
+        modelBody.evaluate(isA(NullWriter.class));
+
+        replay(writer, modelBody);
+        modelBody.evaluateWithoutWriting();
+        verify(writer, modelBody);
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.autotag.core.runtime.AbstractModelBody#evaluateWithoutWriting()}.
+     * @throws IOException If something goes wrong.
+     */
+    @Test(expected=IOException.class)
+    public void testEvaluateWithoutWritingException() throws IOException {
+        Writer writer = createMock(Writer.class);
+        AbstractModelBody modelBody = createMockBuilder(AbstractModelBody.class).withConstructor(writer).createMock();
+
+        modelBody.evaluate(isA(NullWriter.class));
+        expectLastCall().andThrow(new IOException());
+
+        replay(writer, modelBody);
+        try {
+            modelBody.evaluateWithoutWriting();
+        } finally {
+            verify(writer, modelBody);
+        }
+    }
+
+    public static class MockModelBody extends AbstractModelBody {
+
+        private String toReturn;
+
+        public MockModelBody(Writer defaultWriter, String toReturn) {
+            super(defaultWriter);
+            this.toReturn = toReturn;
+        }
+
+        @Override
+        public void evaluate(Writer writer) throws IOException {
+            writer.write(toReturn);
+        }
+
+    }
+}
diff --git a/tiles-autotag-core-runtime/src/test/java/org/apache/tiles/autotag/core/runtime/composition/ComposeStackUtilTest.java b/tiles-autotag-core-runtime/src/test/java/org/apache/tiles/autotag/core/runtime/composition/ComposeStackUtilTest.java
index d751629..c8ee4fa 100644
--- a/tiles-autotag-core-runtime/src/test/java/org/apache/tiles/autotag/core/runtime/composition/ComposeStackUtilTest.java
+++ b/tiles-autotag-core-runtime/src/test/java/org/apache/tiles/autotag/core/runtime/composition/ComposeStackUtilTest.java
@@ -21,12 +21,17 @@
 
 package org.apache.tiles.autotag.core.runtime.composition;
 
+import static org.easymock.EasyMock.*;
 import static org.junit.Assert.*;
 
 import java.util.ArrayDeque;
+import java.util.Date;
 import java.util.Deque;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.apache.tiles.autotag.core.runtime.composition.ComposeStackUtil;
+import org.apache.tiles.request.Request;
 import org.junit.Test;
 
 /**
@@ -65,6 +70,54 @@
         assertEquals(longValue, ComposeStackUtil.findAncestorWithClass(composeStack, Long.class));
         assertEquals(stringValue, ComposeStackUtil.findAncestorWithClass(composeStack, String.class));
         assertEquals(integerValue2, ComposeStackUtil.findAncestorWithClass(composeStack, Object.class));
+        assertNull(ComposeStackUtil.findAncestorWithClass(composeStack, Date.class));
     }
 
+    /**
+     * Tests {@link ComposeStackUtil#getComposeStack(org.apache.tiles.request.Request)}.
+     */
+    @Test
+    public void testGetComposeStackNull() {
+        Request request = createMock(Request.class);
+
+        Map<String, Object> requestScope = new HashMap<String, Object>();
+        expect(request.getContext("request")).andReturn(requestScope);
+
+        replay(request);
+        assertSame(ComposeStackUtil.getComposeStack(request), requestScope.get(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME));
+        verify(request);
+    }
+
+    /**
+     * Tests {@link ComposeStackUtil#getComposeStack(org.apache.tiles.request.Request)}.
+     */
+    /**
+     * Tests {@link ComposeStackUtil#getComposeStack(org.apache.tiles.request.Request)}.
+     */
+    @Test
+    public void testGetComposeStackNotNull() {
+        Request request = createMock(Request.class);
+        @SuppressWarnings("unchecked")
+        Deque<Object> composeStack = createMock(Deque.class);
+
+        Map<String, Object> requestScope = new HashMap<String, Object>();
+        requestScope.put(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME, composeStack);
+        expect(request.getContext("request")).andReturn(requestScope);
+
+        replay(request, composeStack);
+        assertSame(composeStack, ComposeStackUtil.getComposeStack(request));
+        verify(request, composeStack);
+    }
+
+    @Test
+    public void testGetComposeStackNoNull() {
+        Request request = createMock(Request.class);
+
+        Map<String, Object> requestScope = new HashMap<String, Object>();
+        expect(request.getContext("request")).andReturn(requestScope);
+
+        replay(request);
+        assertSame(ComposeStackUtil.getComposeStack(request), requestScope.get(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME));
+        verify(request);
+    }
 }