You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2005/10/26 18:45:28 UTC

svn commit: r328669 [2/2] - in /jakarta/tapestry/trunk: ./ framework/src/documentation/content/xdocs/tapestry/ComponentReference/ framework/src/java/org/apache/tapestry/components/ framework/src/java/org/apache/tapestry/engine/ framework/src/java/org/a...

Copied: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/FormSupportTest.java (from r328435, jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/TestFormSupport.java)
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/FormSupportTest.java?p2=jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/FormSupportTest.java&p1=jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/TestFormSupport.java&r1=328435&r2=328669&rev=328669&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/TestFormSupport.java (original)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/FormSupportTest.java Wed Oct 26 09:44:54 2005
@@ -16,9 +16,10 @@
 
 import org.apache.hivemind.ApplicationRuntimeException;
 import org.apache.hivemind.Location;
-import org.apache.hivemind.test.HiveMindTestCase;
 import org.apache.hivemind.util.ClasspathResource;
+import org.apache.tapestry.BaseComponentTestCase;
 import org.apache.tapestry.IEngine;
+import org.apache.tapestry.IForm;
 import org.apache.tapestry.IMarkupWriter;
 import org.apache.tapestry.IRender;
 import org.apache.tapestry.IRequestCycle;
@@ -27,7 +28,6 @@
 import org.apache.tapestry.StaleLinkException;
 import org.apache.tapestry.engine.ILink;
 import org.apache.tapestry.valid.IValidationDelegate;
