/* * 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.datefield; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.Keys; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import com.vaadin.testbench.By; import com.vaadin.testbench.elements.ButtonElement; import com.vaadin.testbench.elements.DateFieldElement; import com.vaadin.testbench.parallel.BrowserUtil; import com.vaadin.tests.tb3.MultiBrowserTest; /** * Tests contents and functionality of PopupDateField's popup. * * @author Vaadin Ltd */ public class PopupDateFieldExtendedRangeTest extends MultiBrowserTest { @Override @Before public void setup() throws Exception { super.setup(); openTestURL(); } @Test public void testFirstDateField() { List<DateFieldElement> dateFields = $(DateFieldElement.class).all(); assertEquals("unexpected amount of datefields", 3, dateFields.size()); DateFieldElement dateField = dateFields.get(0); // open the popup dateField.findElement(By.tagName("button")).click(); assertTrue("popup not found when there should be one", isElementPresent(By.className("v-datefield-popup"))); // verify contents WebElement popup = findElement(By.className("v-datefield-popup")); assertEquals("unexpected month", "tammikuu 2011", popup .findElements(By.className("v-datefield-calendarpanel-month")) .get(1).getText()); List<WebElement> headerElements = popup .findElement(By.className("v-datefield-calendarpanel-weekdays")) .findElements(By.tagName("td")); List<WebElement> weekdays = new ArrayList<>(); for (WebElement headerElement : headerElements) { if ("columnheader".equals(headerElement.getAttribute("role"))) { weekdays.add(headerElement); } } assertEquals("unexpected weekday count", 7, weekdays.size()); assertEquals("unexpected first day of week", "MA", weekdays.get(0).getText()); assertEquals("unexpected weeknumber count", 0, popup.findElements( By.className("v-datefield-calendarpanel-weeknumber")) .size()); assertEquals("unexpected selection", "1", popup.findElement( By.className("v-datefield-calendarpanel-day-selected")) .getText()); assertEquals("unexpected focus", "1", popup.findElement( By.className("v-datefield-calendarpanel-day-focused")) .getText()); List<WebElement> days = popup .findElements(By.className("v-datefield-calendarpanel-day")); assertEquals("unexpected day count", 42, days.size()); assertEquals("unexpected day content", "27", days.get(0).getText()); assertEquals("unexpected day content", "4", days.get(8).getText()); assertEquals("unexpected day content", "21", days.get(25).getText()); assertEquals("unexpected day content", "6", days.get(41).getText()); // move to the previous month popup.findElement(By.className("v-datefield-calendarpanel-prevmonth")) .findElement(By.tagName("button")).click(); // verify contents assertEquals("unexpected month", "joulukuu 2010", popup .findElements(By.className("v-datefield-calendarpanel-month")) .get(1).getText()); assertEquals("unexpected selection", "1", popup.findElement( By.className("v-datefield-calendarpanel-day-selected")) .getText()); assertEquals("unexpected focus", 0, popup.findElements( By.className("v-datefield-calendarpanel-day-focused")) .size()); days = popup .findElements(By.className("v-datefield-calendarpanel-day")); assertEquals("unexpected day count", 42, days.size()); assertEquals("unexpected day content", "29", days.get(0).getText()); assertEquals("unexpected day content", "7", days.get(8).getText()); assertEquals("unexpected day content", "24", days.get(25).getText()); assertEquals("unexpected day content", "9", days.get(41).getText()); // move to the previous year popup.findElement(By.className("v-datefield-calendarpanel-prevyear")) .findElement(By.tagName("button")).click(); // verify contents assertEquals("unexpected month", "joulukuu 2009", popup .findElements(By.className("v-datefield-calendarpanel-month")) .get(1).getText()); assertEquals("unexpected selection", 0, popup.findElements( By.className("v-datefield-calendarpanel-day-selected")) .size()); assertEquals("unexpected focus", 0, popup.findElements( By.className("v-datefield-calendarpanel-day-focused")) .size()); days = popup .findElements(By.className("v-datefield-calendarpanel-day")); assertEquals("unexpected day count", 42, days.size()); assertEquals("unexpected day content", "30", days.get(0).getText()); assertEquals("unexpected day content", "8", days.get(8).getText()); assertEquals("unexpected day content", "25", days.get(25).getText()); assertEquals("unexpected day content", "10", days.get(41).getText()); // close the popup by clicking the button again dateField.findElement(By.tagName("button")).click(); assertFalse("popup found when there should be none", isElementPresent(By.className("v-datefield-popup"))); } @Test public void testSecondDateField() throws InterruptedException { DateFieldElement dateField = $(DateFieldElement.class).all().get(1); ButtonElement button = $(ButtonElement.class).first(); // change the date button.click(); sleep(100); // open the popup dateField.findElement(By.tagName("button")).click(); assertTrue("popup not found when there should be one", isElementPresent(By.className("v-datefield-popup"))); // verify contents WebElement popup = findElement(By.className("v-datefield-popup")); assertEquals("unexpected month", "February 2010", popup .findElements(By.className("v-datefield-calendarpanel-month")) .get(1).getText()); List<WebElement> headerElements = popup .findElement(By.className("v-datefield-calendarpanel-weekdays")) .findElements(By.tagName("td")); List<WebElement> weekdays = new ArrayList<>(); for (WebElement headerElement : headerElements) { if ("columnheader".equals(headerElement.getAttribute("role"))) { weekdays.add(headerElement); } } assertEquals("unexpected weekday count", 7, weekdays.size()); assertEquals("unexpected first day of week", "SUN", weekdays.get(0).getText()); assertEquals("unexpected weeknumber count", 0, popup.findElements( By.className("v-datefield-calendarpanel-weeknumber")) .size()); assertEquals("unexpected selection", "16", popup.findElement( By.className("v-datefield-calendarpanel-day-selected")) .getText()); assertEquals("unexpected focus", "16", popup.findElement( By.className("v-datefield-calendarpanel-day-focused")) .getText()); List<WebElement> days = popup .findElements(By.className("v-datefield-calendarpanel-day")); assertEquals("unexpected day count", 42, days.size()); assertEquals("unexpected day content", "31", days.get(0).getText()); assertEquals("unexpected day content", "8", days.get(8).getText()); assertEquals("unexpected day content", "25", days.get(25).getText()); assertEquals("unexpected day content", "13", days.get(41).getText()); // navigate down WebElement popupBody = popup .findElement(By.className("v-datefield-calendarpanel")); popupBody.sendKeys(Keys.ARROW_DOWN); // ensure the focus changed assertEquals("unexpected focus", "23", popup.findElement( By.className("v-datefield-calendarpanel-day-focused")) .getText()); // navigate down popupBody.sendKeys(Keys.ARROW_DOWN); // verify contents assertEquals("unexpected month", "March 2010", popup .findElements(By.className("v-datefield-calendarpanel-month")) .get(1).getText()); assertEquals("unexpected selection", 0, popup.findElements( By.className("v-datefield-calendarpanel-day-selected")) .size()); assertEquals("unexpected focus", "2", popup.findElement( By.className("v-datefield-calendarpanel-day-focused")) .getText()); days = popup .findElements(By.className("v-datefield-calendarpanel-day")); assertEquals("unexpected day count", 42, days.size()); assertEquals("unexpected day content", "28", days.get(0).getText()); assertEquals("unexpected day content", "8", days.get(8).getText()); assertEquals("unexpected day content", "25", days.get(25).getText()); assertEquals("unexpected day content", "10", days.get(41).getText()); // navigate left popupBody = popup .findElement(By.className("v-datefield-calendarpanel")); popupBody.sendKeys(Keys.ARROW_LEFT); // ensure the focus changed assertEquals("unexpected focus", "1", popup.findElement( By.className("v-datefield-calendarpanel-day-focused")) .getText()); // navigate left popupBody.sendKeys(Keys.ARROW_LEFT); // verify contents assertEquals("unexpected month", "February 2010", popup .findElements(By.className("v-datefield-calendarpanel-month")) .get(1).getText()); assertEquals("unexpected selection", "16", popup.findElement( By.className("v-datefield-calendarpanel-day-selected")) .getText()); assertEquals("unexpected focus", "28", popup.findElement( By.className("v-datefield-calendarpanel-day-focused")) .getText()); days = popup .findElements(By.className("v-datefield-calendarpanel-day")); assertEquals("unexpected day count", 42, days.size()); assertEquals("unexpected day content", "31", days.get(0).getText()); assertEquals("unexpected day content", "8", days.get(8).getText()); assertEquals("unexpected day content", "25", days.get(25).getText()); assertEquals("unexpected day content", "13", days.get(41).getText()); // close the popup by clicking the input field dateField.findElement(By.tagName("input")).click(); assertFalse("popup found when there should be none", isElementPresent(By.className("v-datefield-popup"))); } @Test public void testThirdDateField() throws InterruptedException { DateFieldElement dateField = $(DateFieldElement.class).all().get(2); ButtonElement button = $(ButtonElement.class).first(); // change the date button.click(); sleep(100); // open the popup dateField.findElement(By.tagName("button")).click(); assertTrue("popup not found when there should be one", isElementPresent(By.className("v-datefield-popup"))); // verify contents WebElement popup = findElement(By.className("v-datefield-popup")); assertEquals("unexpected month", "helmikuu 2010", popup .findElements(By.className("v-datefield-calendarpanel-month")) .get(1).getText()); List<WebElement> headerElements = popup .findElement(By.className("v-datefield-calendarpanel-weekdays")) .findElements(By.tagName("td")); List<WebElement> weekdays = new ArrayList<>(); for (WebElement headerElement : headerElements) { if ("columnheader".equals(headerElement.getAttribute("role"))) { weekdays.add(headerElement); } } assertEquals("unexpected weekday count", 7, weekdays.size()); assertEquals("unexpected first day of week", "MA", weekdays.get(0).getText()); List<WebElement> weeknumbers = popup.findElements( By.className("v-datefield-calendarpanel-weeknumber")); assertEquals("unexpected weeknumber count", 6, weeknumbers.size()); assertEquals("unexpected weeknumber content", "5", weeknumbers.get(0).getText()); assertEquals("unexpected weeknumber content", "10", weeknumbers.get(5).getText()); assertEquals("unexpected selection", "16", popup.findElement( By.className("v-datefield-calendarpanel-day-selected")) .getText()); assertEquals("unexpected focus", "16", popup.findElement( By.className("v-datefield-calendarpanel-day-focused")) .getText()); List<WebElement> days = popup .findElements(By.className("v-datefield-calendarpanel-day")); assertEquals("unexpected day count", 42, days.size()); assertEquals("unexpected day content", "1", days.get(0).getText()); assertEquals("unexpected day content", "9", days.get(8).getText()); assertEquals("unexpected day content", "26", days.get(25).getText()); assertEquals("unexpected day content", "14", days.get(41).getText()); // navigate to previous month WebElement popupBody = popup .findElement(By.className("v-datefield-calendarpanel")); new Actions(driver).keyDown(Keys.SHIFT).perform(); popupBody.sendKeys(Keys.ARROW_LEFT); new Actions(driver).keyUp(Keys.SHIFT).perform(); // TODO: remove this once #14406 has been fixed if (BrowserUtil.isIE(getDesiredCapabilities()) || BrowserUtil.isFirefox(getDesiredCapabilities())) { popup.findElement( By.className("v-datefield-calendarpanel-prevmonth")) .findElement(By.tagName("button")).click(); } // verify contents assertEquals("unexpected month", "tammikuu 2010", popup .findElements(By.className("v-datefield-calendarpanel-month")) .get(1).getText()); weeknumbers = popup.findElements( By.className("v-datefield-calendarpanel-weeknumber")); assertEquals("unexpected weeknumber count", 6, weeknumbers.size()); assertEquals("unexpected weeknumber content", "53", weeknumbers.get(0).getText()); assertEquals("unexpected weeknumber content", "5", weeknumbers.get(5).getText()); assertEquals("unexpected selection", 0, popup.findElements( By.className("v-datefield-calendarpanel-day-selected")) .size()); // TODO: remove this check once #14406 has been fixed -- clicking the // button instead of navigating with arrow keys steals the focus if (!BrowserUtil.isIE(getDesiredCapabilities()) && !BrowserUtil.isFirefox(getDesiredCapabilities())) { assertEquals("unexpected focus", "16", popup.findElement(By .className("v-datefield-calendarpanel-day-focused")) .getText()); } days = popup .findElements(By.className("v-datefield-calendarpanel-day")); assertEquals("unexpected day count", 42, days.size()); assertEquals("unexpected day content", "28", days.get(0).getText()); assertEquals("unexpected day content", "5", days.get(8).getText()); assertEquals("unexpected day content", "22", days.get(25).getText()); assertEquals("unexpected day content", "7", days.get(41).getText()); // navigate to previous year new Actions(driver).keyDown(Keys.SHIFT).perform(); popupBody.sendKeys(Keys.ARROW_DOWN); new Actions(driver).keyUp(Keys.SHIFT).perform(); // TODO: remove this once #14406 has been fixed popup.findElement(By.className("v-datefield-calendarpanel-prevyear")) .findElement(By.tagName("button")).click(); // verify contents assertEquals("unexpected month", "tammikuu 2009", popup .findElements(By.className("v-datefield-calendarpanel-month")) .get(1).getText()); weeknumbers = popup.findElements( By.className("v-datefield-calendarpanel-weeknumber")); assertEquals("unexpected weeknumber count", 6, weeknumbers.size()); assertEquals("unexpected weeknumber content", "1", weeknumbers.get(0).getText()); assertEquals("unexpected weeknumber content", "6", weeknumbers.get(5).getText()); assertEquals("unexpected selection", 0, popup.findElements( By.className("v-datefield-calendarpanel-day-selected")) .size()); // TODO: remove this check once #14406 has been fixed -- clicking the // button instead of navigating with arrow keys steals the focus if (false) { assertEquals("unexpected focus", "16", popup.findElement(By .className("v-datefield-calendarpanel-day-focused")) .getText()); } days = popup .findElements(By.className("v-datefield-calendarpanel-day")); assertEquals("unexpected day count", 42, days.size()); assertEquals("unexpected day content", "29", days.get(0).getText()); assertEquals("unexpected day content", "6", days.get(8).getText()); assertEquals("unexpected day content", "23", days.get(25).getText()); assertEquals("unexpected day content", "8", days.get(41).getText()); // close the popup by clicking an unrelated element button.click(); assertFalse("popup found when there should be none", isElementPresent(By.className("v-datefield-popup"))); } }