/**
* Copyright 2010 Google Inc.
*
* 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.waveprotocol.wave.client.editor.gwt;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Node;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.user.client.ui.ComplexPanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import org.waveprotocol.wave.client.editor.Editor;
import org.waveprotocol.wave.client.editor.EditorImpl;
import org.waveprotocol.wave.client.editor.content.AgentAdapter;
import org.waveprotocol.wave.client.editor.content.ContentDocument;
import org.waveprotocol.wave.client.editor.content.ContentElement;
import org.waveprotocol.wave.client.editor.content.ContentRawDocument;
import org.waveprotocol.wave.client.editor.gwt.GwtRenderingMutationHandler.Flow;
import org.waveprotocol.wave.client.editor.testing.TestEditors;
import java.util.Collections;
/**
* @author danilatos@google.com (Daniel Danilatos)
*/
public class GwtRenderingMutationHandlerGwtTest extends GWTTestCase {
private ContentDocument doc;
private ComplexPanel panel;
private GwtRenderingMutationHandler handler;
private ContentElement root;
private ContentRawDocument rawDoc;
public void testDeferredHandlerMustHaveFlow() {
deferredHandler(Flow.INLINE);
AgentAdapter e1 = elem("ab");
deferredHandler(Flow.USE_WIDGET);
try {
e1 = elem("ab");
fail("USE_WIDGET should not be permitted with a null initial domImpl");
} catch (RuntimeException e) {
// ok
}
}
public void testRegistersContainerNodelet() {
complexHandler(Flow.INLINE);
AgentAdapter e1 = elem("ab");
Widget a = handler.getGwtWidget(e1);
com.google.gwt.user.client.Element b = a.getElement();
Node c = b.getFirstChild();
Element d = e1.getContainerNodelet();
assertSame(c,
d);
}
public void testReceivesNewWidgetSafely() {
simpleHandler(Flow.INLINE);
AgentAdapter e1 = elem("ab");
assertEquals("ab", ((Label) handler.getGwtWidget(e1)).getText());
assertNull(e1.getContainerNodelet());
assertEquals(1, panel.getWidgetCount());
assertSame(e1.getImplNodelet(), handler.getGwtWidget(e1).getElement().getParentElement());
Label label2 = new Label("hi");
handler.receiveNewGwtWidget(e1, label2);
assertSame(label2, handler.getGwtWidget(e1));
assertSame(e1.getImplNodelet(), label2.getElement().getParentElement());
Label label3 = new Label("there");
handler.receiveNewGwtWidget(e1, label3);
assertSame(label3, handler.getGwtWidget(e1));
assertSame(e1.getImplNodelet(), label3.getElement().getParentElement());
assertEquals(1, panel.getWidgetCount());
assertSame(panel, handler.getGwtWidget(e1).getParent());
// logical detach automatically
rawDoc.removeChild(root, e1);
assertEquals(0, panel.getWidgetCount());
}
public void testReceivesNewWidgetWithContainerNodeletSafely() {
complexHandler(Flow.INLINE);
assertEquals(0, panel.getWidgetCount());
AgentAdapter e1 = elem("ab");
assertEquals(1, panel.getWidgetCount());
assertSame(e1.getImplNodelet(), handler.getGwtWidget(e1).getElement().getParentElement());
assertSame(handler.getGwtWidget(e1).getElement().getFirstChild(),
e1.getContainerNodelet());
assertSame(panel, handler.getGwtWidget(e1).getParent());
Widget w3 = createComplexWidget();
handler.receiveNewGwtWidget(e1, w3);
assertSame(w3, handler.getGwtWidget(e1));
assertSame(e1.getImplNodelet(), w3.getElement().getParentElement());
assertSame(w3.getElement().getFirstChild(), e1.getContainerNodelet());
assertEquals(1, panel.getWidgetCount());
assertSame(panel, handler.getGwtWidget(e1).getParent());
// logical detach automatically
rawDoc.removeChild(root, e1);
assertEquals(0, panel.getWidgetCount());
}
private void simpleHandler(final Flow flow) {
handler = new GwtRenderingMutationHandler(flow) {
@Override
protected Widget createGwtWidget(Renderable element) {
return new Label(element.getTagName());
}
};
initDoc();
}
private void deferredHandler(final Flow flow) {
handler = new GwtRenderingMutationHandler(flow) {
@Override
protected Widget createGwtWidget(Renderable element) {
return null;
}
};
initDoc();
}
private void complexHandler(final Flow flow) {
handler = new GwtRenderingMutationHandler(flow) {
@Override
protected Widget createGwtWidget(Renderable element) {
return createComplexWidget();
}
@Override
protected Element getContainerNodelet(Widget w) {
return w.getElement().getFirstChild().<Element>cast();
}
};
initDoc();
}
private FlowPanel createComplexWidget() {
FlowPanel panel = new FlowPanel();
FlowPanel child = new FlowPanel();
panel.add(child);
return panel;
}
private void initDoc() {
Editor.ROOT_HANDLER_REGISTRY.registerRenderingMutationHandler("ab", handler);
Editor.ROOT_HANDLER_REGISTRY.registerRenderingMutationHandler("cd", handler);
doc = TestEditors.createTestDocument();
rawDoc = doc.debugGetRawDocument();
root = rawDoc.getDocumentElement();
panel = (EditorImpl) doc.getContext().editing().editorContext();
}
private AgentAdapter elem(String tagName) {
return (AgentAdapter) doc.getAnnotatableContent().transparentCreate(tagName,
Collections.<String, String>emptyMap(),
doc.getAnnotatableContent().getDocumentElement(), null);
}
@Override
public String getModuleName() {
return "org.waveprotocol.wave.client.editor.gwt.Tests";
}
}