| /* |
| * Copyright 2011 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 com.google.gwt.uibinder.test.client; |
| |
| import com.google.gwt.core.client.GWT; |
| import com.google.gwt.dom.client.DivElement; |
| import com.google.gwt.event.logical.shared.ValueChangeEvent; |
| import com.google.gwt.junit.client.GWTTestCase; |
| import com.google.gwt.uibinder.client.UiBinder; |
| import com.google.gwt.uibinder.client.UiField; |
| import com.google.gwt.uibinder.client.UiHandler; |
| import com.google.gwt.user.client.ui.Image; |
| import com.google.gwt.user.client.ui.IsRenderable; |
| import com.google.gwt.user.client.ui.Label; |
| import com.google.gwt.user.client.ui.PotentialElement; |
| import com.google.gwt.user.client.ui.RenderablePanel; |
| import com.google.gwt.user.client.ui.RootPanel; |
| |
| /** |
| * Integration test for {@link com.google.gwt.user.client.ui.IsRenderable |
| * IsRenderable}. |
| */ |
| public class IsRenderableIntegrationTest extends GWTTestCase { |
| static class Deep { |
| interface Binder extends UiBinder<IsRenderable, Deep> { |
| } |
| |
| static final Binder binder = GWT.create(Binder.class); |
| |
| @UiField |
| RenderablePanel top; |
| @UiField |
| DivElement outerDiv; |
| @UiField |
| DivElement innerDiv; |
| @UiField |
| SimpleRenderable outerRenderable; |
| @UiField |
| Label outerLabel; |
| @UiField |
| Label innerLabel; |
| @UiField |
| SimpleRenderable innerRenderable; |
| @UiField |
| Image outerI18nImage; |
| @UiField |
| Image innerI18nImage; |
| @UiField |
| RenderableComposite outerComposite; |
| @UiField |
| RenderableComposite innerComposite; |
| |
| Object receivedValue; |
| |
| Deep() { |
| binder.createAndBindUi(this); |
| } |
| |
| @UiHandler("outerRenderable") |
| void onValueChange(ValueChangeEvent<Object> event) { |
| receivedValue = event.getValue(); |
| } |
| } |
| |
| static class Shallow { |
| interface Binder extends UiBinder<IsRenderable, Shallow> { |
| } |
| |
| static final Binder binder = GWT.create(Binder.class); |
| |
| @UiField |
| SimpleRenderable widget; |
| |
| Shallow() { |
| binder.createAndBindUi(this); |
| } |
| } |
| |
| @Override |
| public String getModuleName() { |
| return "com.google.gwt.uibinder.test.LazyWidgetBuilderSuite"; |
| } |
| |
| public void testDeep() { |
| Deep deep = new Deep(); |
| assertTrue(PotentialElement.isPotential(deep.top.getElement())); |
| assertTrue(PotentialElement.isPotential(deep.outerRenderable.getElement())); |
| assertTrue(PotentialElement.isPotential(deep.innerRenderable.getElement())); |
| |
| /* |
| * This is pretty surprising. I don't think it's a good idea to be filling |
| * in the owner's fields at some arbitrary later date. I doubt it's a real |
| * speed up, since the things will still have to be instantiated before the |
| * user sees them, and it seems guaranteed to be a source of confusion. |
| * |
| * Hmm. What keeps the object that fills in the fields at attach time |
| * from being gc'd? And are we sure it's not leaking? |
| * |
| * Although I suppose we have no choice with dom children. Interesting |
| * problem. |
| */ |
| assertNull(deep.outerI18nImage); |
| assertNull(deep.innerI18nImage); |
| assertNull(deep.outerLabel); |
| assertNull(deep.innerLabel); |
| assertNull(deep.innerLabel); |
| assertNull(deep.outerDiv); |
| assertNull(deep.innerDiv); |
| |
| // Oh dear, we're not even consistent about it. That means the above is a |
| // bug, period. |
| assertNotNull(deep.outerComposite); |
| assertNotNull(deep.innerComposite); |
| assertTrue(PotentialElement.isPotential(deep.outerComposite.getWidget().getElement())); |
| assertTrue(PotentialElement.isPotential(deep.innerComposite.getWidget().getElement())); |
| |
| try { |
| RootPanel.get().add(deep.top); |
| |
| assertEquals("Outer div", deep.outerDiv.getInnerText()); |
| assertEquals("Inner div", deep.innerDiv.getInnerText()); |
| |
| assertEquals("[string built]Outer renderable", |
| deep.outerRenderable.getElement().getInnerText()); |
| assertEquals("[string built]Inner renderable", |
| deep.innerRenderable.getElement().getInnerText()); |
| |
| assertNotNull(deep.outerI18nImage); |
| assertNotNull(deep.innerI18nImage); |
| |
| assertEquals("Outer label", deep.outerLabel.getText()); |
| assertEquals("Inner label", deep.innerLabel.getText()); |
| |
| assertEquals("[string built]Renderable", |
| deep.outerComposite.getWidget().getElement().getInnerText()); |
| assertEquals("[string built]Renderable", |
| deep.innerComposite.getWidget().getElement().getInnerText()); |
| |
| // Test event handling. It is cool as hell that this works! |
| deep.outerRenderable.setValue("foo"); |
| assertEquals("foo", deep.receivedValue); |
| |
| /* |
| * This is really a test of SimpleRenderable itself, but what the hell. |
| * That class might be useful some day. |
| */ |
| deep.outerRenderable.setText("fnord"); |
| assertEquals("[updated]fnord", deep.outerRenderable.getElement().getInnerText()); |
| |
| } finally { |
| deep.top.removeFromParent(); |
| } |
| } |
| |
| public void testLegacyComposite() { |
| LegacyComposite legacyComposite = new LegacyComposite(); |
| assertEquals("span", legacyComposite.span.getInnerText()); |
| } |
| |
| public void testNestedRenderableComposite() { |
| RenderableComposite.Meta meta = new RenderableComposite.Meta(); |
| assertTrue(PotentialElement.isPotential(meta.getElement())); |
| |
| try { |
| RootPanel.get().add(meta); |
| assertEquals("[dom built]Renderable", |
| meta.getWidget().getElement().getInnerText()); |
| } finally { |
| meta.removeFromParent(); |
| } |
| } |
| |
| public void testRenderableComposite() { |
| RenderableComposite renderableComposite = new RenderableComposite(); |
| assertTrue(PotentialElement.isPotential(renderableComposite.getElement())); |
| |
| // TODO(rdcastro) This results in an NPE |
| // assertEquals("something useful", renderableComposite.toString()); |
| |
| try { |
| RootPanel.get().add(renderableComposite); |
| assertEquals("[dom built]Renderable", |
| renderableComposite.getWidget().getElement().getInnerText()); |
| } finally { |
| renderableComposite.removeFromParent(); |
| } |
| } |
| |
| |
| public void testShallow() { |
| Shallow shallow = new Shallow(); |
| assertTrue(PotentialElement.isPotential(shallow.widget.getElement())); |
| try { |
| RootPanel.get().add(shallow.widget); |
| assertEquals("[dom built]" + shallow.widget.getText(), |
| shallow.widget.getElement().getInnerText()); |
| } finally { |
| shallow.widget.removeFromParent(); |
| } |
| } |
| } |