summaryrefslogtreecommitdiffstats
path: root/uitest
diff options
context:
space:
mode:
authorArtur <artur@vaadin.com>2017-04-18 10:57:11 +0300
committerHenri Sara <henri.sara@gmail.com>2017-04-18 10:57:11 +0300
commit9a0f1c136168fbc7b63570b88da7a9cba9de389c (patch)
tree1f08ad9d488a00fabdb639f7ffe9d7a02978aad3 /uitest
parentb480c7166ac56801cda11b73a6ad4694d467b98b (diff)
downloadvaadin-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.java97
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/composite/CompositeChainUITest.java55
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();
+ }
+}