001 // Copyright 2005 The Apache Software Foundation 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 015 package org.apache.tapestry.util; 016 017 import static org.easymock.EasyMock.checkOrder; 018 import static org.easymock.EasyMock.expect; 019 020 import java.io.CharArrayWriter; 021 import java.io.PrintWriter; 022 023 import org.apache.hivemind.Location; 024 import org.apache.hivemind.Resource; 025 import org.apache.tapestry.BaseComponentTestCase; 026 import org.apache.tapestry.IAsset; 027 import org.apache.tapestry.IComponent; 028 import org.apache.tapestry.IMarkupWriter; 029 import org.apache.tapestry.IRequestCycle; 030 import org.apache.tapestry.asset.AssetFactory; 031 import org.apache.tapestry.markup.AsciiMarkupFilter; 032 import org.apache.tapestry.markup.MarkupWriterImpl; 033 import org.apache.tapestry.services.ResponseBuilder; 034 import org.apache.tapestry.services.impl.DefaultResponseBuilder; 035 import org.testng.annotations.Test; 036 037 /** 038 * Tests for {@link org.apache.tapestry.util.PageRenderSupportImpl}. 039 * 040 * @author Howard M. Lewis Ship 041 * @since 4.0 042 */ 043 @Test(sequential=true) 044 @SuppressWarnings("all") 045 public class TestPageRenderSupport extends BaseComponentTestCase 046 { 047 private static final String SYSTEM_NEWLINE= (String)java.security.AccessController.doPrivileged( 048 new sun.security.action.GetPropertyAction("line.separator")); 049 050 private static final String TEST_NEWLINE= "\n"; 051 052 private AssetFactory newAssetFactory() 053 { 054 return newMock(AssetFactory.class); 055 } 056 057 private IAsset newAsset(String url) 058 { 059 IAsset asset = newMock(IAsset.class); 060 checkOrder(asset, false); 061 062 expect(asset.buildURL()).andReturn(url); 063 064 return asset; 065 } 066 067 private CharArrayWriter _writer; 068 069 private IMarkupWriter createWriter() 070 { 071 _writer = new CharArrayWriter(); 072 073 return new MarkupWriterImpl("text/html", new PrintWriter(_writer), new AsciiMarkupFilter()); 074 } 075 076 private ResponseBuilder newBuilder(IMarkupWriter writer) 077 { 078 return new DefaultResponseBuilder(writer); 079 } 080 081 private void assertOutput(String[] expectedLines) 082 { 083 StringBuffer buffer = new StringBuffer(); 084 for (int i = 0; i < expectedLines.length; i++) 085 { 086 // Note: PageRenderSupport is a bit sloppy; a lot of code just uses \n for 087 // a newline seperator, other parts go through IMarkupWriter.println() and get 088 // a proper newline seperator (which may be different). 089 090 if (i > 0) 091 buffer.append("\n"); 092 093 buffer.append(expectedLines[i]); 094 } 095 096 assertOutput(buffer.toString()); 097 } 098 099 private void assertOutput(String expected) 100 { 101 String actual = _writer.toString(); 102 103 // Replace any system line feeds with \n 104 actual = actual.replaceAll(SYSTEM_NEWLINE, TEST_NEWLINE); 105 106 assertEquals(actual, expected); 107 108 _writer.reset(); 109 } 110 111 public void testGetLocation() 112 { 113 AssetFactory factory = newAssetFactory(); 114 Location l = newLocation(); 115 116 replay(); 117 118 PageRenderSupportImpl prs = new PageRenderSupportImpl(factory, "", l, newBuilder(null)); 119 120 assertSame(l, prs.getLocation()); 121 122 verify(); 123 } 124 125 public void testGetPreloadedImageReference() 126 { 127 AssetFactory factory = newAssetFactory(); 128 Location l = newLocation(); 129 IRequestCycle cycle = newCycle(); 130 IMarkupWriter writer = createWriter(); 131 132 IComponent comp = newMock(IComponent.class); 133 IAsset img = newAsset("/zip/zap.png"); 134 135 replay(); 136 137 PageRenderSupportImpl prs = new PageRenderSupportImpl(factory, "", l, newBuilder(writer)); 138 139 assertEquals(prs.getPreloadedImageReference("/foo/bar.gif"), "tapestry.preload[0].src"); 140 assertEquals(prs.getPreloadedImageReference(comp, img), "tapestry.preload[1].src"); 141 assertEquals(prs.getPreloadedImageReference("/foo/bar.gif"), "tapestry.preload[0].src"); 142 143 prs.addBodyScript("myBodyScript();"); 144 145 prs.writeBodyScript(writer, cycle); 146 147 assertOutput(new String[] 148 { "<script type=\"text/javascript\"><!--","", 149 "tapestry.addOnLoad(function(e) {", 150 "tapestry.preload = [];", "if (document.images)", "{", 151 "tapestry.preload[0] = new Image();", 152 " tapestry.preload[0].src = \"/foo/bar.gif\";", 153 " tapestry.preload[1] = new Image();", 154 " tapestry.preload[1].src = \"/zip/zap.png\";}", "});myBodyScript();", 155 "// --></script>" }); 156 157 verify(); 158 } 159 160 public void testPreloadedImagesInNamespace() 161 { 162 AssetFactory factory = newAssetFactory(); 163 Location l = newLocation(); 164 IRequestCycle cycle = newCycle(); 165 IMarkupWriter writer = createWriter(); 166 167 replay(); 168 169 PageRenderSupportImpl prs = new PageRenderSupportImpl(factory, "NAMESPACE.", l, newBuilder(writer)); 170 171 assertEquals(prs.getPreloadedImageReference("/foo/bar.gif"), "NAMESPACE.preload[0].src"); 172 173 prs.writeBodyScript(writer, cycle); 174 175 assertOutput(new String[] 176 {"<script type=\"text/javascript\"><!--", "", 177 "tapestry.addOnLoad(function(e) {", 178 "NAMESPACE.preload = [];", "if (document.images)", "{", 179 "NAMESPACE.preload[0] = new Image();", 180 " NAMESPACE.preload[0].src = \"/foo/bar.gif\";}", 181 "});", 182 "// --></script>" }); 183 184 verify(); 185 } 186 187 public void testAddBodyScript() 188 { 189 AssetFactory factory = newAssetFactory(); 190 Location l = newLocation(); 191 IRequestCycle cycle = newCycle(); 192 IMarkupWriter writer = createWriter(); 193 194 replay(); 195 196 PageRenderSupportImpl prs = new PageRenderSupportImpl(factory, "", l, newBuilder(writer)); 197 198 prs.addBodyScript("myBodyScript();"); 199 200 prs.writeBodyScript(writer, cycle); 201 202 assertOutput(new String[] 203 { "<script type=\"text/javascript\"><!--", 204 "myBodyScript();", 205 "// --></script>" }); 206 207 verify(); 208 } 209 210 public void testGetUniqueString() 211 { 212 AssetFactory factory = newAssetFactory(); 213 Location l = newLocation(); 214 215 replay(); 216 217 PageRenderSupportImpl prs = new PageRenderSupportImpl(factory, "", l, newBuilder(null)); 218 219 assertEquals("foo", prs.getUniqueString("foo")); 220 assertEquals("foo_0", prs.getUniqueString("foo")); 221 assertEquals("bar", prs.getUniqueString("bar")); 222 assertEquals("foo_1", prs.getUniqueString("foo")); 223 224 verify(); 225 } 226 227 public void testGetUniqueStringWithNamespace() 228 { 229 AssetFactory factory = newAssetFactory(); 230 Location l = newLocation(); 231 232 replay(); 233 234 PageRenderSupportImpl prs = new PageRenderSupportImpl(factory, "NAMESPACE", l, newBuilder(null)); 235 236 assertEquals("fooNAMESPACE", prs.getUniqueString("foo")); 237 assertEquals("fooNAMESPACE_0", prs.getUniqueString("foo")); 238 assertEquals("barNAMESPACE", prs.getUniqueString("bar")); 239 assertEquals("fooNAMESPACE_1", prs.getUniqueString("foo")); 240 241 verify(); 242 } 243 244 public void testAddInitializationScript() 245 { 246 AssetFactory factory = newAssetFactory(); 247 Location l = newLocation(); 248 IMarkupWriter writer = createWriter(); 249 250 replay(); 251 252 PageRenderSupportImpl prs = new PageRenderSupportImpl(factory, "", l, newBuilder(writer)); 253 254 prs.addInitializationScript("myInitializationScript1();"); 255 prs.addInitializationScript("myInitializationScript2();"); 256 prs.addInitializationScript("dojo.require(\"dojo.event.*\");"); 257 prs.addInitializationScript("dojo.require(\"dojo.widget.*\");dojo.require(\"dojo.event.*\");"); 258 prs.addInitializationScript("dojo.require(\"dojo.event.*\");"); 259 prs.addInitializationScript("dojo.require(\"tapestry.form\");tapestry.form.registerForm(\"valid\");\n" + 260 "tapestry.form.focusField(\'inputEnabled\');\n" + 261 "dojo.require(\"tapestry.form\");tapestry.form.registerForm(\"form\");"); 262 263 prs.writeInitializationScript(writer); 264 265 assertOutput(new String[] 266 { "<script type=\"text/javascript\"><!--", 267 "tapestry.addOnLoad(function(e) {", 268 "myInitializationScript1();", "myInitializationScript2();", 269 "dojo.require(\"dojo.event.*\");","dojo.require(\"dojo.widget.*\");", 270 "", 271 "tapestry.form.registerForm(\"valid\");", 272 "tapestry.form.focusField(\'inputEnabled\');", 273 "dojo.require(\"tapestry.form\");tapestry.form.registerForm(\"form\");});", 274 "// --></script>" }); 275 276 verify(); 277 } 278 279 public void testAddExternalScript() throws Exception 280 { 281 String newline = TEST_NEWLINE; 282 283 IRequestCycle cycle = newCycle(); 284 285 IMarkupWriter writer = createWriter(); 286 287 AssetFactory assetFactory = newMock(AssetFactory.class); 288 289 Resource script1 = newResource(); 290 IAsset asset1 = newAsset("/script1.js"); 291 292 Resource script2 = newResource(); 293 IAsset asset2 = newAsset("/script2.js"); 294 295 expect(assetFactory.createAsset(script1, null)).andReturn(asset1); 296 297 expect(assetFactory.createAsset(script2, null)).andReturn(asset2); 298 299 replay(); 300 301 PageRenderSupportImpl prs = new PageRenderSupportImpl(assetFactory, "", null, newBuilder(writer)); 302 303 prs.addExternalScript(script1); 304 prs.addExternalScript(script2); 305 prs.addExternalScript(script1); 306 307 prs.writeBodyScript(writer, cycle); 308 309 // PageRenderSupport is a little sloppy about using \n for a newline, vs. using 310 // the property line seperator sequence and it bites us right here. 311 312 assertOutput(scriptTagFor("/script1.js") + newline + scriptTagFor("/script2.js") + newline); 313 314 verify(); 315 } 316 317 private String scriptTagFor(String url) 318 { 319 return "<script type=\"text/javascript\" src=\"" + url 320 + "\"></script>"; 321 } 322 }