/* * 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 com.vaadin.tests.components.datefield.DateFieldChangeResolution.BUTTON_BASE_ID; import static com.vaadin.tests.components.datefield.DateFieldChangeResolution.DATEFIELD_ID; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Test; import org.openqa.selenium.Keys; import org.openqa.selenium.WebElement; import com.vaadin.shared.ui.datefield.DateTimeResolution; import com.vaadin.testbench.By; import com.vaadin.tests.tb3.MultiBrowserTest; public class DateTimeFieldChangeResolutionTest extends MultiBrowserTest { private WebElement dateFieldButton, textField; private WebElement resolutionSecond, resolutionMinute, resolutionHour, resolutionDay, resolutionMonth, resolutionYear; @Test public void changeResolutionBetweenYearAndMonth() throws Exception { initialize(); click(resolutionMonth); checkHeaderAndBody(DateTimeResolution.MONTH, true); click(resolutionYear); checkHeaderAndBody(DateTimeResolution.YEAR, true); } @Test public void changeResolutionBetweenYearAndSecond() throws Exception { initialize(); click(resolutionSecond); checkHeaderAndBody(DateTimeResolution.SECOND, true); click(resolutionYear); checkHeaderAndBody(DateTimeResolution.YEAR, true); } @Test public void changeResolutionToDayThenMonth() throws Exception { initialize(); checkHeaderAndBody(DateTimeResolution.YEAR, true); // check the initial // state click(resolutionDay); checkHeaderAndBody(DateTimeResolution.DAY, true); click(resolutionMonth); checkHeaderAndBody(DateTimeResolution.MONTH, true); } @Test public void setDateAndChangeResolution() throws Exception { initialize(); // Set the date to previous month. click(resolutionMonth); openPopupDateField(); click(driver.findElement(By.className("v-button-prevmonth"))); closePopupDateField(); assertFalse( "The text field of the calendar should not be empty after selecting a date", textField.getAttribute("value").isEmpty()); // Change resolutions and check that the selected date is not lost and // that the calendar has the correct resolution. click(resolutionHour); checkHeaderAndBody(DateTimeResolution.HOUR, false); click(resolutionYear); checkHeaderAndBody(DateTimeResolution.YEAR, false); click(resolutionMinute); checkHeaderAndBody(DateTimeResolution.MINUTE, false); } private void initialize() { openTestURL(); WebElement dateField = driver.findElement(By.id(DATEFIELD_ID)); dateFieldButton = dateField .findElement(By.className("v-datefield-button")); textField = dateField .findElement(By.className("v-datefield-textfield")); resolutionSecond = driver.findElement(By.id(BUTTON_BASE_ID + "second")); resolutionMinute = driver.findElement(By.id(BUTTON_BASE_ID + "minute")); resolutionHour = driver.findElement(By.id(BUTTON_BASE_ID + "hour")); resolutionDay = driver.findElement(By.id(BUTTON_BASE_ID + "day")); resolutionMonth = driver.findElement(By.id(BUTTON_BASE_ID + "month")); resolutionYear = driver.findElement(By.id(BUTTON_BASE_ID + "year")); } private void checkHeaderAndBody(DateTimeResolution resolution, boolean textFieldIsEmpty) throws Exception { // Popup date field has all kinds of strange timers on the // client side sleep(100); // Open the popup calendar, perform checks and close the popup. openPopupDateField(); if (resolution.compareTo(DateTimeResolution.MONTH) <= 0) { checkMonthHeader(); } else { checkYearHeader(); } if (resolution.compareTo(DateTimeResolution.DAY) <= 0) { assertTrue( "A calendar with the chosen resolution should have a body", calendarHasBody()); } else { assertFalse( "A calendar with the chosen resolution should not have a body", calendarHasBody()); } if (textFieldIsEmpty) { assertTrue("The text field of the calendar should be empty", textField.getAttribute("value").isEmpty()); } else { assertFalse("The text field of the calendar should not be empty", textField.getAttribute("value").isEmpty()); } closePopupDateField(); } private void checkMonthHeader() { checkHeaderForYear(); checkHeaderForMonth(true); } private void checkYearHeader() { checkHeaderForYear(); checkHeaderForMonth(false); } private boolean calendarHasBody() { return isElementPresent(By.className("v-datefield-calendarpanel-body")); } private void checkHeaderForMonth(boolean buttonsExpected) { // If buttonsExpected is true, check that there are buttons for changing // the month. Otherwise check that there are no such buttons. if (buttonsExpected) { assertTrue( "The calendar should have a button for switching to the previous month", isElementPresent(By.cssSelector( ".v-datefield-calendarpanel-header .v-datefield-calendarpanel-prevmonth .v-button-prevmonth"))); assertTrue( "The calendar should have a button for switching to the next month", isElementPresent(By.cssSelector( ".v-datefield-calendarpanel-header .v-datefield-calendarpanel-nextmonth .v-button-nextmonth"))); } else { assertFalse( "The calendar should not have a button for switching to the previous month", isElementPresent(By.cssSelector( ".v-datefield-calendarpanel-header .v-datefield-calendarpanel-prevmonth .v-button-prevmonth"))); assertFalse( "The calendar should not have a button for switching to the next month", isElementPresent(By.cssSelector( ".v-datefield-calendarpanel-header .v-datefield-calendarpanel-nextmonth .v-button-nextmonth"))); } } private void checkHeaderForYear() { assertTrue( "The calendar should have a button for switching to the previous year", isElementPresent(By.cssSelector( ".v-datefield-calendarpanel-header .v-datefield-calendarpanel-prevyear .v-button-prevyear"))); assertTrue("The calendar header should show the selected year", isElementPresent(By.cssSelector( ".v-datefield-calendarpanel-header .v-datefield-calendarpanel-month"))); assertTrue( "The calendar should have a button for switching to the next year", isElementPresent(By.cssSelector( ".v-datefield-calendarpanel-header .v-datefield-calendarpanel-nextyear .v-button-nextyear"))); } private void click(WebElement element) { testBenchElement(element).click(5, 5); } private void openPopupDateField() { click(dateFieldButton); } private void closePopupDateField() { WebElement element = driver .findElement(By.cssSelector(".v-datefield-calendarpanel")); element.sendKeys(Keys.ESCAPE); } }