-import org.easymock.MockControl;
 
 /**
  * Tests for {@link org.apache.tapestry.form.FormSupportImpl}.
@@ -35,7 +35,7 @@
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
-public class TestFormSupport extends HiveMindTestCase
+public class FormSupportTest extends BaseComponentTestCase
 {
 
     private IRender newComponentRenderBody(final FormSupport fs, final IFormComponent component,
@@ -62,11 +62,10 @@
 
     private IFormComponent newFormComponent(String id, String name)
     {
-        MockControl componentc = newControl(IFormComponent.class);
-        final IFormComponent component = (IFormComponent) componentc.getMock();
+        IFormComponent component = (IFormComponent) newMock(IFormComponent.class);
 
         component.getId();
-        componentc.setReturnValue(id);
+        setReturnValue(component, id);
 
         component.setName(name);
 
@@ -75,17 +74,16 @@
 
     private IFormComponent newFormComponent(String id, String extendedId, Location location)
     {
-        MockControl componentc = newControl(IFormComponent.class);
-        final IFormComponent component = (IFormComponent) componentc.getMock();
+        IFormComponent component = (IFormComponent) newMock(IFormComponent.class);
 
         component.getId();
-        componentc.setReturnValue(id);
+        setReturnValue(component, id);
 
         component.getExtendedId();
-        componentc.setReturnValue(extendedId);
+        setReturnValue(component, extendedId);
 
         component.getLocation();
-        componentc.setReturnValue(location);
+        setReturnValue(component, location);
 
         return component;
     }
@@ -95,47 +93,25 @@
         return (IValidationDelegate) newMock(IValidationDelegate.class);
     }
 
-    private IMarkupWriter newWriter()
-    {
-        return (IMarkupWriter) newMock(IMarkupWriter.class);
-    }
-
-    private NestedMarkupWriter newNestedWriter()
-    {
-        return (NestedMarkupWriter) newMock(NestedMarkupWriter.class);
-    }
-
     public void testComplexRender()
     {
-        MockControl writerc = newControl(IMarkupWriter.class);
-        IMarkupWriter writer = (IMarkupWriter) writerc.getMock();
-
+        IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
-
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
-        MockControl delegatec = newControl(IValidationDelegate.class);
-        IValidationDelegate delegate = (IValidationDelegate) delegatec.getMock();
+        IRequestCycle cycle = newCycle();
+        IEngine engine = newEngine(getClassResolver());
+        IValidationDelegate delegate = newDelegate();
+        ILink link = newLink();
+        IRender render = newRender();
 
         MockForm form = new MockForm(delegate);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(false);
-
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
+        trainIsRewound(cycle, form, false);
 
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
+        trainGetEngine(cycle, engine);
 
-        MockControl supportc = newControl(PageRenderSupport.class);
-        PageRenderSupport support = (PageRenderSupport) supportc.getMock();
+        PageRenderSupport support = newPageRenderSupport();
 
-        trainGetPageRenderSupport(cyclec, cycle, support);
+        trainGetPageRenderSupport(cycle, support);
 
         replayControls();
 
@@ -152,26 +128,16 @@
 
         form.setBody(body);
 
-        MockControl linkc = newControl(ILink.class);
-        ILink link = (ILink) linkc.getMock();
-
-        IRender render = (IRender) newMock(IRender.class);
-
         trainRegister(support);
 
-        link.getParameterNames();
-        linkc.setReturnValue(new String[]
+        trainGetParameterNames(link, new String[]
         { "service" });
-
-        link.getParameterValues("service");
-        linkc.setReturnValue(new String[]
+        trainGetParameterValues(link, "service", new String[]
         { "fred" });
 
-        writer.getNestedWriter();
-        writerc.setReturnValue(nested);
+        trainGetNestedWriter(writer, nested);
 
-        link.getURL(null, false);
-        linkc.setReturnValue("/app");
+        trainGetURL(link, null, "/app");
 
         writer.begin("form");
         writer.attribute("method", "post");
@@ -185,19 +151,19 @@
         writer.println();
 
         writer.begin("div");
-        
+
         trainHidden(writer, "formids", "barney,wilma,barney_0");
         trainHidden(writer, "service", "fred");
         trainHidden(writer, "submitmode", "");
 
         writer.end();
-        
+
         nested.close();
 
         writer.end();
 
-        trainGetFocusField(delegatec, delegate, "wilma");
-        trainGetFieldFocus(cyclec, cycle, null);
+        trainGetFocusField(delegate, "wilma");
+        trainGetFieldFocus(cycle, null);
 
         trainFocus(support);
 
@@ -205,11 +171,22 @@
 
         replayControls();
 
-        fs.render("post", render, link);
+        fs.render("post", render, link, null);
 
         verifyControls();
     }
 
+    protected void trainIsRewound(IRequestCycle cycle, IForm form, boolean isRewound)
+    {
+        cycle.isRewound(form);
+        setReturnValue(cycle, isRewound);
+    }
+
+    protected IEngine newEngine()
+    {
+        return (IEngine) newMock(IEngine.class);
+    }
+
     private void trainRegister(PageRenderSupport support)
     {
         support.addExternalScript(new ClasspathResource(getClassResolver(),
@@ -228,50 +205,29 @@
         cycle.setAttribute(FormSupportImpl.FIELD_FOCUS_ATTRIBUTE, Boolean.TRUE);
     }
 
-    private void trainGetFieldFocus(MockControl control, IRequestCycle cycle, Object value)
+    private void trainGetFieldFocus(IRequestCycle cycle, Object value)
     {
         cycle.getAttribute(FormSupportImpl.FIELD_FOCUS_ATTRIBUTE);
-        control.setReturnValue(value);
+        setReturnValue(cycle, value);
     }
 
-    private void trainGetPageRenderSupport(MockControl control, IRequestCycle cycle,
-            PageRenderSupport support)
-    {
-        cycle.getAttribute("org.apache.tapestry.PageRenderSupport");
-        control.setReturnValue(support);
-    }
-
-    private void trainGetFocusField(MockControl control, IValidationDelegate delegate,
-            String fieldName)
+    private void trainGetFocusField(IValidationDelegate delegate, String fieldName)
     {
         delegate.getFocusField();
-        control.setReturnValue(fieldName);
+        setReturnValue(delegate, fieldName);
     }
 
     public void testComplexRewind()
     {
         IMarkupWriter writer = newWriter();
-
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
+        IRequestCycle cycle = newCycle();
         IValidationDelegate delegate = newDelegate();
-
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
+        IEngine engine = newEngine(getClassResolver());
         MockForm form = new MockForm(delegate);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(true);
-
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
-
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
-
-        trainGetPageRenderSupport(cyclec, cycle, null);
+        trainIsRewound(cycle, form, true);
+        trainGetEngine(cycle, engine);
+        trainGetPageRenderSupport(cycle, null);
 
         replayControls();
 
@@ -281,7 +237,7 @@
 
         delegate.clear();
 
-        trainCycleForRewind(cyclec, cycle, "barney,wilma,barney_0", null);
+        trainCycleForRewind(cycle, "barney,wilma,barney_0", null);
 
         final IFormComponent barney1 = newFormComponent("barney", "barney");
         final IFormComponent wilma = newFormComponent("wilma", "wilma");
@@ -301,35 +257,20 @@
 
     public void testComplexSubmitEventHandler()
     {
-        MockControl writerc = newControl(IMarkupWriter.class);
-        IMarkupWriter writer = (IMarkupWriter) writerc.getMock();
-
+        IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
-
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
-        MockControl delegatec = newControl(IValidationDelegate.class);
-        IValidationDelegate delegate = (IValidationDelegate) delegatec.getMock();
+        IRequestCycle cycle = newCycle();
+        IEngine engine = newEngine(getClassResolver());
+        IValidationDelegate delegate = newDelegate();
+        PageRenderSupport support = newPageRenderSupport();
+        ILink link = newLink();
+        IRender render = newRender();
 
         MockForm form = new MockForm(delegate);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(false);
-
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
-
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
-
-        MockControl supportc = newControl(PageRenderSupport.class);
-        PageRenderSupport support = (PageRenderSupport) supportc.getMock();
-
-        trainGetPageRenderSupport(cyclec, cycle, support);
+        trainIsRewound(cycle, form, false);
+        trainGetEngine(cycle, engine);
+        trainGetPageRenderSupport(cycle, support);
 
         replayControls();
 
@@ -347,26 +288,17 @@
             }
         });
 
-        MockControl linkc = newControl(ILink.class);
-        ILink link = (ILink) linkc.getMock();
-
-        IRender render = (IRender) newMock(IRender.class);
-
         trainRegister(support);
 
-        link.getParameterNames();
-        linkc.setReturnValue(new String[]
+        trainGetParameterNames(link, new String[]
         { "service" });
 
-        link.getParameterValues("service");
-        linkc.setReturnValue(new String[]
+        trainGetParameterValues(link, "service", new String[]
         { "fred" });
 
-        writer.getNestedWriter();
-        writerc.setReturnValue(nested);
+        trainGetNestedWriter(writer, nested);
 
-        link.getURL(null, false);
-        linkc.setReturnValue("/app");
+        trainGetURL(link, null, "/app");
 
         writer.begin("form");
         writer.attribute("method", "post");
@@ -380,13 +312,13 @@
         writer.println();
 
         writer.begin("div");
-        
+
         trainHidden(writer, "formids", "");
         trainHidden(writer, "service", "fred");
         trainHidden(writer, "submitmode", "");
 
         writer.end();
-        
+
         nested.close();
 
         writer.end();
@@ -396,46 +328,40 @@
 
         // Side test: what if no focus field?
 
-        trainGetFocusField(delegatec, delegate, null);
+        trainGetFocusField(delegate, null);
 
         replayControls();
 
-        fs.render("post", render, link);
+        fs.render("post", render, link, null);
 
         verifyControls();
     }
 
-    public void testEncodingType()
+    private void trainGetURL(ILink link, String scheme, String URL)
     {
-        MockControl writerc = newControl(IMarkupWriter.class);
-        IMarkupWriter writer = (IMarkupWriter) writerc.getMock();
-
-        NestedMarkupWriter nested = newNestedWriter();
+        // This will change shortly, with the new scheme parameter passed into FormSupport.render()
 
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
+        link.getURL(scheme, null, 0, null, false);
+        setReturnValue(link, URL);
+    }
 
-        MockControl delegatec = newControl(IValidationDelegate.class);
-        IValidationDelegate delegate = (IValidationDelegate) delegatec.getMock();
+    public void testEncodingType()
+    {
+        IMarkupWriter writer = newWriter();
+        NestedMarkupWriter nested = newNestedWriter();
+        IRequestCycle cycle = newCycle();
+        IEngine engine = newEngine(getClassResolver());
+        IValidationDelegate delegate = newDelegate();
+        PageRenderSupport support = newPageRenderSupport();
+        ILink link = newLink();
+        IRender render = newRender();
 
         MockForm form = new MockForm(delegate);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(false);
-
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
-
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
+        trainIsRewound(cycle, form, false);
+        trainGetEngine(cycle, engine);
 
-        MockControl supportc = newControl(PageRenderSupport.class);
-        PageRenderSupport support = (PageRenderSupport) supportc.getMock();
-
-        trainGetPageRenderSupport(cyclec, cycle, support);
+        trainGetPageRenderSupport(cycle, support);
 
         replayControls();
 
@@ -451,26 +377,17 @@
             }
         });
 
-        MockControl linkc = newControl(ILink.class);
-        ILink link = (ILink) linkc.getMock();
-
-        IRender render = (IRender) newMock(IRender.class);
-
         trainRegister(support);
 
-        link.getParameterNames();
-        linkc.setReturnValue(new String[]
+        trainGetParameterNames(link, new String[]
         { "service" });
 
-        link.getParameterValues("service");
-        linkc.setReturnValue(new String[]
+        trainGetParameterValues(link, "service", new String[]
         { "fred" });
 
-        writer.getNestedWriter();
-        writerc.setReturnValue(nested);
+        trainGetNestedWriter(writer, nested);
 
-        link.getURL(null, false);
-        linkc.setReturnValue("/app");
+        trainGetURL(link, null, "/app");
 
         writer.begin("form");
         writer.attribute("method", "post");
@@ -484,57 +401,44 @@
         writer.println();
 
         writer.begin("div");
-        
+
         trainHidden(writer, "formids", "");
         trainHidden(writer, "service", "fred");
         trainHidden(writer, "submitmode", "");
 
         writer.end();
-        
+
         nested.close();
 
         writer.end();
 
-        trainGetFocusField(delegatec, delegate, null);
+        trainGetFocusField(delegate, null);
 
         replayControls();
 
-        fs.render("post", render, link);
+        fs.render("post", render, link, null);
 
         verifyControls();
     }
 
     public void testHiddenValues()
     {
-        MockControl writerc = newControl(IMarkupWriter.class);
-        IMarkupWriter writer = (IMarkupWriter) writerc.getMock();
-
+        IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
-
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
-        MockControl delegatec = newControl(IValidationDelegate.class);
-        IValidationDelegate delegate = (IValidationDelegate) delegatec.getMock();
+        IRequestCycle cycle = newCycle();
+        IEngine engine = newEngine(getClassResolver());
+        IValidationDelegate delegate = newDelegate();
+        PageRenderSupport support = newPageRenderSupport();
+        ILink link = newLink();
+        IRender render = newRender();
 
         MockForm form = new MockForm(delegate);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(false);
-
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
+        trainIsRewound(cycle, form, false);
 
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
+        trainGetEngine(cycle, engine);
 
-        MockControl supportc = newControl(PageRenderSupport.class);
-        PageRenderSupport support = (PageRenderSupport) supportc.getMock();
-
-        trainGetPageRenderSupport(cyclec, cycle, support);
+        trainGetPageRenderSupport(cycle, support);
 
         replayControls();
 
@@ -551,26 +455,17 @@
             }
         });
 
-        MockControl linkc = newControl(ILink.class);
-        ILink link = (ILink) linkc.getMock();
-
-        IRender render = (IRender) newMock(IRender.class);
-
         trainRegister(support);
 
-        link.getParameterNames();
-        linkc.setReturnValue(new String[]
+        trainGetParameterNames(link, new String[]
         { "service" });
 
-        link.getParameterValues("service");
-        linkc.setReturnValue(new String[]
+        trainGetParameterValues(link, "service", new String[]
         { "fred" });
 
-        writer.getNestedWriter();
-        writerc.setReturnValue(nested);
+        trainGetNestedWriter(writer, nested);
 
-        link.getURL(null, false);
-        linkc.setReturnValue("/app");
+        trainGetURL(link, null, "/app");
 
         writer.begin("form");
         writer.attribute("method", "post");
@@ -592,48 +487,38 @@
         trainHidden(writer, "hidden2", "id2", "value2");
 
         writer.end();
-        
+
         nested.close();
 
         writer.end();
 
-        trainGetFocusField(delegatec, delegate, null);
+        trainGetFocusField(delegate, null);
 
         replayControls();
 
-        fs.render("post", render, link);
+        fs.render("post", render, link, null);
 
         verifyControls();
     }
 
     public void testInvalidEncodingType()
     {
-        MockControl writerc = newControl(IMarkupWriter.class);
-        IMarkupWriter writer = (IMarkupWriter) writerc.getMock();
-
+        IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
+        IRequestCycle cycle = newCycle();
+        IEngine engine = newEngine(getClassResolver());
+        IValidationDelegate delegate = newDelegate();
+        PageRenderSupport support = newPageRenderSupport();
+        ILink link = newLink();
+        IRender render = newRender();
 
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
-        MockForm form = new MockForm(newDelegate());
-
-        cycle.isRewound(form);
-        cyclec.setReturnValue(false);
-
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
+        MockForm form = new MockForm(delegate);
 
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
+        trainIsRewound(cycle, form, false);
 
-        MockControl supportc = newControl(PageRenderSupport.class);
-        PageRenderSupport support = (PageRenderSupport) supportc.getMock();
+        trainGetEngine(cycle, engine);
 
-        trainGetPageRenderSupport(cyclec, cycle, support);
+        trainGetPageRenderSupport(cycle, support);
 
         replayControls();
 
@@ -650,29 +535,21 @@
             }
         });
 
-        MockControl linkc = newControl(ILink.class);
-        ILink link = (ILink) linkc.getMock();
-
-        IRender render = (IRender) newMock(IRender.class);
-
         trainRegister(support);
 
-        link.getParameterNames();
-        linkc.setReturnValue(new String[]
+        trainGetParameterNames(link, new String[]
         { "service" });
 
-        link.getParameterValues("service");
-        linkc.setReturnValue(new String[]
+        trainGetParameterValues(link, "service", new String[]
         { "fred" });
 
-        writer.getNestedWriter();
-        writerc.setReturnValue(nested);
+        trainGetNestedWriter(writer, nested);
 
         replayControls();
 
         try
         {
-            fs.render("post", render, link);
+            fs.render("post", render, link, null);
             unreachable();
         }
         catch (ApplicationRuntimeException ex)
@@ -688,35 +565,22 @@
 
     public void testRenderExtraReservedIds()
     {
-        MockControl writerc = newControl(IMarkupWriter.class);
-        IMarkupWriter writer = (IMarkupWriter) writerc.getMock();
-
+        IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
-
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
-        MockControl delegatec = newControl(IValidationDelegate.class);
-        IValidationDelegate delegate = (IValidationDelegate) delegatec.getMock();
+        IRequestCycle cycle = newCycle();
+        IEngine engine = newEngine(getClassResolver());
+        IValidationDelegate delegate = newDelegate();
+        PageRenderSupport support = newPageRenderSupport();
+        ILink link = newLink();
+        IRender render = newRender();
 
         MockForm form = new MockForm(delegate);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(false);
-
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
+        trainIsRewound(cycle, form, false);
 
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
+        trainGetEngine(cycle, engine);
 
-        MockControl supportc = newControl(PageRenderSupport.class);
-        PageRenderSupport support = (PageRenderSupport) supportc.getMock();
-
-        trainGetPageRenderSupport(cyclec, cycle, support);
+        trainGetPageRenderSupport(cycle, support);
 
         replayControls();
 
@@ -730,26 +594,17 @@
 
         form.setBody(body);
 
-        MockControl linkc = newControl(ILink.class);
-        ILink link = (ILink) linkc.getMock();
-
-        IRender render = (IRender) newMock(IRender.class);
-
         trainRegister(support);
 
-        link.getParameterNames();
-        linkc.setReturnValue(new String[]
+        trainGetParameterNames(link, new String[]
         { "action" });
 
-        link.getParameterValues("action");
-        linkc.setReturnValue(new String[]
+        trainGetParameterValues(link, "action", new String[]
         { "fred" });
 
-        writer.getNestedWriter();
-        writerc.setReturnValue(nested);
+        trainGetNestedWriter(writer, nested);
 
-        link.getURL(null, false);
-        linkc.setReturnValue("/app");
+        trainGetURL(link, null, "/app");
 
         writer.begin("form");
         writer.attribute("method", "post");
@@ -763,58 +618,45 @@
         writer.println();
 
         writer.begin("div");
- 
+
         trainHidden(writer, "formids", "action_0");
         trainHidden(writer, "action", "fred");
         trainHidden(writer, "reservedids", "action");
         trainHidden(writer, "submitmode", "");
 
         writer.end();
-        
+
         nested.close();
 
         writer.end();
 
-        trainGetFocusField(delegatec, delegate, null);
+        trainGetFocusField(delegate, null);
 
         replayControls();
 
-        fs.render("post", render, link);
+        fs.render("post", render, link, null);
 
         verifyControls();
     }
 
     public void testResetEventHandler()
     {
-        MockControl writerc = newControl(IMarkupWriter.class);
-        IMarkupWriter writer = (IMarkupWriter) writerc.getMock();
-
+        IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
-
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
-        MockControl delegatec = newControl(IValidationDelegate.class);
-        IValidationDelegate delegate = (IValidationDelegate) delegatec.getMock();
+        IRequestCycle cycle = newCycle();
+        IEngine engine = newEngine(getClassResolver());
+        IValidationDelegate delegate = newDelegate();
+        PageRenderSupport support = newPageRenderSupport();
+        ILink link = newLink();
+        IRender render = newRender();
 
         MockForm form = new MockForm(delegate);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(false);
-
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
+        trainIsRewound(cycle, form, false);
 
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
+        trainGetEngine(cycle, engine);
 
-        MockControl supportc = newControl(PageRenderSupport.class);
-        PageRenderSupport support = (PageRenderSupport) supportc.getMock();
-
-        trainGetPageRenderSupport(cyclec, cycle, support);
+        trainGetPageRenderSupport(cycle, support);
 
         replayControls();
 
@@ -831,26 +673,17 @@
             }
         });
 
-        MockControl linkc = newControl(ILink.class);
-        ILink link = (ILink) linkc.getMock();
-
-        IRender render = (IRender) newMock(IRender.class);
-
         trainRegister(support);
 
-        link.getParameterNames();
-        linkc.setReturnValue(new String[]
+        trainGetParameterNames(link, new String[]
         { "service" });
 
-        link.getParameterValues("service");
-        linkc.setReturnValue(new String[]
+        trainGetParameterValues(link, "service", new String[]
         { "fred" });
 
-        writer.getNestedWriter();
-        writerc.setReturnValue(nested);
+        trainGetNestedWriter(writer, nested);
 
-        link.getURL(null, false);
-        linkc.setReturnValue("/app");
+        trainGetURL(link, null, "/app");
 
         writer.begin("form");
         writer.attribute("method", "post");
@@ -870,7 +703,7 @@
         trainHidden(writer, "submitmode", "");
 
         writer.end();
-        
+
         nested.close();
 
         writer.end();
@@ -878,11 +711,11 @@
         support
                 .addInitializationScript("Tapestry.onreset('myform', function (event)\n{\n  myReset1();\n  myReset2();\n});\n");
 
-        trainGetFocusField(delegatec, delegate, null);
+        trainGetFocusField(delegate, null);
 
         replayControls();
 
-        fs.render("post", render, link);
+        fs.render("post", render, link, null);
 
         verifyControls();
     }
@@ -890,26 +723,18 @@
     public void testRewindExtraReservedIds()
     {
         IMarkupWriter writer = newWriter();
-
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
+        NestedMarkupWriter nested = newNestedWriter();
+        IRequestCycle cycle = newCycle();
+        IEngine engine = newEngine(getClassResolver());
         IValidationDelegate delegate = newDelegate();
 
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
         MockForm form = new MockForm(delegate);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(true);
-
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
+        trainIsRewound(cycle, form, true);
 
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
+        trainGetEngine(cycle, engine);
 
-        trainGetPageRenderSupport(cyclec, cycle, null);
+        trainGetPageRenderSupport(cycle, null);
 
         replayControls();
 
@@ -919,7 +744,7 @@
 
         delegate.clear();
 
-        trainCycleForRewind(cyclec, cycle, "action_0", "action");
+        trainCycleForRewind(cycle, "action_0", "action");
 
         final IFormComponent component = newFormComponent("action", "action_0");
 
@@ -936,29 +761,16 @@
 
     public void testRewindMismatch()
     {
-
         IMarkupWriter writer = newWriter();
-
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
+        IRequestCycle cycle = newCycle();
+        IEngine engine = newEngine(getClassResolver());
         IValidationDelegate delegate = newDelegate();
 
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
         MockForm form = new MockForm(delegate);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(true);
-
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
-
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
-
-        trainGetPageRenderSupport(cyclec, cycle, null);
+        trainIsRewound(cycle, form, true);
+        trainGetEngine(cycle, engine);
+        trainGetPageRenderSupport(cycle, null);
 
         replayControls();
 
@@ -974,7 +786,7 @@
         // some kind of conditional that evaluated to true during the render,
         // but is now false on the rewind.
 
-        trainCycleForRewind(cyclec, cycle, "barney,wilma,pebbles,barney_0", null);
+        trainCycleForRewind(cycle, "barney,wilma,pebbles,barney_0", null);
 
         final IFormComponent barney1 = newFormComponent("barney", "barney");
         final IFormComponent wilma = newFormComponent("wilma", "wilma");
@@ -1007,27 +819,15 @@
     public void testRewindTooLong()
     {
         IMarkupWriter writer = newWriter();
-
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
+        IRequestCycle cycle = newCycle();
+        IEngine engine = newEngine(getClassResolver());
         IValidationDelegate delegate = newDelegate();
 
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
         MockForm form = new MockForm(delegate);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(true);
-
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
-
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
-
-        trainGetPageRenderSupport(cyclec, cycle, null);
+        trainIsRewound(cycle, form, true);
+        trainGetEngine(cycle, engine);
+        trainGetPageRenderSupport(cycle, null);
 
         replayControls();
 
@@ -1043,7 +843,7 @@
         // some kind of loop that executed once on the render, but twice
         // on the rewind (i.e., an additional object was added in between).
 
-        trainCycleForRewind(cyclec, cycle, "barney,wilma", null);
+        trainCycleForRewind(cycle, "barney,wilma", null);
 
         final IFormComponent barney1 = newFormComponent("barney", "barney");
         final IFormComponent wilma = newFormComponent("wilma", "wilma");
@@ -1077,27 +877,15 @@
     {
         Location l = newLocation();
         IMarkupWriter writer = newWriter();
-
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
+        IRequestCycle cycle = newCycle();
+        IEngine engine = newEngine(getClassResolver());
         IValidationDelegate delegate = newDelegate();
 
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
         MockForm form = new MockForm(delegate, l);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(true);
-
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
-
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
-
-        trainGetPageRenderSupport(cyclec, cycle, null);
+        trainIsRewound(cycle, form, true);
+        trainGetEngine(cycle, engine);
+        trainGetPageRenderSupport(cycle, null);
 
         replayControls();
 
@@ -1111,7 +899,7 @@
         // some kind of loop that executed twice on the render, but only once
         // on the rewind (i.e., the object was deleted in between).
 
-        trainCycleForRewind(cyclec, cycle, "barney,wilma,barney$0", null);
+        trainCycleForRewind(cycle, "barney,wilma,barney$0", null);
 
         final IFormComponent barney1 = newFormComponent("barney", "barney");
         final IFormComponent wilma = newFormComponent("wilma", "wilma");
@@ -1142,35 +930,23 @@
 
     public void testSimpleRender()
     {
-        MockControl writerc = newControl(IMarkupWriter.class);
-        IMarkupWriter writer = (IMarkupWriter) writerc.getMock();
-
+        IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
-
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
-        MockControl delegatec = newControl(IValidationDelegate.class);
-        IValidationDelegate delegate = (IValidationDelegate) delegatec.getMock();
+        IRequestCycle cycle = newCycle();
+        IEngine engine = newEngine(getClassResolver());
+        IValidationDelegate delegate = newDelegate();
+        ILink link = newLink();
+        IRender render = newRender();
 
         MockForm form = new MockForm(delegate);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(false);
-
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
+        trainIsRewound(cycle, form, false);
 
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
+        trainGetEngine(cycle, engine);
 
-        MockControl supportc = newControl(PageRenderSupport.class);
-        PageRenderSupport support = (PageRenderSupport) supportc.getMock();
+        PageRenderSupport support = newPageRenderSupport();
 
-        trainGetPageRenderSupport(cyclec, cycle, support);
+        trainGetPageRenderSupport(cycle, support);
 
         replayControls();
 
@@ -1184,26 +960,16 @@
 
         form.setBody(body);
 
-        MockControl linkc = newControl(ILink.class);
-        ILink link = (ILink) linkc.getMock();
-
-        IRender render = (IRender) newMock(IRender.class);
-
         trainRegister(support);
 
-        link.getParameterNames();
-        linkc.setReturnValue(new String[]
+        trainGetParameterNames(link, new String[]
         { "service" });
-
-        link.getParameterValues("service");
-        linkc.setReturnValue(new String[]
+        trainGetParameterValues(link, "service", new String[]
         { "fred" });
 
-        writer.getNestedWriter();
-        writerc.setReturnValue(nested);
+        trainGetNestedWriter(writer, nested);
 
-        link.getURL(null, false);
-        linkc.setReturnValue("/app");
+        trainGetURL(link, null, "/app");
 
         writer.begin("form");
         writer.attribute("method", "post");
@@ -1223,55 +989,122 @@
         trainHidden(writer, "submitmode", "");
 
         writer.end();
-        
+
         nested.close();
 
         writer.end();
 
-        trainGetFocusField(delegatec, delegate, "barney");
+        trainGetFocusField(delegate, "barney");
 
         // Side test: check for another form already grabbing focus
 
-        trainGetFieldFocus(cyclec, cycle, Boolean.TRUE);
+        trainGetFieldFocus(cycle, Boolean.TRUE);
 
         replayControls();
 
-        fs.render("post", render, link);
+        fs.render("post", render, link, null);
 
         verifyControls();
     }
 
-    public void testSimpleRenderWithDeferredRunnable()
+    public void testSimpleRenderWithScheme()
     {
-        MockControl writerc = newControl(IMarkupWriter.class);
-        IMarkupWriter writer = (IMarkupWriter) writerc.getMock();
-
+        IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
+        IRequestCycle cycle = newCycle();
+        IEngine engine = newEngine(getClassResolver());
+        IValidationDelegate delegate = newDelegate();
+        ILink link = newLink();
+        IRender render = newRender();
 
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
+        MockForm form = new MockForm(delegate);
 
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
+        trainIsRewound(cycle, form, false);
 
-        MockControl delegatec = newControl(IValidationDelegate.class);
-        IValidationDelegate delegate = (IValidationDelegate) delegatec.getMock();
+        trainGetEngine(cycle, engine);
 
-        MockForm form = new MockForm(delegate);
+        PageRenderSupport support = newPageRenderSupport();
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(false);
+        trainGetPageRenderSupport(cycle, support);
+
+        replayControls();
+
+        final FormSupport fs = new FormSupportImpl(writer, cycle, form);
+
+        verifyControls();
+
+        final IFormComponent component = newFormComponent("barney", "barney");
+
+        IRender body = newComponentRenderBody(fs, component, nested);
+
+        form.setBody(body);
+
+        trainRegister(support);
+
+        trainGetParameterNames(link, new String[]
+        { "service" });
+        trainGetParameterValues(link, "service", new String[]
+        { "fred" });
+
+        trainGetNestedWriter(writer, nested);
+
+        trainGetURL(link, "https", "https://foo.bar/app");
+
+        writer.begin("form");
+        writer.attribute("method", "post");
+        writer.attribute("action", "https://foo.bar/app");
+
+        writer.attribute("name", "myform");
+        writer.attribute("id", "myform");
+
+        render.render(writer, cycle);
+
+        writer.println();
+
+        writer.begin("div");
+
+        trainHidden(writer, "formids", "barney");
+        trainHidden(writer, "service", "fred");
+        trainHidden(writer, "submitmode", "");
+
+        writer.end();
 
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
+        nested.close();
+
+        writer.end();
+
+        trainGetFocusField(delegate, "barney");
+
+        // Side test: check for another form already grabbing focus
+
+        trainGetFieldFocus(cycle, Boolean.TRUE);
+
+        replayControls();
+
+        fs.render("post", render, link, "https");
+
+        verifyControls();
+    }
+
+    public void testSimpleRenderWithDeferredRunnable()
+    {
+        IMarkupWriter writer = newWriter();
+        NestedMarkupWriter nested = newNestedWriter();
+        IRequestCycle cycle = newCycle();
+        IEngine engine = newEngine(getClassResolver());
+        IValidationDelegate delegate = newDelegate();
+        ILink link = newLink();
+        IRender render = newRender();
+
+        MockForm form = new MockForm(delegate);
+
+        trainIsRewound(cycle, form, false);
 
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
+        trainGetEngine(cycle, engine);
 
-        MockControl supportc = newControl(PageRenderSupport.class);
-        PageRenderSupport support = (PageRenderSupport) supportc.getMock();
+        PageRenderSupport support = newPageRenderSupport();
 
-        trainGetPageRenderSupport(cyclec, cycle, support);
+        trainGetPageRenderSupport(cycle, support);
 
         replayControls();
 
@@ -1299,26 +1132,16 @@
 
         form.setBody(body);
 
-        MockControl linkc = newControl(ILink.class);
-        ILink link = (ILink) linkc.getMock();
-
-        IRender render = (IRender) newMock(IRender.class);
-
         trainRegister(support);
 
-        link.getParameterNames();
-        linkc.setReturnValue(new String[]
+        trainGetParameterNames(link, new String[]
         { "service" });
-
-        link.getParameterValues("service");
-        linkc.setReturnValue(new String[]
+        trainGetParameterValues(link, "service", new String[]
         { "fred" });
 
-        writer.getNestedWriter();
-        writerc.setReturnValue(nested);
+        trainGetNestedWriter(writer, nested);
 
-        link.getURL(null, false);
-        linkc.setReturnValue("/app");
+        trainGetURL(link, null, "/app");
 
         writer.begin("form");
         writer.attribute("method", "post");
@@ -1338,7 +1161,7 @@
         trainHidden(writer, "submitmode", "");
 
         writer.end();
-        
+
         // EasyMock can't fully verify that this gets called at the right moment, nor can we truly
         // prove (well, except by looking at the code), that the deferred runnables execute at the
         // right time.
@@ -1349,11 +1172,11 @@
 
         writer.end();
 
-        trainGetFocusField(delegatec, delegate, null);
+        trainGetFocusField(delegate, null);
 
         replayControls();
 
-        fs.render("post", render, link);
+        fs.render("post", render, link, null);
 
         verifyControls();
     }
@@ -1361,27 +1184,16 @@
     public void testSimpleRewind()
     {
         IMarkupWriter writer = newWriter();
-
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
+        IRequestCycle cycle = newCycle();
         IValidationDelegate delegate = newDelegate();
-
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
+        IEngine engine = newEngine(getClassResolver());
         MockForm form = new MockForm(delegate);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(true);
-
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
+        trainIsRewound(cycle, form, true);
 
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
+        trainGetEngine(cycle, engine);
 
-        trainGetPageRenderSupport(cyclec, cycle, null);
+        trainGetPageRenderSupport(cycle, null);
 
         replayControls();
 
@@ -1391,7 +1203,7 @@
 
         delegate.clear();
 
-        trainCycleForRewind(cyclec, cycle, "barney", null);
+        trainCycleForRewind(cycle, "barney", null);
 
         final IFormComponent component = newFormComponent("barney", "barney");
 
@@ -1409,27 +1221,16 @@
     public void testRefreshRewind()
     {
         IMarkupWriter writer = newWriter();
-
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
+        IRequestCycle cycle = newCycle();
         IValidationDelegate delegate = newDelegate();
-
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
+        IEngine engine = newEngine(getClassResolver());
         MockForm form = new MockForm(delegate);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(true);
+        trainIsRewound(cycle, form, true);
 
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
+        trainGetEngine(cycle, engine);
 
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
-
-        trainGetPageRenderSupport(cyclec, cycle, null);
+        trainGetPageRenderSupport(cycle, null);
 
         replayControls();
 
@@ -1439,7 +1240,7 @@
 
         delegate.clear();
 
-        trainCycleForRewind(cyclec, cycle, "refresh", "barney", null);
+        trainCycleForRewind(cycle, "refresh", "barney", null);
 
         final IFormComponent component = newFormComponent("barney", "barney");
 
@@ -1457,27 +1258,16 @@
     public void testCancelRewind()
     {
         IMarkupWriter writer = newWriter();
-
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
+        IRequestCycle cycle = newCycle();
         IValidationDelegate delegate = newDelegate();
-
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
+        IEngine engine = newEngine(getClassResolver());
         MockForm form = new MockForm(delegate);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(true);
+        trainIsRewound(cycle, form, true);
 
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
+        trainGetEngine(cycle, engine);
 
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
-
-        trainGetPageRenderSupport(cyclec, cycle, null);
+        trainGetPageRenderSupport(cycle, null);
 
         replayControls();
 
@@ -1487,7 +1277,7 @@
 
         delegate.clear();
 
-        trainGetParameter(cyclec, cycle, FormSupportImpl.SUBMIT_MODE, "cancel");
+        trainGetParameter(cycle, FormSupportImpl.SUBMIT_MODE, "cancel");
 
         // Create a body, just to provie it doesn't get invoked.
 
@@ -1505,27 +1295,16 @@
     public void testSimpleRewindWithDeferredRunnable()
     {
         IMarkupWriter writer = newWriter();
-
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
+        IRequestCycle cycle = newCycle();
         IValidationDelegate delegate = newDelegate();
-
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
+        IEngine engine = newEngine(getClassResolver());
         MockForm form = new MockForm(delegate);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(true);
-
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
+        trainIsRewound(cycle, form, true);
 
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
+        trainGetEngine(cycle, engine);
 
-        trainGetPageRenderSupport(cyclec, cycle, null);
+        trainGetPageRenderSupport(cycle, null);
 
         replayControls();
 
@@ -1535,7 +1314,7 @@
 
         delegate.clear();
 
-        trainCycleForRewind(cyclec, cycle, "", null);
+        trainCycleForRewind(cycle, "", null);
 
         writer.print("DEFERRED");
 
@@ -1567,35 +1346,23 @@
 
     public void testSimpleSubmitEventHandler()
     {
-        MockControl writerc = newControl(IMarkupWriter.class);
-        IMarkupWriter writer = (IMarkupWriter) writerc.getMock();
-
+        IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
-
-        MockControl cyclec = newControl(IRequestCycle.class);
-        IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
-
-        MockControl enginec = newControl(IEngine.class);
-        IEngine engine = (IEngine) enginec.getMock();
-
-        MockControl delegatec = newControl(IValidationDelegate.class);
-        IValidationDelegate delegate = (IValidationDelegate) delegatec.getMock();
+        IRequestCycle cycle = newCycle();
+        IEngine engine = newEngine(getClassResolver());
+        IValidationDelegate delegate = newDelegate();
+        ILink link = newLink();
+        IRender render = newRender();
 
         MockForm form = new MockForm(delegate);
 
-        cycle.isRewound(form);
-        cyclec.setReturnValue(false);
-
-        cycle.getEngine();
-        cyclec.setReturnValue(engine);
+        trainIsRewound(cycle, form, false);
 
-        engine.getClassResolver();
-        enginec.setReturnValue(getClassResolver());
+        trainGetEngine(cycle, engine);
 
-        MockControl supportc = newControl(PageRenderSupport.class);
-        PageRenderSupport support = (PageRenderSupport) supportc.getMock();
+        PageRenderSupport support = newPageRenderSupport();
 
-        trainGetPageRenderSupport(cyclec, cycle, support);
+        trainGetPageRenderSupport(cycle, support);
 
         replayControls();
 
@@ -1611,26 +1378,16 @@
             }
         });
 
-        MockControl linkc = newControl(ILink.class);
-        ILink link = (ILink) linkc.getMock();
-
-        IRender render = (IRender) newMock(IRender.class);
-
         trainRegister(support);
 
-        link.getParameterNames();
-        linkc.setReturnValue(new String[]
+        trainGetParameterNames(link, new String[]
         { "service" });
-
-        link.getParameterValues("service");
-        linkc.setReturnValue(new String[]
+        trainGetParameterValues(link, "service", new String[]
         { "fred" });
 
-        writer.getNestedWriter();
-        writerc.setReturnValue(nested);
+        trainGetNestedWriter(writer, nested);
 
-        link.getURL(null, false);
-        linkc.setReturnValue("/app");
+        trainGetURL(link, null, "/app");
 
         writer.begin("form");
         writer.attribute("method", "post");
@@ -1650,7 +1407,7 @@
         trainHidden(writer, "submitmode", "");
 
         writer.end();
-        
+
         nested.close();
 
         writer.end();
@@ -1658,34 +1415,26 @@
         support
                 .addInitializationScript("Tapestry.onsubmit('myform', function (event)\n{\n  mySubmit();\n});\n");
 
-        trainGetFocusField(delegatec, delegate, null);
+        trainGetFocusField(delegate, null);
 
         replayControls();
 
-        fs.render("post", render, link);
+        fs.render("post", render, link, null);
 
         verifyControls();
     }
 
-    private void trainCycleForRewind(MockControl cyclec, IRequestCycle cycle, String allocatedIds,
-            String reservedIds)
-    {
-        trainCycleForRewind(cyclec, cycle, "submit", allocatedIds, reservedIds);
-    }
-
-    private void trainCycleForRewind(MockControl cyclec, IRequestCycle cycle, String submitMode,
-            String allocatedIds, String reservedIds)
+    private void trainCycleForRewind(IRequestCycle cycle, String allocatedIds, String reservedIds)
     {
-        trainGetParameter(cyclec, cycle, FormSupportImpl.SUBMIT_MODE, submitMode);
-        trainGetParameter(cyclec, cycle, FormSupportImpl.FORM_IDS, allocatedIds);
-        trainGetParameter(cyclec, cycle, FormSupportImpl.RESERVED_FORM_IDS, reservedIds);
+        trainCycleForRewind(cycle, "submit", allocatedIds, reservedIds);
     }
 
-    private void trainGetParameter(MockControl cyclec, IRequestCycle cycle, String parameterName,
-            String value)
+    private void trainCycleForRewind(IRequestCycle cycle, String submitMode, String allocatedIds,
+            String reservedIds)
     {
-        cycle.getParameter(parameterName);
-        cyclec.setReturnValue(value);
+        trainGetParameter(cycle, FormSupportImpl.SUBMIT_MODE, submitMode);
+        trainGetParameter(cycle, FormSupportImpl.FORM_IDS, allocatedIds);
+        trainGetParameter(cycle, FormSupportImpl.RESERVED_FORM_IDS, reservedIds);
     }
 
     private void trainHidden(IMarkupWriter writer, String name, String value)

Copied: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/FormTest.java (from r328435, jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/TestForm.java)
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/FormTest.java?p2=jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/FormTest.java&p1=jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/TestForm.java&r1=328435&r2=328669&rev=328669&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/TestForm.java (original)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/FormTest.java Wed Oct 26 09:44:54 2005
@@ -14,9 +14,23 @@
 
 package org.apache.tapestry.form;
 
+import org.apache.hivemind.test.AggregateArgumentsMatcher;
+import org.apache.hivemind.test.ArgumentMatcher;
 import org.apache.tapestry.BaseComponentTestCase;
 import org.apache.tapestry.IActionListener;
+import org.apache.tapestry.IForm;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRender;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.IgnoreMatcher;
+import org.apache.tapestry.RenderRewoundException;
+import org.apache.tapestry.TapestryUtils;
+import org.apache.tapestry.engine.DirectServiceParameter;
+import org.apache.tapestry.engine.IEngineService;
+import org.apache.tapestry.engine.ILink;
+import org.apache.tapestry.listener.ListenerInvoker;
 import org.apache.tapestry.valid.IValidationDelegate;
+import org.apache.tapestry.web.WebResponse;
 import org.easymock.MockControl;
 
 /**
@@ -26,11 +40,209 @@
  * @author Howard Lewis Ship
  * @since 4.0
  */
