/*******************************************************************************
* Copyright (c) 2002-2006 Innoopract Informationssysteme GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Innoopract Informationssysteme GmbH - initial API and implementation
******************************************************************************/
package com.w4t.ajax;
import junit.framework.TestCase;
import org.eclipse.rwt.internal.browser.Ie5up;
import org.eclipse.rwt.internal.browser.Ie6;
import org.eclipse.rwt.internal.lifecycle.HtmlResponseWriter;
import org.eclipse.rwt.internal.service.ContextProvider;
import com.w4t.*;
import com.w4t.dhtml.*;
import com.w4t.mockup.TestForm;
import com.w4t.util.ComponentTreeVisitor;
import com.w4t.util.RendererCache;
import com.w4t.util.ComponentTreeVisitor.AllComponentVisitor;
public class AjaxStatus_Test extends TestCase {
private static final class NonAjaxContainer extends WebComponent {
private String foo;
public void setFoo( final String foo ) {
this.foo = foo;
}
public String getFoo() {
return foo;
}
}
protected void setUp() throws Exception {
W4TFixture.setUp();
W4TFixture.createContext();
}
protected void tearDown() throws Exception {
W4TFixture.tearDown();
W4TFixture.removeContext();
}
public void testSetMustRender() throws Exception {
// construct form -> containing component -> containing text
WebForm form = new TestForm();
form.setWebLayout( new WebGridLayout() );
WebContainer container = new WebPanel();
form.add( container, new Position( 1, 1 ) );
WebComponent text = new WebText();
container.add( text );
AjaxStatus formAjaxStatus = W4TFixture.getAjaxStatus( form );
formAjaxStatus.updateStatus( true );
assertTrue( getMustRender( form ) );
assertTrue( getMustRender( container ) );
assertTrue( getMustRender( text ) );
}
public void testAjaxEnvelope() throws Exception {
WebForm form = W4TFixture.getEmptyWebFormInstance();
WebPanel panel = new WebPanel();
form.add( panel, WebBorderLayout.NORTH );
WebLabel label = new WebLabel();
panel.add( label );
WebScrollPane scrollPane = new WebScrollPane();
WebButton button = new WebButton();
scrollPane.setContent( button );
panel.add( scrollPane );
TreeView treeView = new TreeView();
TreeNode treeNode = new TreeNode();
treeView.addItem( treeNode );
TreeLeaf treeLeaf = new TreeLeaf();
treeNode.addItem( treeLeaf );
panel.add( treeView );
W4TFixture.getAjaxStatus( form ).updateStatus( true );
ComponentTreeVisitor visitor = new AllComponentVisitor() {
public boolean doVisit( final WebComponent component ) {
assertTrue( getMustRender( component ) );
return true;
}
};
ComponentTreeVisitor.accept( form, visitor );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( panel ) );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( label ) );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( scrollPane ) );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( button ) );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( treeView ) );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( treeNode ) );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( treeLeaf ) );
assertTrue( AjaxStatusUtil.isRootOfSubTreeToRender( form ) );
W4TFixture.getAjaxStatus( form ).setMustRender( false );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( form ) );
assertTrue( AjaxStatusUtil.isRootOfSubTreeToRender( panel ) );
W4TFixture.getAjaxStatus( panel ).setMustRender( false );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( panel ) );
assertTrue( AjaxStatusUtil.isRootOfSubTreeToRender( label ) );
assertTrue( AjaxStatusUtil.isRootOfSubTreeToRender( scrollPane ) );
assertTrue( AjaxStatusUtil.isRootOfSubTreeToRender( treeView ) );
W4TFixture.getAjaxStatus( label ).setMustRender( false );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( label ) );
assertTrue( AjaxStatusUtil.isRootOfSubTreeToRender( scrollPane ) );
assertTrue( AjaxStatusUtil.isRootOfSubTreeToRender( treeView ) );
W4TFixture.getAjaxStatus( scrollPane ).setMustRender( false );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( label ) );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( scrollPane ) );
assertTrue( AjaxStatusUtil.isRootOfSubTreeToRender( treeView ) );
W4TFixture.getAjaxStatus( treeView ).setMustRender( false );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( label ) );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( scrollPane ) );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( treeView ) );
assertTrue( AjaxStatusUtil.isRootOfSubTreeToRender( button ) );
W4TFixture.getAjaxStatus( button ).setMustRender( false );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( button ) );
assertTrue( AjaxStatusUtil.isRootOfSubTreeToRender( treeNode ) );
W4TFixture.getAjaxStatus( treeNode ).setMustRender( false );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( treeNode ) );
assertTrue( AjaxStatusUtil.isRootOfSubTreeToRender( treeLeaf ) );
W4TFixture.getAjaxStatus( treeLeaf ).setMustRender( false );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( treeLeaf ) );
// check unparent components
WebText text = new WebText();
W4TFixture.getAjaxStatus( text ).setMustRender( true );
assertTrue( AjaxStatusUtil.mustRender( text ) );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( text ) );
WebAnchor anchor = new WebAnchor();
W4TFixture.getAjaxStatus( anchor ).setMustRender( true );
assertTrue( AjaxStatusUtil.mustRender( anchor ) );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( anchor ) );
Menu menu = new Menu();
W4TFixture.getAjaxStatus( menu ).setMustRender( true );
assertTrue( AjaxStatusUtil.mustRender( menu ) );
assertFalse( AjaxStatusUtil.isRootOfSubTreeToRender( menu ) );
// check envelope markup
W4TFixture.getAjaxStatus( label ).updateStatus( true );
HtmlResponseWriter writer = new HtmlResponseWriter();
ContextProvider.getStateInfo().setResponseWriter( writer );
String labelContent = "<labelContent />";
W4TFixture.fakeBrowser( new Ie5up( true, false ) );
AjaxStatusUtil.startEnvelope( label );
writer.append( labelContent );
AjaxStatusUtil.endEnvelope( label );
String markup = W4TFixture.getBodyMarkup( writer );
String expected = labelContent;
assertEquals( expected, markup );
writer = new HtmlResponseWriter();
ContextProvider.getStateInfo().setResponseWriter( writer );
W4TFixture.fakeBrowser( new Ie5up( true, true ) );
AjaxStatusUtil.startEnvelope( label );
writer.append( labelContent );
AjaxStatusUtil.endEnvelope( label );
markup = W4TFixture.getBodyMarkup( writer );
expected = "<envelope id=\""
+ label.getUniqueID()
+ "\"><!--"
+ labelContent
+ "--></envelope>";
assertEquals( expected, markup );
}
public void testNonAjaxComponent() {
W4TFixture.fakeBrowser( new Ie6( true, true ) );
WebForm form = W4TFixture.getEmptyWebFormInstance();
NonAjaxContainer nonAjaxComponent = new NonAjaxContainer();
form.add( nonAjaxComponent, WebBorderLayout.CENTER );
assertFalse( hasAjaxRenderer( nonAjaxComponent) );
// initially everything must be rendered
AjaxStatusUtil.preRender( form );
assertEquals( true, getMustRender( form ) );
assertEquals( true, getMustRender( nonAjaxComponent ) );
// second 'turn': nonAjaxComponent must be rendered because it has no ajax
// renderer, form must be rendered because it is parent of nonAjaxComponent
AjaxStatusUtil.postRender( form );
AjaxStatusUtil.preRender( form );
assertEquals( true, getMustRender( form ) );
assertEquals( true, getMustRender( nonAjaxComponent ) );
//
// ??? is that correct ???
//
nonAjaxComponent.setFoo( "bar" );
AjaxStatusUtil.postRender( form );
AjaxStatusUtil.preRender( form );
assertEquals( true, getMustRender( form ) );
assertEquals( true, getMustRender( nonAjaxComponent ) );
}
// Test AjaxStatusUtil#updateHashCode and ensure that only the passed-in
// component is updated (none of its children)
public void testUpdateHashCode() {
WebPanel panel = new WebPanel();
WebText text = new WebText();
panel.add( text );
AjaxStatusUtil.updateHashCode( panel );
assertEquals( true,
W4TFixture.getAjaxStatus( panel ).hasComponentHashCode() );
assertEquals( false,
W4TFixture.getAjaxStatus( text ).hasComponentHashCode() );
}
private static boolean hasAjaxRenderer( final WebComponent component ) {
RendererCache rendererCache = RendererCache.getInstance();
String rendererClassName;
rendererClassName = rendererCache.getRendererClass( component.getClass() );
return rendererClassName != null
&& rendererClassName.endsWith( "_Ajax" );
}
private static boolean getMustRender( final WebComponent component ) {
return W4TFixture.getAjaxStatus( component ).mustRender();
}
}