blob: d33fefd15ec398ba588f911bf792870ae3d9c6a3 [file] [log] [blame]
// 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.util;
import static org.easymock.EasyMock.checkOrder;
import static org.easymock.EasyMock.expect;
import java.io.CharArrayWriter;
import java.io.PrintWriter;
import org.apache.hivemind.Location;
import org.apache.hivemind.Resource;
import org.apache.tapestry.BaseComponentTestCase;
import org.apache.tapestry.IAsset;
import org.apache.tapestry.IComponent;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.asset.AssetFactory;
import org.apache.tapestry.markup.AsciiMarkupFilter;
import org.apache.tapestry.markup.MarkupWriterImpl;
import org.apache.tapestry.services.ResponseBuilder;
import org.apache.tapestry.services.impl.DefaultResponseBuilder;
import org.testng.annotations.Test;
/**
* Tests for {@link org.apache.tapestry.util.PageRenderSupportImpl}.
*
* @author Howard M. Lewis Ship
* @since 4.0
*/
@Test(sequential=true)
@SuppressWarnings("all")
public class TestPageRenderSupport extends BaseComponentTestCase
{
private static final String SYSTEM_NEWLINE= (String)java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("line.separator"));
private static final String TEST_NEWLINE= "\n";
private AssetFactory newAssetFactory()
{
return newMock(AssetFactory.class);
}
private IAsset newAsset(String url)
{
IAsset asset = newMock(IAsset.class);
checkOrder(asset, false);
expect(asset.buildURL()).andReturn(url);
return asset;
}
private CharArrayWriter _writer;
private IMarkupWriter createWriter()
{
_writer = new CharArrayWriter();
return new MarkupWriterImpl("text/html", new PrintWriter(_writer), new AsciiMarkupFilter());
}
private ResponseBuilder newBuilder(IMarkupWriter writer)
{
return new DefaultResponseBuilder(writer);
}
private void assertOutput(String[] expectedLines)
{
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < expectedLines.length; i++)
{
// Note: PageRenderSupport is a bit sloppy; a lot of code just uses \n for
// a newline seperator, other parts go through IMarkupWriter.println() and get
// a proper newline seperator (which may be different).
if (i > 0)
buffer.append("\n");
buffer.append(expectedLines[i]);
}
assertOutput(buffer.toString());
}
private void assertOutput(String expected)
{
String actual = _writer.toString();
// Replace any system line feeds with \n
actual = actual.replaceAll(SYSTEM_NEWLINE, TEST_NEWLINE);
assertEquals(actual, expected);
_writer.reset();
}
public void testGetLocation()
{
AssetFactory factory = newAssetFactory();
Location l = newLocation();
replay();
PageRenderSupportImpl prs = new PageRenderSupportImpl(factory, "", l, newBuilder(null));
assertSame(l, prs.getLocation());
verify();
}
public void testGetPreloadedImageReference()
{
AssetFactory factory = newAssetFactory();
Location l = newLocation();
IRequestCycle cycle = newCycle();
IMarkupWriter writer = createWriter();
IComponent comp = newMock(IComponent.class);
IAsset img = newAsset("/zip/zap.png");
replay();
PageRenderSupportImpl prs = new PageRenderSupportImpl(factory, "", l, newBuilder(writer));
assertEquals(prs.getPreloadedImageReference("/foo/bar.gif"), "tapestry.preload[0].src");
assertEquals(prs.getPreloadedImageReference(comp, img), "tapestry.preload[1].src");
assertEquals(prs.getPreloadedImageReference("/foo/bar.gif"), "tapestry.preload[0].src");
prs.addBodyScript("myBodyScript();");
prs.writeBodyScript(writer, cycle);
assertOutput(new String[]
{ "<script type=\"text/javascript\"><!--","",
"dojo.addOnLoad(function(e) {",
"tapestry.preload = [];", "if (document.images)", "{",
"tapestry.preload[0] = new Image();",
" tapestry.preload[0].src = \"/foo/bar.gif\";",
" tapestry.preload[1] = new Image();",
" tapestry.preload[1].src = \"/zip/zap.png\";}", "});myBodyScript();",
"// --></script>" });
verify();
}
public void testPreloadedImagesInNamespace()
{
AssetFactory factory = newAssetFactory();
Location l = newLocation();
IRequestCycle cycle = newCycle();
IMarkupWriter writer = createWriter();
replay();
PageRenderSupportImpl prs = new PageRenderSupportImpl(factory, "NAMESPACE.", l, newBuilder(writer));
assertEquals(prs.getPreloadedImageReference("/foo/bar.gif"), "NAMESPACE.preload[0].src");
prs.writeBodyScript(writer, cycle);
assertOutput(new String[]
{"<script type=\"text/javascript\"><!--", "",
"dojo.addOnLoad(function(e) {",
"NAMESPACE.preload = [];", "if (document.images)", "{",
"NAMESPACE.preload[0] = new Image();",
" NAMESPACE.preload[0].src = \"/foo/bar.gif\";}",
"});",
"// --></script>" });
verify();
}
public void testAddBodyScript()
{
AssetFactory factory = newAssetFactory();
Location l = newLocation();
IRequestCycle cycle = newCycle();
IMarkupWriter writer = createWriter();
replay();
PageRenderSupportImpl prs = new PageRenderSupportImpl(factory, "", l, newBuilder(writer));
prs.addBodyScript("myBodyScript();");
prs.writeBodyScript(writer, cycle);
assertOutput(new String[]
{ "<script type=\"text/javascript\"><!--",
"myBodyScript();",
"// --></script>" });
verify();
}
public void testGetUniqueString()
{
AssetFactory factory = newAssetFactory();
Location l = newLocation();
replay();
PageRenderSupportImpl prs = new PageRenderSupportImpl(factory, "", l, newBuilder(null));
assertEquals("foo", prs.getUniqueString("foo"));
assertEquals("foo_0", prs.getUniqueString("foo"));
assertEquals("bar", prs.getUniqueString("bar"));
assertEquals("foo_1", prs.getUniqueString("foo"));
verify();
}
public void testGetUniqueStringWithNamespace()
{
AssetFactory factory = newAssetFactory();
Location l = newLocation();
replay();
PageRenderSupportImpl prs = new PageRenderSupportImpl(factory, "NAMESPACE", l, newBuilder(null));
assertEquals("fooNAMESPACE", prs.getUniqueString("foo"));
assertEquals("fooNAMESPACE_0", prs.getUniqueString("foo"));
assertEquals("barNAMESPACE", prs.getUniqueString("bar"));
assertEquals("fooNAMESPACE_1", prs.getUniqueString("foo"));
verify();
}
public void testAddInitializationScript()
{
AssetFactory factory = newAssetFactory();
Location l = newLocation();
IMarkupWriter writer = createWriter();
replay();
PageRenderSupportImpl prs = new PageRenderSupportImpl(factory, "", l, newBuilder(writer));
prs.addInitializationScript("myInitializationScript1();");
prs.addInitializationScript("myInitializationScript2();");
prs.addInitializationScript("dojo.require(\"dojo.event.*\");");
prs.addInitializationScript("dojo.require(\"dojo.widget.*\");dojo.require(\"dojo.event.*\");");
prs.addInitializationScript("dojo.require(\"dojo.event.*\");");
prs.addInitializationScript("dojo.require(\"tapestry.form\");tapestry.form.registerForm(\"valid\");\n" +
"tapestry.form.focusField(\'inputEnabled\');\n" +
"dojo.require(\"tapestry.form\");tapestry.form.registerForm(\"form\");");
prs.writeInitializationScript(writer);
assertOutput(new String[]
{ "<script type=\"text/javascript\"><!--",
"dojo.addOnLoad(function(e) {",
"myInitializationScript1();", "myInitializationScript2();",
"dojo.require(\"dojo.event.*\");","dojo.require(\"dojo.widget.*\");",
"",
"tapestry.form.registerForm(\"valid\");",
"tapestry.form.focusField(\'inputEnabled\');",
"dojo.require(\"tapestry.form\");tapestry.form.registerForm(\"form\");});",
"// --></script>" });
verify();
}
public void testAddExternalScript() throws Exception
{
String newline = TEST_NEWLINE;
IRequestCycle cycle = newCycle();
IMarkupWriter writer = createWriter();
AssetFactory assetFactory = newMock(AssetFactory.class);
Resource script1 = newResource();
IAsset asset1 = newAsset("/script1.js");
Resource script2 = newResource();
IAsset asset2 = newAsset("/script2.js");
expect(assetFactory.createAsset(script1, null)).andReturn(asset1);
expect(assetFactory.createAsset(script2, null)).andReturn(asset2);
replay();
PageRenderSupportImpl prs = new PageRenderSupportImpl(assetFactory, "", null, newBuilder(writer));
prs.addExternalScript(script1);
prs.addExternalScript(script2);
prs.addExternalScript(script1);
prs.writeBodyScript(writer, cycle);
// PageRenderSupport is a little sloppy about using \n for a newline, vs. using
// the property line seperator sequence and it bites us right here.
assertOutput(scriptTagFor("/script1.js") + newline + scriptTagFor("/script2.js") + newline);
verify();
}
private String scriptTagFor(String url)
{
return "<script type=\"text/javascript\" src=\"" + url
+ "\"></script>";
}
}