-public class TestForm extends BaseComponentTestCase
+public class FormTest extends BaseComponentTestCase
 {
     private IActionListener newListener()
     {
         return (IActionListener) newMock(IActionListener.class);
+    }
+
+    private FormSupport newFormSupport()
+    {
+        return (FormSupport) newMock(FormSupport.class);
+    }
+
+    protected void trainGetNextActionId(IRequestCycle cycle, String actionId)
+    {
+        cycle.getNextActionId();
+        setReturnValue(cycle, actionId);
+    }
+
+    protected void trainGetUniqueId(IRequestCycle cycle, String baseId, String uniqueId)
+    {
+        cycle.getUniqueId(baseId);
+
+        setReturnValue(cycle, uniqueId);
+    }
+
+    protected WebResponse newResponse()
+    {
+        return (WebResponse) newMock(WebResponse.class);
+    }
+
+    protected void trainGetNamespace(WebResponse response, String namespace)
+    {
+        response.getNamespace();
+        setReturnValue(response, namespace);
+    }
+
+    protected IValidationDelegate newDelegate()
+    {
+        return (IValidationDelegate) newMock(IValidationDelegate.class);
+    }
+
+    public void testRewind()
+    {
+        IMarkupWriter writer = newWriter();
+        IRequestCycle cycle = newCycle();
+        FormSupport support = newFormSupport();
+        IValidationDelegate delegate = newDelegate();
+        IActionListener listener = newListener();
+        ListenerInvoker invoker = newListenerInvoker();
+
+        Form form = (Form) newInstance(FormFixture.class, new Object[]
+        { "id", "myform", "direct", true, "expectedWriter", writer, "expectedRequestCycle", cycle,
+                "formSupport", support, "listener", listener, "listenerInvoker", invoker,
+                "delegate", delegate });
+
+        trainStoreForm(cycle, form);
+
+        trainIsRewinding(support, true);
+
+        trainGetNextActionId(cycle, "7");
+
+        support.rewind();
+        setReturnValue(support, FormConstants.SUBMIT_NORMAL);
+
+        delegate.getHasErrors();
+        setReturnValue(delegate, false);
+
+        invoker.invokeListener(listener, form, cycle);
+
+        delegate.setFormComponent(null);
+
+        TapestryUtils.removeForm(cycle);
+
+        replayControls();
+
+        try
+        {
+            form.render(writer, cycle);
+        }
+        catch (RenderRewoundException ex)
+        {
+            assertSame(form, ex.getComponent());
+        }
+
+        verifyControls();
+    }
+
+    private ListenerInvoker newListenerInvoker()
+    {
+        return (ListenerInvoker) newMock(ListenerInvoker.class);
+    }
+
+    public void testBasicRender()
+    {
+        IMarkupWriter writer = newWriter();
+        IRequestCycle cycle = newCycle();
+        FormSupport support = newFormSupport();
+        WebResponse response = newResponse();
+        IEngineService direct = newEngineService();
+        ILink link = newLink();
+        IRender render = newRender();
+        IValidationDelegate delegate = newDelegate();
+
+        Form form = (Form) newInstance(FormFixture.class, new Object[]
+        { "id", "myform", "direct", true, "expectedWriter", writer, "expectedRequestCycle", cycle,
+                "formSupport", support, "response", response, "directService", direct, "method",
+                "post", "delegate", delegate });
+
+        trainStoreForm(cycle, form);
+
+        trainIsRewinding(support, false);
+
+        trainGetNextActionId(cycle, "7");
+
+        trainGetUniqueId(cycle, "myform", "myform_1");
+
+        trainGetNamespace(response, "$ns");
+
+        trainGetLinkCheckIgnoreParameter(
+                direct,
+                cycle,
+                true,
+                new DirectServiceParameter(form),
+                link);
+
+        trainRender(support, link, render, null);
+
+        delegate.setFormComponent(null);
+
+        TapestryUtils.removeForm(cycle);
+
+        replayControls();
+
+        form.render(writer, cycle);
+
+        verifyControls();
+    }
+
+    public void testRenderWithScheme()
+    {
+        IMarkupWriter writer = newWriter();
+        IRequestCycle cycle = newCycle();
+        FormSupport support = newFormSupport();
+        WebResponse response = newResponse();
+        IEngineService direct = newEngineService();
+        ILink link = newLink();
+        IRender render = newRender();
+        IValidationDelegate delegate = newDelegate();
+
+        Form form = (Form) newInstance(FormFixture.class, new Object[]
+        { "id", "myform", "direct", true, "expectedWriter", writer, "expectedRequestCycle", cycle,
+                "formSupport", support, "response", response, "directService", direct, "method",
+                "post", "delegate", delegate, "scheme", "https" });
+
+        trainStoreForm(cycle, form);
+
+        trainIsRewinding(support, false);
+
+        trainGetNextActionId(cycle, "7");
+
+        trainGetUniqueId(cycle, "myform", "myform_1");
+
+        trainGetNamespace(response, "$ns");
+
+        trainGetLinkCheckIgnoreParameter(
+                direct,
+                cycle,
+                true,
+                new DirectServiceParameter(form),
+                link);
+
+        trainRender(support, link, render, "https");
+
+        delegate.setFormComponent(null);
+
+        TapestryUtils.removeForm(cycle);
+
+        replayControls();
+
+        form.render(writer, cycle);
+
+        verifyControls();
+    }
+
+    protected void trainStoreForm(IRequestCycle cycle, IForm form)
+    {
+        trainGetAttribute(cycle, TapestryUtils.FORM_ATTRIBUTE, null);
+
+        cycle.setAttribute(TapestryUtils.FORM_ATTRIBUTE, form);
+    }
+
+    private void trainRender(FormSupport support, ILink link, IRender render, String scheme)
+    {
+        support.render("post", render, link, scheme);
+        getControl(support).setMatcher(new AggregateArgumentsMatcher(new ArgumentMatcher[]
+        { null, new IgnoreMatcher(), null, null }));
+    }
+
+    protected void trainIsRewinding(FormSupport support, boolean isRewinding)
+    {
+
+        support.isRewinding();
+        setReturnValue(support, isRewinding);
     }
 
     public void testFindCancelListener()

Modified: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/MockForm.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/MockForm.java?rev=328669&r1=328668&r2=328669&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/MockForm.java (original)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/MockForm.java Wed Oct 26 09:44:54 2005
@@ -39,7 +39,7 @@
 import org.apache.tapestry.valid.IValidationDelegate;
 
 /**
- * Mock object used by the {@link org.apache.tapestry.form.TestFormSupport}.
+ * Mock object used by the {@link org.apache.tapestry.form.FormSupportTest}.
  * 
  * @author Howard M. Lewis Ship
  * @since 4.0

Added: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/link/DefaultLinkRendererTest.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/link/DefaultLinkRendererTest.java?rev=328669&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/link/DefaultLinkRendererTest.java (added)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/link/DefaultLinkRendererTest.java Wed Oct 26 09:44:54 2005
@@ -0,0 +1,437 @@
+// Copyright 2005 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.link;
+
+import org.apache.hivemind.ApplicationRuntimeException;
+import org.apache.hivemind.Location;
+import org.apache.tapestry.BaseComponentTestCase;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.NestedMarkupWriter;
+import org.apache.tapestry.Tapestry;
+import org.apache.tapestry.components.ILinkComponent;
+import org.apache.tapestry.engine.ILink;
+
+/**
+ * Tests for {@link org.apache.tapestry.link.DefaultLinkRenderer}.
+ * 
+ * @author Howard M. Lewis Ship
+ * @since 4.0
+ */
+public class DefaultLinkRendererTest extends BaseComponentTestCase
+{
+    class RendererFixture extends DefaultLinkRenderer
+    {
+        private IMarkupWriter _writer;
+
+        private IRequestCycle _cycle;
+
+        private ILinkComponent _component;
+
+        private String _element;
+
+        private boolean _hasBody;
+
+        private String _targetAttribute;
+
+        private String _urlAttribute;
+
+        public RendererFixture(IMarkupWriter writer, IRequestCycle cycle, ILinkComponent component,
+                String element, boolean body, String targetAttribute, String urlAttribute)
+        {
+            _writer = writer;
+            _cycle = cycle;
+            _component = component;
+            _element = element;
+            _hasBody = body;
+            _targetAttribute = targetAttribute;
+            _urlAttribute = urlAttribute;
+        }
+
+        @Override
+        protected void afterBodyRender(IMarkupWriter writer, IRequestCycle cycle,
+                ILinkComponent link)
+        {
+            assertSame(_writer, writer);
+            assertSame(_cycle, cycle);
+            assertSame(_component, link);
+
+            writer.print("AFTER-BODY-RENDER");
+        }
+
+        @Override
+        protected void beforeBodyRender(IMarkupWriter writer, IRequestCycle cycle,
+                ILinkComponent link)
+        {
+            assertSame(_writer, writer);
+            assertSame(_cycle, cycle);
+            assertSame(_component, link);
+
+            writer.print("BEFORE-BODY-RENDER");
+        }
+
+        @Override
+        protected String getElement()
+        {
+            return _element;
+        }
+
+        @Override
+        protected boolean getHasBody()
+        {
+            // TODO Auto-generated method stub
+            return _hasBody;
+        }
+
+        @Override
+        protected String getTargetAttribute()
+        {
+
+            return _targetAttribute;
+        }
+
+        @Override
+        protected String getUrlAttribute()
+        {
+            return _urlAttribute;
+        }
+
+    }
+
+    protected ILinkComponent newComponent()
+    {
+        return (ILinkComponent) newMock(ILinkComponent.class);
+    }
+
+    public void testNoNesting()
+    {
+        IMarkupWriter writer = newWriter();
+        IRequestCycle cycle = newCycle();
+        ILinkComponent existing = newComponent();
+        ILinkComponent active = newComponent();
+        Location l = newLocation();
+
+        trainGetAttribute(cycle, Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME, existing);
+
+        trainGetLocation(active, l);
+
+        replayControls();
+
+        try
+        {
+            new DefaultLinkRenderer().renderLink(writer, cycle, active);
+            unreachable();
+        }
+        catch (ApplicationRuntimeException ex)
+        {
+            assertEquals(LinkMessages.noNesting(), ex.getMessage());
+            assertSame(active, ex.getComponent());
+            assertSame(l, ex.getLocation());
+        }
+
+        verifyControls();
+    }
+
+    public void testStandardNotDisabled()
+    {
+        IMarkupWriter writer = newWriter();
+        NestedMarkupWriter nested = newNestedWriter();
+        IRequestCycle cycle = newCycle();
+        ILinkComponent component = newComponent();
+        Location l = newLocation();
+        ILink link = newLink();
+
+        trainGetAttribute(cycle, Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME, null);
+        cycle.setAttribute(Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME, component);
+
+        trainIsDisabled(component, false);
+
+        writer.begin("a");
+
+        trainGetLink(component, cycle, link);
+
+        trainGetScheme(component, null);
+        trainGetAnchor(component, null);
+
+        trainGetURL(link, null, null, "/foo/bar.baz");
+
+        writer.attribute("href", "/foo/bar.baz");
+
+        trainGetTarget(component, null);
+
+        trainGetNestedWriter(writer, nested);
+
+        component.renderBody(nested, cycle);
+
+        component.renderAdditionalAttributes(writer, cycle);
+
+        nested.close();
+
+        writer.end();
+
+        cycle.removeAttribute(Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME);
+
+        replayControls();
+
+        new DefaultLinkRenderer().renderLink(writer, cycle, component);
+
+        verifyControls();
+    }
+
+    protected void trainGetScheme(ILinkComponent component, String scheme)
+    {
+        component.getScheme();
+        setReturnValue(component, scheme);
+    }
+
+    public void testStandardWithSchemaAnchorAndTarget()
+    {
+        IMarkupWriter writer = newWriter();
+        NestedMarkupWriter nested = newNestedWriter();
+        IRequestCycle cycle = newCycle();
+        ILinkComponent component = newComponent();
+        ILink link = newLink();
+
+        trainGetAttribute(cycle, Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME, null);
+        cycle.setAttribute(Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME, component);
+
+        trainIsDisabled(component, false);
+
+        writer.begin("a");
+
+        trainGetLink(component, cycle, link);
+
+        trainGetScheme(component, "https");
+
+        trainGetAnchor(component, "my-anchor");
+
+        trainGetURL(link, "https", "my-anchor", "http://zap.com/foo/bar.baz#my-anchor");
+
+        writer.attribute("href", "http://zap.com/foo/bar.baz#my-anchor");
+
+        trainGetTarget(component, "some-target");
+
+        writer.attribute("target", "some-target");
+
+        trainGetNestedWriter(writer, nested);
+
+        component.renderBody(nested, cycle);
+
+        component.renderAdditionalAttributes(writer, cycle);
+
+        nested.close();
+
+        writer.end();
+
+        cycle.removeAttribute(Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME);
+
+        replayControls();
+
+        new DefaultLinkRenderer().renderLink(writer, cycle, component);
+
+        verifyControls();
+    }
+
+    public void testDisabled()
+    {
+        IMarkupWriter writer = newWriter();
+        IRequestCycle cycle = newCycle();
+        ILinkComponent component = newComponent();
+
+        trainGetAttribute(cycle, Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME, null);
+        cycle.setAttribute(Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME, component);
+
+        trainIsDisabled(component, true);
+
+        component.renderBody(writer, cycle);
+
+        cycle.removeAttribute(Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME);
+
+        replayControls();
+
+        new DefaultLinkRenderer().renderLink(writer, cycle, component);
+
+        verifyControls();
+    }
+
+    public void testWithSubclass()
+    {
+        IMarkupWriter writer = newWriter();
+        NestedMarkupWriter nested = newNestedWriter();
+        IRequestCycle cycle = newCycle();
+        ILinkComponent component = newComponent();
+        ILink link = newLink();
+
+        trainGetAttribute(cycle, Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME, null);
+        cycle.setAttribute(Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME, component);
+
+        trainIsDisabled(component, false);
+
+        writer.begin("xlink");
+
+        trainGetLink(component, cycle, link);
+
+        trainGetScheme(component, null);
+
+        trainGetAnchor(component, "my-anchor");
+
+        trainGetURL(link, null, "my-anchor", "/foo/bar.baz#my-anchor");
+
+        writer.attribute("xurl", "/foo/bar.baz#my-anchor");
+
+        trainGetTarget(component, "some-target");
+
+        writer.attribute("xtarget", "some-target");
+
+        writer.print("BEFORE-BODY-RENDER");
+
+        trainGetNestedWriter(writer, nested);
+
+        component.renderBody(nested, cycle);
+
+        writer.print("AFTER-BODY-RENDER");
+
+        component.renderAdditionalAttributes(writer, cycle);
+
+        nested.close();
+
+        writer.end();
+
+        cycle.removeAttribute(Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME);
+
+        replayControls();
+
+        new RendererFixture(writer, cycle, component, "xlink", true, "xtarget", "xurl").renderLink(
+                writer,
+                cycle,
+                component);
+
+        verifyControls();
+    }
+
+    public void testWithSubclassNoBody()
+    {
+        IMarkupWriter writer = newWriter();
+        NestedMarkupWriter nested = newNestedWriter();
+
+        IRequestCycle cycle = newCycle();
+        ILinkComponent component = newComponent();
+        ILink link = newLink();
+
+        trainGetAttribute(cycle, Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME, null);
+        cycle.setAttribute(Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME, component);
+
+        trainIsDisabled(component, false);
+
+        writer.beginEmpty("xlink");
+
+        trainGetLink(component, cycle, link);
+
+        trainGetScheme(component, null);
+
+        trainGetAnchor(component, "my-anchor");
+
+        trainGetURL(link, null, "my-anchor", "/foo/bar.baz#my-anchor");
+
+        writer.attribute("xurl", "/foo/bar.baz#my-anchor");
+
+        trainGetTarget(component, "some-target");
+
+        writer.attribute("xtarget", "some-target");
+
+        writer.print("BEFORE-BODY-RENDER");
+
+        trainGetNestedWriter(writer, nested);
+
+        writer.print("AFTER-BODY-RENDER");
+
+        writer.closeTag();
+
+        component.renderAdditionalAttributes(writer, cycle);
+
+        cycle.removeAttribute(Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME);
+
+        replayControls();
+
+        new RendererFixture(writer, cycle, component, "xlink", false, "xtarget", "xurl")
+                .renderLink(writer, cycle, component);
+
+        verifyControls();
+    }
+
+    public void testWithSubclassDisabled()
+    {
+        IMarkupWriter writer = newWriter();
+        IRequestCycle cycle = newCycle();
+        ILinkComponent component = newComponent();
+
+        trainGetAttribute(cycle, Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME, null);
+        cycle.setAttribute(Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME, component);
+
+        trainIsDisabled(component, true);
+
+        component.renderBody(writer, cycle);
+
+        cycle.removeAttribute(Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME);
+
+        replayControls();
+
+        new RendererFixture(writer, cycle, component, "xlink", true, "xtarget", "xurl").renderLink(
+                writer,
+                cycle,
+                component);
+
+        verifyControls();
+    }
+
+    public void testWithSubclassDisabledNoBody()
+    {
+        IMarkupWriter writer = newWriter();
+        IRequestCycle cycle = newCycle();
+        ILinkComponent component = newComponent();
+
+        trainGetAttribute(cycle, Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME, null);
+        cycle.setAttribute(Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME, component);
+
+        trainIsDisabled(component, true);
+
+        cycle.removeAttribute(Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME);
+
+        replayControls();
+
+        new RendererFixture(writer, cycle, component, "xlink", false, "xtarget", "xurl")
+                .renderLink(writer, cycle, component);
+
+        verifyControls();
+    }
+
+    protected void trainGetAnchor(ILinkComponent component, String anchor)
+    {
+        component.getAnchor();
+        setReturnValue(component, anchor);
+    }
+
+    protected void trainGetTarget(ILinkComponent component, String target)
+    {
+        component.getTarget();
+        setReturnValue(component, target);
+    }
+
+    protected void trainIsDisabled(ILinkComponent component, boolean isDisabled)
+    {
+        component.isDisabled();
+        setReturnValue(component, isDisabled);
+    }
+}

Modified: jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletLink.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletLink.java?rev=328669&r1=328668&r2=328669&view=diff
==============================================================================
--- jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletLink.java (original)
+++ jakarta/tapestry/trunk/portlet/src/java/org/apache/tapestry/portlet/PortletLink.java Wed Oct 26 09:44:54 2005
@@ -118,6 +118,12 @@
         }
     }
 
+    public String getURL(String scheme, String server, int port, String anchor, boolean includeParameters)
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
     public String getAbsoluteURL()
     {
         throw new UnsupportedOperationException(PortletMessages.unsupportedMethod("getAbsoluteURL"));

Modified: jakarta/tapestry/trunk/status.xml
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/status.xml?rev=328669&r1=328668&r2=328669&view=diff
==============================================================================
--- jakarta/tapestry/trunk/status.xml (original)
+++ jakarta/tapestry/trunk/status.xml Wed Oct 26 09:44:54 2005
@@ -52,6 +52,7 @@
   <changes>
     <release version="4.0-beta-12" date="unreleased">
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-718">Asset injection makes assets appear as null inside finishLoad()</action>
+      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-580">Form, PageLink, DirectLink, etc. should support a scheme parameter for controlling the scheme of the generated URL</action>
     </release>
     <release version="4.0-beta-11" date="Oct 16 2005">
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-650">ClassNotFoundException thrown when deserializing an object from a client persistent property</action>



---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-dev-help@jakarta.apache.org