diff options
author | Teemu Suo-Anttila <teemusa@vaadin.com> | 2015-06-02 17:42:28 +0300 |
---|---|---|
committer | Teemu Suo-Anttila <teemusa@vaadin.com> | 2015-06-02 17:44:01 +0300 |
commit | f861a2dfe4a64e696fe5f70fc7ae4c7c1b1612ef (patch) | |
tree | 45cd6decaaf958aaf94d50b7a6279c174d523007 | |
parent | ec54a601dc882333687bcef2b4fa59c02e6c4ede (diff) | |
parent | 4724d89af9228edcb9bbff987255122841c6d33e (diff) | |
download | vaadin-framework-f861a2dfe4a64e696fe5f70fc7ae4c7c1b1612ef.tar.gz vaadin-framework-f861a2dfe4a64e696fe5f70fc7ae4c7c1b1612ef.zip |
Merge remote-tracking branch 'origin/master' into grid-unbuffered-editor
Change-Id: I0a2ed5629eb0598d4049d4cf5ea6e55fe3092c99
17 files changed, 302 insertions, 146 deletions
diff --git a/server/src/com/vaadin/data/fieldgroup/FieldGroup.java b/server/src/com/vaadin/data/fieldgroup/FieldGroup.java index d370c3906b..aaaae9e4f7 100644 --- a/server/src/com/vaadin/data/fieldgroup/FieldGroup.java +++ b/server/src/com/vaadin/data/fieldgroup/FieldGroup.java @@ -258,7 +258,19 @@ public class FieldGroup implements Serializable { if (itemDataSource == null) { // Clear any possible existing binding to clear the field field.setPropertyDataSource(null); - field.clear(); + boolean fieldReadOnly = field.isReadOnly(); + if (!fieldReadOnly) { + field.clear(); + } else { + // Temporarily make the field read-write so we can clear the + // value. Needed because setPropertyDataSource(null) does not + // currently clear the field + // (https://dev.vaadin.com/ticket/14733) + field.setReadOnly(false); + field.clear(); + field.setReadOnly(true); + } + // Will be bound when data source is set return; } @@ -1247,4 +1259,5 @@ public class FieldGroup implements Serializable { } } -} + +}
\ No newline at end of file diff --git a/server/src/com/vaadin/ui/Grid.java b/server/src/com/vaadin/ui/Grid.java index 77785c301b..74f58ecf74 100644 --- a/server/src/com/vaadin/ui/Grid.java +++ b/server/src/com/vaadin/ui/Grid.java @@ -889,7 +889,7 @@ public class Grid extends AbstractFocusable implements SelectionNotifier, /** * Marks an item as selected. * - * @param itemIds + * @param itemId * the itemId to mark as selected; <code>null</code> for * deselect * @return <code>true</code> if the selection state changed. @@ -2039,7 +2039,7 @@ public class Grid extends AbstractFocusable implements SelectionNotifier, /** * Removes the row at the given position. * - * @param index + * @param rowIndex * the position of the row * * @throws IllegalArgumentException @@ -2536,7 +2536,7 @@ public class Grid extends AbstractFocusable implements SelectionNotifier, private Converter<?, Object> converter; /** - * A check for allowing the {@link #Column(Grid, GridColumnState) + * A check for allowing the {@link #Column(Grid, GridColumnState, Object) * constructor} to call {@link #setConverter(Converter)} with a * <code>null</code>, even if model and renderer aren't compatible. */ @@ -3196,7 +3196,7 @@ public class Grid extends AbstractFocusable implements SelectionNotifier, * * @throws IllegalArgumentException * if there is no column for the provided property id - * @throws BindException + * @throws FieldGroup.BindException * if no field has been configured and there is a problem * building or binding */ @@ -3367,12 +3367,12 @@ public class Grid extends AbstractFocusable implements SelectionNotifier, } /** - * An abstract base class for server-side Grid renderers. - * {@link com.vaadin.client.widget.grid.Renderer Grid renderers}. This class - * currently extends the AbstractGridExtension superclass, but this fact - * should be regarded as an implementation detail and subject to change in a - * future major or minor Vaadin revision. - * + * An abstract base class for server-side + * {@link com.vaadin.ui.renderers.Renderer Grid renderers}. This class + * currently extends the AbstractExtension superclass, but this fact should + * be regarded as an implementation detail and subject to change in a future + * major or minor Vaadin revision. + * * @param <T> * the type this renderer knows how to present */ @@ -3443,7 +3443,7 @@ public class Grid extends AbstractFocusable implements SelectionNotifier, * is desired. For instance, a {@code Renderer<Date>} could first turn a * date value into a formatted string and return * {@code encode(dateString, String.class)}. - * + * * @param value * the value to be encoded * @param type @@ -3458,7 +3458,7 @@ public class Grid extends AbstractFocusable implements SelectionNotifier, /** * An abstract base class for server-side Grid extensions. - * + * * @since 7.5 */ public static abstract class AbstractGridExtension extends @@ -3473,7 +3473,7 @@ public class Grid extends AbstractFocusable implements SelectionNotifier, /** * Constructs a new Grid extension and extends given Grid. - * + * * @param grid * a grid instance */ @@ -3632,7 +3632,7 @@ public class Grid extends AbstractFocusable implements SelectionNotifier, * in Grid() constructor, or <code>false</code> if the user has set their * own Container. * - * @see #setContainerDataSource() + * @see #setContainerDataSource(Indexed) * @see #Grid() */ private boolean defaultContainer = true; @@ -4626,7 +4626,7 @@ public class Grid extends AbstractFocusable implements SelectionNotifier, * @throws IllegalArgumentException * if {@code rows} is zero or less * @throws IllegalArgumentException - * if {@code rows} is {@link Double#isInifinite(double) + * if {@code rows} is {@link Double#isInfinite(double) * infinite} * @throws IllegalArgumentException * if {@code rows} is {@link Double#isNaN(double) NaN} @@ -4872,7 +4872,7 @@ public class Grid extends AbstractFocusable implements SelectionNotifier, * {@link SelectionModel.Single} and {@link SelectionModel.Multi} are * supported. * - * @param itemIds + * @param itemId * the itemId to mark as selected * @return <code>true</code> if the selection state changed, * <code>false</code> if the itemId already was selected @@ -4965,10 +4965,10 @@ public class Grid extends AbstractFocusable implements SelectionNotifier, * {@link SelectionModel SelectionModels} would be able to inform Grid of * these events. * - * @param addedSelections - * the selections that were added by this event - * @param removedSelections - * the selections that were removed by this event + * @param newSelection + * the selection that was added by this event + * @param oldSelection + * the selection that was removed by this event */ public void fireSelectionEvent(Collection<Object> oldSelection, Collection<Object> newSelection) { @@ -5348,7 +5348,7 @@ public class Grid extends AbstractFocusable implements SelectionNotifier, /** * Removes the row at the given position from the header section. * - * @param index + * @param rowIndex * the position of the row * * @throws IllegalArgumentException @@ -5495,7 +5495,7 @@ public class Grid extends AbstractFocusable implements SelectionNotifier, /** * Removes the row at the given position from the footer section. * - * @param index + * @param rowIndex * the position of the row * * @throws IllegalArgumentException diff --git a/server/src/com/vaadin/ui/TabSheet.java b/server/src/com/vaadin/ui/TabSheet.java index 67dfdd4258..592515c560 100644 --- a/server/src/com/vaadin/ui/TabSheet.java +++ b/server/src/com/vaadin/ui/TabSheet.java @@ -478,9 +478,11 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, * Are the tab selection parts ("tabs") hidden. * * @return true if the tabs are hidden in the UI + * @deprecated as of 7.5, use {@link #isTabsVisible()} instead */ + @Deprecated public boolean areTabsHidden() { - return !getState(false).tabsVisible; + return !isTabsVisible(); } /** @@ -488,9 +490,33 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, * * @param tabsHidden * true if the tabs should be hidden + * @deprecated as of 7.5, use {@link #setTabsVisible(boolean)} instead */ + @Deprecated public void hideTabs(boolean tabsHidden) { - getState().tabsVisible = !tabsHidden; + setTabsVisible(!tabsHidden); + } + + /** + * Sets whether the tab selection part should be shown in the UI + * + * @since 7.5 + * @param tabsVisible + * true if the tabs should be shown in the UI, false otherwise + */ + public void setTabsVisible(boolean tabsVisible) { + getState().tabsVisible = tabsVisible; + } + + /** + * Checks if the tab selection part should be shown in the UI + * + * @return true if the tabs are shown in the UI, false otherwise + * @since 7.5 + */ + public boolean isTabsVisible() { + return getState(false).tabsVisible; + } /** diff --git a/server/tests/src/com/vaadin/tests/server/component/tabsheet/TabSheetDeclarativeTest.java b/server/tests/src/com/vaadin/tests/server/component/tabsheet/TabSheetDeclarativeTest.java index bb5669a3a1..a92101f550 100644 --- a/server/tests/src/com/vaadin/tests/server/component/tabsheet/TabSheetDeclarativeTest.java +++ b/server/tests/src/com/vaadin/tests/server/component/tabsheet/TabSheetDeclarativeTest.java @@ -18,7 +18,9 @@ package com.vaadin.tests.server.component.tabsheet; import org.junit.Test; import com.vaadin.server.ExternalResource; +import com.vaadin.shared.ui.label.ContentMode; import com.vaadin.tests.design.DeclarativeTestBase; +import com.vaadin.ui.Label; import com.vaadin.ui.TabSheet; import com.vaadin.ui.TabSheet.Tab; import com.vaadin.ui.TextField; @@ -65,4 +67,21 @@ public class TabSheetDeclarativeTest extends DeclarativeTestBase<TabSheet> { testRead(design, ts); testWrite(design, ts); } + + @Test + public void tabsNotShown() { + String design = "<v-tab-sheet tabs-visible=\"false\">\n" + + " <tab caption=\"My Tab\" selected=\"true\">\n" + + " <v-label>My Content</v-label>\n" + " </tab>\n" + + "</v-tab-sheet>\n"; + TabSheet ts = new TabSheet(); + ts.setTabsVisible(false); + Label l = new Label("My Content", ContentMode.HTML); + Tab tab = ts.addTab(l); + tab.setCaption("My Tab"); + ts.setSelectedTab(tab); + testRead(design, ts); + testWrite(design, ts); + + } }
\ No newline at end of file diff --git a/shared/src/com/vaadin/shared/util/SharedUtil.java b/shared/src/com/vaadin/shared/util/SharedUtil.java index d363d767be..28c1ea3734 100644 --- a/shared/src/com/vaadin/shared/util/SharedUtil.java +++ b/shared/src/com/vaadin/shared/util/SharedUtil.java @@ -248,7 +248,7 @@ public class SharedUtil implements Serializable { * {@literal foo} becomes {@literal foo} {@literal foo-bar} becomes * {@literal fooBar} {@literal foo--bar} becomes {@literal fooBar} * - * @since + * @since 7.5 * @param dashSeparated * The dash separated string to convert * @return a camelCase version of the input string diff --git a/uitest/src/com/vaadin/tests/components/accordion/AccordionClipsContentTest.java b/uitest/src/com/vaadin/tests/components/accordion/AccordionClipsContentTest.java index 25e40e5ed3..b6fa82aa41 100644 --- a/uitest/src/com/vaadin/tests/components/accordion/AccordionClipsContentTest.java +++ b/uitest/src/com/vaadin/tests/components/accordion/AccordionClipsContentTest.java @@ -15,9 +15,10 @@ */ package com.vaadin.tests.components.accordion; +import org.junit.Test; + import com.vaadin.testbench.elements.NativeButtonElement; import com.vaadin.tests.tb3.MultiBrowserTest; -import org.junit.Test; public class AccordionClipsContentTest extends MultiBrowserTest { @Override @@ -29,21 +30,8 @@ public class AccordionClipsContentTest extends MultiBrowserTest { public void testAccordionClipsContent() throws Exception { openTestURL(); - /* - * MenuBarElement doesn't have any API, so this part is ugly until - * #13364 is fixed - */ - - // Component - vaadinElement("PID_Smenu#item0").click(); - // Component container features - clickAt("Root/VOverlay[0]/VMenuBar[0]#item3", 136, 8); - // Add component - clickAt("Root/VOverlay[1]/VMenuBar[0]#item0", 65, 4); - // NativeButton - clickAt("Root/VOverlay[2]/VMenuBar[0]#item1", 86, 2); - // autoxauto - vaadinElement("Root/VOverlay[3]/VMenuBar[0]#item0").click(); + selectMenuPath("Component", "Component container features", + "Add component", "NativeButton", "auto x auto"); $(NativeButtonElement.class).first().click(); @@ -54,8 +42,4 @@ public class AccordionClipsContentTest extends MultiBrowserTest { compareScreen("button-clicked"); } - - private void clickAt(String vaadinLocator, int x, int y) { - testBenchElement(vaadinElement(vaadinLocator)).click(x, y); - } } diff --git a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/EscalatorBasicClientFeaturesTest.java b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/EscalatorBasicClientFeaturesTest.java index c1b8028cbf..517f657c62 100644 --- a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/EscalatorBasicClientFeaturesTest.java +++ b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/EscalatorBasicClientFeaturesTest.java @@ -22,10 +22,8 @@ import static org.junit.Assert.fail; import java.util.List; import org.openqa.selenium.By; -import org.openqa.selenium.Dimension; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Actions; import com.vaadin.testbench.TestBenchElement; import com.vaadin.testbench.parallel.TestCategory; @@ -204,29 +202,16 @@ public abstract class EscalatorBasicClientFeaturesTest extends MultiBrowserTest return null; } + @Override protected void selectMenu(String menuCaption) { - TestBenchElement menuElement = getMenuElement(menuCaption); - Dimension size = menuElement.getSize(); - new Actions(getDriver()).moveToElement(menuElement, size.width - 10, - size.height / 2).perform(); - } - - private TestBenchElement getMenuElement(String menuCaption) { - return (TestBenchElement) findElement(By.xpath("//td[text() = '" - + menuCaption + "']")); + // GWT menu does not need to be clicked. + selectMenu(menuCaption, false); } - protected void selectMenuPath(String... menuCaptions) { - new Actions(getDriver()).moveToElement(getMenuElement(menuCaptions[0])) - .click().perform(); - for (int i = 1; i < menuCaptions.length - 1; ++i) { - selectMenu(menuCaptions[i]); - new Actions(getDriver()).moveByOffset(20, 0).perform(); - } - new Actions(getDriver()) - .moveToElement( - getMenuElement(menuCaptions[menuCaptions.length - 1])) - .click().perform(); + @Override + protected WebElement getMenuElement(String menuCaption) { + return getDriver().findElement( + By.xpath("//td[text() = '" + menuCaption + "']")); } protected void assertLogContains(String substring) { diff --git a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridBasicFeaturesTest.java b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridBasicFeaturesTest.java index aea2892e3e..a0eb8dfefe 100644 --- a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridBasicFeaturesTest.java +++ b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridBasicFeaturesTest.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.List; import org.openqa.selenium.By; -import org.openqa.selenium.Dimension; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; @@ -51,34 +50,6 @@ public abstract class GridBasicFeaturesTest extends MultiBrowserTest { return GridBasicFeatures.class; } - protected void selectMenu(String menuCaption) { - selectMenu(menuCaption, true); - } - - protected void selectMenu(String menuCaption, boolean click) { - WebElement menuElement = getMenuElement(menuCaption); - Dimension size = menuElement.getSize(); - new Actions(getDriver()).moveToElement(menuElement, size.width - 10, - size.height / 2).perform(); - if (click) { - new Actions(getDriver()).click().perform(); - } - } - - protected WebElement getMenuElement(String menuCaption) { - return getDriver().findElement( - By.xpath("//span[text() = '" + menuCaption + "']")); - } - - protected void selectMenuPath(String... menuCaptions) { - selectMenu(menuCaptions[0], true); - for (int i = 1; i < menuCaptions.length - 1; i++) { - selectMenu(menuCaptions[i]); - new Actions(getDriver()).moveByOffset(40, 0).build().perform(); - } - selectMenu(menuCaptions[menuCaptions.length - 1], true); - } - protected CustomGridElement getGridElement() { return ((TestBenchElement) findElement(By.id("testComponent"))) .wrap(CustomGridElement.class); diff --git a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridClientDataSourcesTest.java b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridClientDataSourcesTest.java index fb12178c9b..c406f85c0c 100644 --- a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridClientDataSourcesTest.java +++ b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridClientDataSourcesTest.java @@ -21,11 +21,9 @@ import static org.junit.Assert.assertNull; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.By; -import org.openqa.selenium.Dimension; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Actions; import com.vaadin.testbench.parallel.TestCategory; import com.vaadin.tests.tb3.MultiBrowserTest; @@ -152,29 +150,16 @@ public class GridClientDataSourcesTest extends MultiBrowserTest { + "\"v-grid-scroller-vertical\")]")); } - private void selectMenu(String menuCaption) { - WebElement menuElement = getMenuElement(menuCaption); - Dimension size = menuElement.getSize(); - new Actions(getDriver()).moveToElement(menuElement, size.width - 10, - size.height / 2).perform(); + @Override + protected void selectMenu(String menuCaption) { + // GWT menu does not need to be clicked. + selectMenu(menuCaption, false); } - private WebElement getMenuElement(String menuCaption) { + @Override + protected WebElement getMenuElement(String menuCaption) { return getDriver().findElement( By.xpath("//td[text() = '" + menuCaption + "']")); } - private void selectMenuPath(String... menuCaptions) { - new Actions(getDriver()).moveToElement(getMenuElement(menuCaptions[0])) - .click().perform(); - for (int i = 1; i < menuCaptions.length - 1; ++i) { - selectMenu(menuCaptions[i]); - new Actions(getDriver()).moveByOffset(20, 0).perform(); - } - new Actions(getDriver()) - .moveToElement( - getMenuElement(menuCaptions[menuCaptions.length - 1])) - .click().perform(); - } - } diff --git a/uitest/src/com/vaadin/tests/components/table/TableDragColumnTest.java b/uitest/src/com/vaadin/tests/components/table/TableDragColumnTest.java index cb7c6a070e..bd2d2ad28b 100644 --- a/uitest/src/com/vaadin/tests/components/table/TableDragColumnTest.java +++ b/uitest/src/com/vaadin/tests/components/table/TableDragColumnTest.java @@ -102,21 +102,4 @@ public class TableDragColumnTest extends MultiBrowserTest { new Actions(getDriver()).release().perform(); } - - protected void selectSubMenu(String menuCaption) { - selectMenu(menuCaption); - new Actions(getDriver()).moveByOffset(100, 0).build().perform(); - } - - protected void selectMenu(String menuCaption) { - getDriver().findElement( - By.xpath("//span[text() = '" + menuCaption + "']")).click(); - } - - protected void selectMenuPath(String... menuCaptions) { - selectMenu(menuCaptions[0]); - for (int i = 1; i < menuCaptions.length; i++) { - selectSubMenu(menuCaptions[i]); - } - } } diff --git a/uitest/src/com/vaadin/tests/fieldgroup/AbstractBasicCrud.java b/uitest/src/com/vaadin/tests/fieldgroup/AbstractBasicCrud.java index c88047e414..0405ea2e10 100644 --- a/uitest/src/com/vaadin/tests/fieldgroup/AbstractBasicCrud.java +++ b/uitest/src/com/vaadin/tests/fieldgroup/AbstractBasicCrud.java @@ -128,6 +128,19 @@ public abstract class AbstractBasicCrud extends AbstractTestUIWithLog { gender.setNullRepresentation(""); age.setNullRepresentation(""); address_country.setNullRepresentation(""); + + // Last name editing is disabled through property readonly. + // Postal code editing is disabled through disabling field. + /* + * Currently only sets the initial state because of + * https://dev.vaadin.com/ticket/17847 + * + * Must set lastName state initially as BeanFieldGroup can't tell it + * should be read-only before setting an item data source + */ + lastName.setReadOnly(true); + address_postalCode.setEnabled(false); + birthDate.setNullRepresentation(""); age.addValidator(new IntegerRangeValidator( @@ -184,7 +197,21 @@ public abstract class AbstractBasicCrud extends AbstractTestUIWithLog { protected Button cancel = new Button("Cancel"); protected BeanFieldGroup<ComplexPerson> fieldGroup = new BeanFieldGroup<ComplexPerson>( - ComplexPerson.class); + ComplexPerson.class) { + @Override + protected void configureField(com.vaadin.ui.Field<?> field) { + super.configureField(field); + if (field.getCaption().equals("Postal code")) { + // Last name editing is disabled through property. + // Postal code editing is disabled through field. + /* + * This is needed because of + * https://dev.vaadin.com/ticket/17847 + */ + field.setEnabled(false); + } + }; + }; public AbstractForm() { super(5, 1); diff --git a/uitest/src/com/vaadin/tests/fieldgroup/BasicCrudGridTest.java b/uitest/src/com/vaadin/tests/fieldgroup/BasicCrudGridTest.java new file mode 100644 index 0000000000..12bccdd065 --- /dev/null +++ b/uitest/src/com/vaadin/tests/fieldgroup/BasicCrudGridTest.java @@ -0,0 +1,69 @@ +/* + * Copyright 2000-2014 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.fieldgroup; + +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; + +import com.vaadin.testbench.AbstractHasTestBenchCommandExecutor; +import com.vaadin.testbench.elements.AbstractComponentElement; +import com.vaadin.testbench.elements.GridElement; +import com.vaadin.testbench.elements.TextFieldElement; +import com.vaadin.tests.tb3.SingleBrowserTestPhantomJS2; + +public class BasicCrudGridTest extends SingleBrowserTestPhantomJS2 { + + @Test + public void fieldsInitiallyEmpty() { + openTestURL(); + List<TextFieldElement> textFields = getFieldsLayout().$( + TextFieldElement.class).all(); + + for (TextFieldElement e : textFields) { + Assert.assertEquals("TextField should be empty", "", e.getValue()); + } + } + + private AbstractHasTestBenchCommandExecutor getFieldsLayout() { + return $(AbstractComponentElement.class).id("form"); + } + + @Test + public void fieldsClearedOnDeselect() { + openTestURL(); + + // Select row + $(GridElement.class).first().getCell(2, 2).click(); + + List<TextFieldElement> textFields = getFieldsLayout().$( + TextFieldElement.class).all(); + + for (TextFieldElement e : textFields) { + Assert.assertNotEquals("TextField should not be empty", "", + e.getValue()); + } + + // Deselect row + $(GridElement.class).first().getCell(2, 2).click(); + + for (TextFieldElement e : textFields) { + Assert.assertEquals("TextField should be empty", "", e.getValue()); + } + + } +} diff --git a/uitest/src/com/vaadin/tests/fieldgroup/ComplexPerson.java b/uitest/src/com/vaadin/tests/fieldgroup/ComplexPerson.java index 2fb7c2ac04..bb4fe89575 100644 --- a/uitest/src/com/vaadin/tests/fieldgroup/ComplexPerson.java +++ b/uitest/src/com/vaadin/tests/fieldgroup/ComplexPerson.java @@ -29,10 +29,6 @@ public class ComplexPerson { return lastName; } - public void setLastName(String lastName) { - this.lastName = lastName; - } - public Integer getAge() { return age; } @@ -97,7 +93,7 @@ public class ComplexPerson { public static ComplexPerson create(Random r) { ComplexPerson cp = new ComplexPerson(); cp.setFirstName(TestDataGenerator.getFirstName(r)); - cp.setLastName(TestDataGenerator.getLastName(r)); + cp.lastName = TestDataGenerator.getLastName(r); cp.setAlive(r.nextBoolean()); cp.setBirthDate(TestDataGenerator.getBirthDate(r)); cp.setAge((int) ((new Date(2014 - 1900, 1, 1).getTime() - cp diff --git a/uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java b/uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java index ddf90b080b..7b77aaf817 100644 --- a/uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java +++ b/uitest/src/com/vaadin/tests/tb3/AbstractTB3Test.java @@ -26,7 +26,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; -import java.util.NoSuchElementException; import java.util.Set; import java.util.logging.Level; @@ -40,9 +39,12 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.runner.RunWith; import org.openqa.selenium.By; +import org.openqa.selenium.Dimension; import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.interactions.HasInputDevices; import org.openqa.selenium.interactions.Keyboard; import org.openqa.selenium.interactions.Mouse; @@ -976,4 +978,64 @@ public abstract class AbstractTB3Test extends ParallelTest { } }); } + + /** + * Selects a menu item. By default, this will click on the menu item. + * + * @param menuCaption + * caption of the menu item + */ + protected void selectMenu(String menuCaption) { + selectMenu(menuCaption, true); + } + + /** + * Selects a menu item. + * + * @param menuCaption + * caption of the menu item + * @param click + * <code>true</code> if should click the menu item; + * <code>false</code> if not + */ + protected void selectMenu(String menuCaption, boolean click) { + WebElement menuElement = getMenuElement(menuCaption); + Dimension size = menuElement.getSize(); + new Actions(getDriver()).moveToElement(menuElement, size.width - 10, + size.height / 2).perform(); + if (click) { + new Actions(getDriver()).click().perform(); + } + } + + /** + * Finds the menu item from the DOM based on menu item caption. + * + * @param menuCaption + * caption of the menu item + * @return the found menu item + * @throws NoSuchElementException + * if menu item is not found + */ + protected WebElement getMenuElement(String menuCaption) + throws NoSuchElementException { + return getDriver().findElement( + By.xpath("//span[text() = '" + menuCaption + "']")); + } + + /** + * Selects a submenu described by a path of menus from the first MenuBar in + * the UI. + * + * @param menuCaptions + * array of menu captions + */ + protected void selectMenuPath(String... menuCaptions) { + selectMenu(menuCaptions[0], true); + for (int i = 1; i < menuCaptions.length - 1; i++) { + selectMenu(menuCaptions[i]); + new Actions(getDriver()).moveByOffset(40, 0).build().perform(); + } + selectMenu(menuCaptions[menuCaptions.length - 1], true); + } } diff --git a/uitest/src/com/vaadin/tests/tb3/SingleBrowserTestPhantomJS2.java b/uitest/src/com/vaadin/tests/tb3/SingleBrowserTestPhantomJS2.java new file mode 100644 index 0000000000..a5afe3afce --- /dev/null +++ b/uitest/src/com/vaadin/tests/tb3/SingleBrowserTestPhantomJS2.java @@ -0,0 +1,33 @@ +/* + * Copyright 2000-2014 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.tb3; + +import java.util.Collections; +import java.util.List; + +import org.openqa.selenium.remote.DesiredCapabilities; + +import com.vaadin.testbench.parallel.Browser; + +public abstract class SingleBrowserTestPhantomJS2 extends + PrivateTB3Configuration { + @Override + public List<DesiredCapabilities> getBrowsersToTest() { + DesiredCapabilities p2 = Browser.PHANTOMJS.getDesiredCapabilities(); + p2.setVersion("2"); + return Collections.singletonList(p2); + } +} diff --git a/uitest/src/com/vaadin/tests/themes/base/DisabledMenuBarItem.java b/uitest/src/com/vaadin/tests/themes/base/DisabledMenuBarItem.java index 825f267ad3..16a822789a 100644 --- a/uitest/src/com/vaadin/tests/themes/base/DisabledMenuBarItem.java +++ b/uitest/src/com/vaadin/tests/themes/base/DisabledMenuBarItem.java @@ -12,7 +12,7 @@ public class DisabledMenuBarItem extends AbstractTestUI { MenuBar.MenuItem item = menubar.addItem("Item", null); item.setEnabled(false); - item.setIcon(new ThemeResource("just_a_placeholder.png")); + item.setIcon(new ThemeResource("common/icons/error.png")); addComponent(menubar); } diff --git a/uitest/src/com/vaadin/tests/themes/base/DisabledMenuBarItemTest.java b/uitest/src/com/vaadin/tests/themes/base/DisabledMenuBarItemTest.java index 0a10a7f38b..bec28d7929 100644 --- a/uitest/src/com/vaadin/tests/themes/base/DisabledMenuBarItemTest.java +++ b/uitest/src/com/vaadin/tests/themes/base/DisabledMenuBarItemTest.java @@ -3,6 +3,8 @@ package com.vaadin.tests.themes.base; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; +import java.io.IOException; + import org.junit.Test; import org.openqa.selenium.WebElement; @@ -13,7 +15,7 @@ import com.vaadin.tests.tb3.MultiBrowserTest; public class DisabledMenuBarItemTest extends MultiBrowserTest { @Test - public void disabledMenuItemShouldHaveOpacity() { + public void disabledMenuItemShouldHaveOpacity() throws IOException { openTestURL(); WebElement element = driver.findElement(By @@ -23,8 +25,9 @@ public class DisabledMenuBarItemTest extends MultiBrowserTest { if (browserIsIE8or9()) { assertThat(element.getCssValue("filter"), is("alpha(opacity=50)")); - } + + compareScreen("transparent"); } private boolean browserIsIE8or9() { |