diff options
author | Artur <artur@vaadin.com> | 2017-04-18 10:57:11 +0300 |
---|---|---|
committer | Henri Sara <henri.sara@gmail.com> | 2017-04-18 10:57:11 +0300 |
commit | 9a0f1c136168fbc7b63570b88da7a9cba9de389c (patch) | |
tree | 1f08ad9d488a00fabdb639f7ffe9d7a02978aad3 /uitest | |
parent | b480c7166ac56801cda11b73a6ad4694d467b98b (diff) | |
download | vaadin-framework-9a0f1c136168fbc7b63570b88da7a9cba9de389c.tar.gz vaadin-framework-9a0f1c136168fbc7b63570b88da7a9cba9de389c.zip |
Composite component (#8952)
A composite is included in the server side hierarchy and in the connector
hierarchy on the client side but does not have its own widget or DOM.
To ensure that captions etc are renderer correctly for the root contents,
the client side connector returns both the widget and state for the content
connector.
Server side API related to width and height are automatically forwarded to
the root component to enable easy use of the composite inside different
layout configurations.
Other server side API inherited from AbstractComponent is unwanted, should be
optional and therefore throw an exception by default.
Resolves #2458
Diffstat (limited to 'uitest')
-rw-r--r-- | uitest/src/main/java/com/vaadin/tests/components/composite/CompositeChainUI.java | 97 | ||||
-rw-r--r-- | uitest/src/test/java/com/vaadin/tests/components/composite/CompositeChainUITest.java | 55 |
2 files changed, 152 insertions, 0 deletions
diff --git a/uitest/src/main/java/com/vaadin/tests/components/composite/CompositeChainUI.java b/uitest/src/main/java/com/vaadin/tests/components/composite/CompositeChainUI.java new file mode 100644 index 0000000000..481f7c958f --- /dev/null +++ b/uitest/src/main/java/com/vaadin/tests/components/composite/CompositeChainUI.java @@ -0,0 +1,97 @@ +/* + * Copyright 2000-2016 Vaadin Ltd. + * + * 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.vaadin.tests.components.composite; + +import java.util.Iterator; + +import com.vaadin.annotations.Widgetset; +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUIWithLog; +import com.vaadin.ui.Button; +import com.vaadin.ui.Component; +import com.vaadin.ui.Composite; +import com.vaadin.ui.HasComponents; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.VerticalLayout; + +@Widgetset("com.vaadin.DefaultWidgetSet") +public class CompositeChainUI extends AbstractTestUIWithLog { + + private Label innermostComponent; + private Composite innerComposite; + private Composite outerComposite; + private VerticalLayout container; + private HorizontalLayout layout; + + @Override + protected void setup(VaadinRequest request) { + + createComposite(); + layout = new HorizontalLayout(outerComposite); + container = new VerticalLayout(layout); + addComponent(container); + + Button updateCaption = new Button("Update caption"); + updateCaption.addClickListener(e -> { + innermostComponent + .setCaption(innermostComponent.getCaption() + " - updated"); + }); + addComponent(updateCaption); + Button replaceWithAnotherComposite = new Button( + "Replace with another Composite", e -> { + Composite oldOuter = outerComposite; + createComposite(); + layout.replaceComponent(oldOuter, outerComposite); + }); + addComponent(replaceWithAnotherComposite); + logHierarchy(); + } + + private void createComposite() { + innermostComponent = new Label("Label text"); + innermostComponent.setCaption("Label caption"); + innermostComponent.setId("innermost"); + + innerComposite = new Composite(innermostComponent); + outerComposite = new Composite(innerComposite); + } + + private void logHierarchy() { + String msg = "Hierarchy: "; + if (container != null) { + msg += getHierarchy(container); + } + log(msg); + } + + private static String getHierarchy(Component component) { + String msg = component.getClass().getSimpleName(); + if (component instanceof HasComponents) { + + Iterator<Component> iterator = ((HasComponents) component) + .iterator(); + if (iterator.hasNext()) { + Component content = iterator.next(); + if (content != null) { + msg += " -> " + getHierarchy(content); + } + } + } + return msg; + } + +} diff --git a/uitest/src/test/java/com/vaadin/tests/components/composite/CompositeChainUITest.java b/uitest/src/test/java/com/vaadin/tests/components/composite/CompositeChainUITest.java new file mode 100644 index 0000000000..228d20f058 --- /dev/null +++ b/uitest/src/test/java/com/vaadin/tests/components/composite/CompositeChainUITest.java @@ -0,0 +1,55 @@ +/* + * Copyright 2000-2016 Vaadin Ltd. + * + * 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.vaadin.tests.components.composite; + +import org.junit.Assert; +import org.junit.Test; +import org.openqa.selenium.WebElement; + +import com.vaadin.testbench.By; +import com.vaadin.testbench.elements.ButtonElement; +import com.vaadin.testbench.elements.LabelElement; +import com.vaadin.tests.tb3.SingleBrowserTest; + +public class CompositeChainUITest extends SingleBrowserTest { + + @Test + public void compositeRenderedAndUpdatedCorrectly() { + openTestURL(); + LabelElement label = $(LabelElement.class).id("innermost"); + WebElement labelGrandParent = label.findElement(By.xpath("../..")); + + Assert.assertEquals("v-slot", labelGrandParent.getAttribute("class")); + Assert.assertEquals("Label caption", label.getCaption()); + + $(ButtonElement.class).caption("Update caption").first().click(); + Assert.assertEquals("Label caption - updated", label.getCaption()); + + } + + @Test + public void compositeRemovedCorrectly() { + openTestURL("debug"); + LabelElement label = $(LabelElement.class).id("innermost"); + $(ButtonElement.class).caption("Update caption").first().click(); + Assert.assertEquals("Label caption - updated", label.getCaption()); + $(ButtonElement.class).caption("Replace with another Composite").first() + .click(); + label = $(LabelElement.class).id("innermost"); + Assert.assertEquals("Label caption", label.getCaption()); + assertNoErrorNotifications(); + } +} |