/* * JBoss, Home of Professional Open Source * Copyright 2010-2016, Red Hat, Inc. and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.richfaces.tests.metamer.ftest.richCalendar; import static org.jboss.arquillian.graphene.Graphene.guardAjax; import static org.richfaces.tests.metamer.ftest.extension.configurator.use.annotation.ValuesFrom.FROM_ENUM; import static org.richfaces.tests.metamer.ftest.extension.configurator.use.annotation.ValuesFrom.FROM_FIELD; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Locale; import javax.faces.event.PhaseId; import org.jboss.arquillian.graphene.Graphene; import org.jboss.arquillian.graphene.condition.element.WebElementConditionFactory; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.openqa.selenium.By; import org.openqa.selenium.Dimension; import org.openqa.selenium.TimeoutException; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Action; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.support.FindBy; import org.richfaces.fragment.calendar.DayPicker; import org.richfaces.fragment.calendar.DayPicker.CalendarDay; import org.richfaces.fragment.calendar.DayPicker.CalendarDay.DayType; import org.richfaces.fragment.calendar.DayPicker.CalendarWeek; import org.richfaces.fragment.calendar.HeaderControls; import org.richfaces.fragment.calendar.PopupCalendar; import org.richfaces.fragment.calendar.PopupCalendar.PopupFooterControls; import org.richfaces.fragment.calendar.PopupCalendar.PopupHeaderControls; import org.richfaces.fragment.calendar.RichFacesAdvancedPopupCalendar.OpenedBy; import org.richfaces.fragment.calendar.TimeEditor; import org.richfaces.fragment.calendar.TimeEditor.SetValueBy; import org.richfaces.fragment.common.Event; import org.richfaces.fragment.common.Locations; import org.richfaces.fragment.common.Utils; import org.richfaces.fragment.message.RichFacesMessage; import org.richfaces.tests.configurator.unstable.annotation.Unstable; import org.richfaces.tests.metamer.ftest.BasicAttributes; import org.richfaces.tests.metamer.ftest.annotations.IssueTracking; import org.richfaces.tests.metamer.ftest.extension.attributes.coverage.annotations.CoversAttributes; import org.richfaces.tests.metamer.ftest.extension.configurator.templates.annotation.Templates; import org.richfaces.tests.metamer.ftest.extension.configurator.use.annotation.UseWithField; import org.richfaces.tests.metamer.ftest.webdriver.MetamerPage; import org.richfaces.tests.metamer.ftest.webdriver.MetamerPage.WaitRequestType; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import com.google.common.collect.Lists; /** * @author <a href="mailto:jstefek@redhat.com">Jiri Stefek</a> */ public class TestCalendarAttributes extends AbstractCalendarTest { private DateTimeFormatter dateTimeFormatter; private BoundaryDatesMode boundaryDatesMode; private Mode mode; private TodayControlMode todayControlMode; private Boolean booleanValue; @FindBy(css = "input[id$=a4jButton]") private WebElement a4jbutton; @FindBy(css = "span[id$=msg]") private RichFacesMessage message; private final Action setTimeAction = new SetTimeAction(); private final Action setCurrentDateWithCalendarsTodayButtonAction = new SetCurrentDateWithCalendarsTodayButtonAction(); private final Action setTodayAndThenClickToNextMonthAction = new SetTodayAndThenClickToNextMonthAction(); private final DateTime firstOfNovember2012 = new DateTime(2012, 11, 1, 12, 0, 0, 0); private enum BoundaryDatesMode { NULL("null"), INACTIVE("inactive"), SCROLL("scroll"), SELECT("select"); private final String value; private BoundaryDatesMode(String value) { this.value = value; } } private enum Mode { AJAX("ajax"), CLIENT("client"), NULL("null"); private final String value; private Mode(String value) { this.value = value; } } private enum TodayControlMode { HIDDEN("hidden"), NULL("null"), SELECT("select"), SCROLL("scroll"); private final String value; private TodayControlMode(String value) { this.value = value; } } @Override public String getComponentTestPagePath() { return "richCalendar/simple.xhtml"; } @BeforeMethod public void initPage() { this.dateTimeFormatter = DateTimeFormat.forPattern(calendarAttributes.get(CalendarAttributes.datePattern)); // should help stabilizing offset tests on Jenkins driver.manage().window().setSize(new Dimension(1280, 960)); } @Test @CoversAttributes("boundaryDatesMode") @UseWithField(field = "boundaryDatesMode", valuesFrom = FROM_ENUM, value = "") @Templates("plain") public void testBoundaryDatesMode() { calendarAttributes.set(CalendarAttributes.boundaryDatesMode, boundaryDatesMode.value); DayPicker dayPicker = popupCalendar.openPopup().getDayPicker(); MetamerPage.waitRequest(popupCalendar, WaitRequestType.XHR).setDateTime(firstOfNovember2012); PopupFooterControls footerControls = popupCalendar.openPopup().getFooterControls(); HeaderControls headerControls = popupCalendar.openPopup().getHeaderControls(); DateTime yearAndMonth; String firstOfNovember2012String = firstOfNovember2012.toString(dateTimeFormatter); switch (boundaryDatesMode) { case INACTIVE: case NULL: try { MetamerPage.waitRequest(dayPicker.getBoundaryDays().get(0), WaitRequestType.NONE).select(); fail("Item should not be selected."); } catch (TimeoutException ex) {// ok } // apply and check, that the date has not changed footerControls = popupCalendar.openPopup().getFooterControls(); MetamerPage.waitRequest(footerControls, WaitRequestType.NONE).applyDate(); assertEquals(popupCalendar.getInput().getStringValue(), firstOfNovember2012String); break; case SCROLL: // scroll to 28th of October 2012 try { MetamerPage.waitRequest(dayPicker.getBoundaryDays().get(0), WaitRequestType.NONE).select(); fail("Item should not be selected."); } catch (TimeoutException ex) {// ok } yearAndMonth = headerControls.getYearAndMonth(); assertEquals(yearAndMonth.getYear(), 2012); assertEquals(yearAndMonth.getMonthOfYear(), 10); // apply and check, that the date has not changed footerControls = popupCalendar.openPopup().getFooterControls(); MetamerPage.waitRequest(footerControls, WaitRequestType.NONE).applyDate(); assertEquals(popupCalendar.getInput().getStringValue(), firstOfNovember2012String); break; case SELECT: // select 28th of October 2012 CalendarDay day = dayPicker.getBoundaryDays().get(0); MetamerPage.waitRequest(day.getDayElement(), WaitRequestType.NONE).click(); yearAndMonth = headerControls.getYearAndMonth(); assertEquals(yearAndMonth.getYear(), 2012); assertEquals(yearAndMonth.getMonthOfYear(), 10); MetamerPage.waitRequest(footerControls, WaitRequestType.XHR).applyDate(); DateTime parsedDateTime = dateTimeFormatter.parseDateTime(popupCalendar.getInput().getStringValue()); assertEquals(parsedDateTime.getYear(), 2012); assertEquals(parsedDateTime.getMonthOfYear(), 10); assertEquals(parsedDateTime.getDayOfMonth(), 28); break; } } @Test @CoversAttributes("buttonClass") @Templates(value = "plain") public void testButtonClass() { testStyleClass(popupCalendar.getPopupButtonElement(), BasicAttributes.buttonClass); } @Test @CoversAttributes("buttonLabel") @Templates(value = "plain") public void testButtonClassLabel() { calendarAttributes.set(CalendarAttributes.buttonLabel, "label"); testStyleClass(popupCalendar.getPopupButtonElement(), BasicAttributes.buttonClass); } @Test @CoversAttributes("buttonIcon") @Templates(value = "plain") public void testButtonClassIcon() { calendarAttributes.set(CalendarAttributes.buttonIcon, "heart"); testStyleClass(popupCalendar.getPopupButtonElement(), BasicAttributes.buttonClass); } @Test @CoversAttributes("buttonIcon") @Templates(value = "plain") public void testButtonIcon() { calendarAttributes.set(CalendarAttributes.buttonIcon, "star"); String src = popupCalendar.getPopupButtonElement().getAttribute("src"); assertTrue(src.contains("star.png"), "Calendar's icon was not updated."); calendarAttributes.set(CalendarAttributes.buttonIcon, "null"); src = popupCalendar.getPopupButtonElement().getAttribute("src"); assertTrue(src.contains("calendarIcon.png"), "Calendar's icon was not updated."); } @Test @CoversAttributes("buttonDisabledIcon") @IssueTracking("https://issues.jboss.org/browse/RF-10255") @Templates(value = "plain") public void testButtonDisabledIcon() { attsSetter() .setAttribute(CalendarAttributes.buttonDisabledIcon).toValue("heart") .setAttribute(CalendarAttributes.disabled).toValue(true) .asSingleAction().perform(); String src = popupCalendar.getPopupButtonElement().getAttribute("src"); assertTrue(src.endsWith("heart.png"), "Calendar's icon was not updated."); calendarAttributes.set(CalendarAttributes.buttonDisabledIcon, "null"); src = popupCalendar.getPopupButtonElement().getAttribute("src"); assertTrue(src.contains("disabledCalendarIcon.png"), "Calendar's icon was not updated."); } @Test @CoversAttributes("buttonLabel") @Templates("plain") public void testButtonLabel() { calendarAttributes.set(CalendarAttributes.buttonLabel, "label"); assertTrue(new WebElementConditionFactory(popupCalendar.getPopupButtonElement()).isVisible().apply(driver), "Button should be displayed."); assertEquals(popupCalendar.getPopupButtonElement().getText(), "label", "Label of the button."); assertNotEquals(popupCalendar.getPopupButtonElement().getTagName(), "img", "Image should not be displayed."); calendarAttributes.set(CalendarAttributes.buttonIcon, "star"); assertNotEquals(popupCalendar.getPopupButtonElement().getTagName(), "img", "Image should not be displayed."); } @Test @CoversAttributes("converterMessage") @IssueTracking("https://issues.jboss.org/browse/RF-11313") public void testConverterMessage() { String errorMsg = "conversion error"; attsSetter() .setAttribute(CalendarAttributes.enableManualInput).toValue(true) .setAttribute(CalendarAttributes.converterMessage).toValue(errorMsg) .asSingleAction().perform(); popupCalendar.getInput().sendKeys("RF 4"); submitWithA4jSubmitBtn(); message.advanced().waitUntilMessageIsVisible().perform(); assertEquals(message.getDetail(), errorMsg); } @Test @CoversAttributes("datePattern") public void testDatePattern() { String pattern = "hh:mm:ss a MMMM d, yyyy"; calendarAttributes.set(CalendarAttributes.datePattern, pattern); setCurrentDateWithCalendarsTodayButtonAction.perform(); String calendarInputText = popupCalendar.getInput().getStringValue(); dateTimeFormatter = DateTimeFormat.forPattern(pattern); try { DateTime dt = dateTimeFormatter.parseDateTime(calendarInputText); assertEquals(dt.getDayOfMonth(), todayMidday.getDayOfMonth()); assertEquals(dt.getMonthOfYear(), todayMidday.getMonthOfYear()); assertEquals(dt.getYear(), todayMidday.getYear()); } catch (IllegalArgumentException ex) { fail(ex.getMessage()); } } @Test @CoversAttributes("dayClassFunction") @Templates(value = "plain") public void testDayClassFunction() { int tuesdayDay = 3; calendarAttributes.set(CalendarAttributes.dayClassFunction, "yellowTuesdays"); // switch to next month to refresh classes popupCalendar.openPopup().getHeaderControls().nextMonth(); DayPicker dayPicker = popupCalendar.openPopup().getDayPicker(); List<CalendarDay> tuesdays = filterOutBoundaryDays(Lists.newArrayList(dayPicker.getSpecificDays(tuesdayDay))); for (CalendarDay tuesday : tuesdays) { assertTrue(tuesday.containsStyleClass("yellowDay"), "All tuesdays should be yellow."); } calendarAttributes.set(CalendarAttributes.dayClassFunction, "null"); dayPicker = popupCalendar.openPopup().getDayPicker(); tuesdays = filterOutBoundaryDays(Lists.newArrayList(dayPicker.getSpecificDays(tuesdayDay))); for (CalendarDay tuesday : tuesdays) { assertFalse(tuesday.containsStyleClass("yellowDay"), "All tuesdays should not be yellow."); } } @Test @CoversAttributes("dayDisableFunction") public void testDayDisableFunction() { calendarAttributes.set(CalendarAttributes.dayDisableFunction, "disableTuesdays"); int tuesdayDay = 3; // switch to next month to refresh classes popupCalendar.openPopup().getHeaderControls().nextMonth(); DayPicker dayPicker = popupCalendar.openPopup().getDayPicker(); List<CalendarDay> tuesdays = filterOutBoundaryDays(Lists.newArrayList(dayPicker.getSpecificDays(tuesdayDay))); for (CalendarDay tuesday : tuesdays) { assertFalse(tuesday.is(DayType.selectableDay), "All tuesdays should not be enabled."); } calendarAttributes.set(CalendarAttributes.dayDisableFunction, "null"); dayPicker = popupCalendar.openPopup().getDayPicker(); tuesdays = filterOutBoundaryDays(Lists.newArrayList(dayPicker.getSpecificDays(tuesdayDay))); for (CalendarDay tuesday : tuesdays) { assertTrue(tuesday.is(DayType.selectableDay), "All tuesdays should be enabled."); } } @Test @CoversAttributes("direction") @Templates("plain") @UseWithField(field = "positioning", valuesFrom = FROM_ENUM, value = "") public void testDirection() { testDirection(new ShowElementAndReturnAction() { @Override public WebElement perform() { return popupCalendar.openPopup().getRoot(); } }); } @Test @CoversAttributes("defaultLabel") @Templates("plain") public void testDefaultLabel() { String defaultLabel = "RichFaces 4"; calendarAttributes.set(CalendarAttributes.defaultLabel, defaultLabel); assertEquals(popupCalendar.getInput().getStringValue(), defaultLabel); } @Test @CoversAttributes("defaultTime") @IssueTracking({ "https://issues.jboss.org/browse/RF-9837", "https://issues.jboss.org/browse/RF-10085" }) public void testDefaultTime() { final String t = "06:06"; calendarAttributes.set(CalendarAttributes.defaultTime, t); setCurrentDateWithCalendarsTodayButtonAction.perform(); String text = popupCalendar.openPopup().getFooterControls().getTimeEditorOpenerElement().getText(); assertTrue(text.equals(t), "Default time"); // another check in time editor TimeEditor timeEditor = popupCalendar.openPopup().getFooterControls().openTimeEditor(); DateTime setTime = timeEditor.getTime(); DateTime reference = todayMidday.withHourOfDay(6).withMinuteOfHour(6); assertEquals(setTime.getHourOfDay(), reference.getHourOfDay()); assertEquals(setTime.getMinuteOfHour(), reference.getMinuteOfHour()); } @Test @CoversAttributes("disabled") public void testDisabled() { calendarAttributes.set(CalendarAttributes.disabled, Boolean.TRUE); assertEquals(popupCalendar.getInput().advanced().getInputElement().getAttribute("disabled"), "true"); // Popup should not be displayed int catched = 0; try { Graphene.guardNoRequest(popupCalendar).openPopup(OpenedBy.INPUT_CLICKING); } catch (TimeoutException ex) { catched++; } try { Graphene.guardNoRequest(popupCalendar).openPopup(OpenedBy.OPEN_BUTTON_CLICKING); } catch (TimeoutException ex) { catched++; } assertEquals(catched, 2); } @Test @CoversAttributes("enableManualInput") @Templates("plain") public void testEnableManualInput() { assertEquals(popupCalendar.getInput().advanced().getInputElement().getAttribute("readonly"), "true"); calendarAttributes.set(CalendarAttributes.enableManualInput, Boolean.TRUE); assertTrue(new WebElementConditionFactory(popupCalendar.getInput().advanced().getInputElement()).attribute("readonly") .not().isPresent().apply(driver), "Readonly attribute of input should not be defined."); } @Test @CoversAttributes("firstWeekDay") @IssueTracking("https://issues.jboss.org/browse/RF-9646") public void testFirstWeekDay() { DayPicker dayPicker = popupCalendar.openPopup().getDayPicker(); List<String> weekDays = Arrays.asList("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); assertEquals(dayPicker.getWeekDayShortNames(), weekDays); // wrong input, nothing changes, RF-9646 calendarAttributes.set(CalendarAttributes.firstWeekDay, 7); dayPicker = popupCalendar.openPopup().getDayPicker(); assertEquals(dayPicker.getWeekDayShortNames(), weekDays); calendarAttributes.set(CalendarAttributes.firstWeekDay, 1); dayPicker = popupCalendar.openPopup().getDayPicker(); Collections.rotate(weekDays, -1); assertEquals(dayPicker.getWeekDayShortNames(), weekDays); } @Test @CoversAttributes("horizontalOffset") @Templates("plain") public void testHorizontalOffset() { testHorizontalOffset(new ShowElementAndReturnAction() { @Override public WebElement perform() { return popupCalendar.openPopup().getRoot(); } }); } @Test @CoversAttributes("immediate") @IssueTracking("https://issues.jboss.org/browse/RF-10821") public void testImmediate() { calendarAttributes.set(CalendarAttributes.immediate, Boolean.TRUE); setCurrentDateWithCalendarsTodayButtonAction.perform(); getMetamerPage().assertListener(PhaseId.APPLY_REQUEST_VALUES, "value changed: null -> " + popupCalendar.getInput().getStringValue()); getMetamerPage().assertPhases(PhaseId.ANY_PHASE); } @Test @CoversAttributes("inputClass") @Templates(value = "plain") public void testInputClass() { testStyleClass(popupCalendar.getInput().advanced().getInputElement(), BasicAttributes.inputClass); } @Test @CoversAttributes("inputSize") @Templates("plain") public void testInputSize() { calendarAttributes.set(CalendarAttributes.inputSize, "30"); assertEquals(popupCalendar.getInput().advanced().getInputElement().getAttribute("size"), "30", "Size attribute of input should be defined."); } @Test @CoversAttributes("inputStyle") @Templates(value = "plain") public void testInputStyle() { testStyle(popupCalendar.getInput().advanced().getInputElement(), BasicAttributes.inputStyle); } @Test @CoversAttributes("jointPoint") @Templates("plain") @UseWithField(field = "positioning", valuesFrom = FROM_ENUM, value = "") public void testJointPoint() { Locations l = Utils.getLocations(popupCalendar.getRootElement().findElement(By.cssSelector("span[id$=Popup]"))); testJointPoint(l.getWidth(), l.getHeight(), new ShowElementAndReturnAction() { @Override public WebElement perform() { return popupCalendar.openPopup().getRoot(); } }); } @Test @CoversAttributes("locale") @Templates("plain") public void testLocale() { String locale = "ru"; calendarAttributes.set(CalendarAttributes.locale, locale); DayPicker dayPicker = popupCalendar.openPopup().getDayPicker(); List<String> weekDayShortNames = dayPicker.getWeekDayShortNames(); List<String> expectedShortNames = Arrays.asList("Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"); assertEquals(weekDayShortNames, expectedShortNames); setCurrentDateWithCalendarsTodayButtonAction.perform(); DateTime parsedDateTime = dateTimeFormatter.withLocale(new Locale(locale)).parseDateTime( popupCalendar.getInput().getStringValue()); assertEquals(parsedDateTime.getDayOfMonth(), todayMidday.getDayOfMonth(), "Input doesn't contain selected date."); assertEquals(parsedDateTime.getMonthOfYear(), todayMidday.getMonthOfYear(), "Input doesn't contain selected date."); assertEquals(parsedDateTime.getYear(), todayMidday.getYear(), "Input doesn't contain selected date."); } @Test @CoversAttributes("minDaysInFirstWeek") @IssueTracking("https://issues.jboss.org/browse/RF-12552") public void testMinDaysInFirstWeek() { calendarAttributes.set(CalendarAttributes.minDaysInFirstWeek, 1); // 1.1.2011 starts with saturday => only 1 day in first weak DateTime firstOf2011 = firstOfJanuary2012.withYear(2011); guardAjax(popupCalendar).setDateTime(firstOf2011); performStabilizationWorkaround(); CalendarWeek firstDisplayedWeek = popupCalendar.openPopup().getDayPicker().getWeek(1); int secondDisplayedWeekNumber = popupCalendar.openPopup().getDayPicker().getWeek(2).getWeekNumber(); List<CalendarDay> days = filterOutBoundaryDays(Lists.newArrayList(firstDisplayedWeek.getCalendarDays())); assertEquals(days.size(), 1, "Month days in first displayed week."); assertEquals(firstDisplayedWeek.getWeekNumber().intValue(), 1, "First displayed week number."); assertEquals(secondDisplayedWeekNumber, 2, "Second displayed week number."); calendarAttributes.set(CalendarAttributes.minDaysInFirstWeek, 2); firstDisplayedWeek = popupCalendar.openPopup().getDayPicker().getWeek(1); secondDisplayedWeekNumber = popupCalendar.openPopup().getDayPicker().getWeek(2).getWeekNumber(); days = filterOutBoundaryDays(Lists.newArrayList(firstDisplayedWeek.getCalendarDays())); assertEquals(days.size(), 1, "Month days in first displayed week."); assertEquals(firstDisplayedWeek.getWeekNumber().intValue(), 53, "First displayed week number."); assertEquals(secondDisplayedWeekNumber, 1, "Second displayed week number."); } @Test @CoversAttributes("mode") @UseWithField(field = "mode", valuesFrom = FROM_ENUM, value = "") public void testMode() { calendarAttributes.set(CalendarAttributes.mode, mode.value); HeaderControls hc = popupCalendar.openPopup().getHeaderControls(); switch (mode) { case AJAX: MetamerPage.waitRequest(hc, WaitRequestType.XHR).nextMonth(); MetamerPage.waitRequest(hc, WaitRequestType.XHR).nextYear(); MetamerPage.waitRequest(hc, WaitRequestType.XHR).previousMonth(); MetamerPage.waitRequest(hc, WaitRequestType.XHR).previousYear(); break; case CLIENT: case NULL: MetamerPage.waitRequest(hc, WaitRequestType.NONE).nextMonth(); MetamerPage.waitRequest(hc, WaitRequestType.NONE).nextYear(); MetamerPage.waitRequest(hc, WaitRequestType.NONE).previousMonth(); MetamerPage.waitRequest(hc, WaitRequestType.NONE).previousYear(); break; } } @Test @CoversAttributes("monthLabels") @Templates("plain") @Unstable public void testMonthLabels() { String labelsString = "január, február, marec, apríl, máj, jún, júl, august, september, október, november, december"; calendarAttributes.set(CalendarAttributes.monthLabels, labelsString); // set date to 1st day of year guardAjax(popupCalendar).setDateTime(todayMidday.withMonthOfYear(1).withDayOfMonth(1)); List<String> expectedLabels = Arrays.asList(labelsString.split(", ")); HeaderControls hc = popupCalendar.openPopup().getHeaderControls(); List<String> monthsLabels = new ArrayList<String>(12); for (int i = 0; i < 12; i++) { String monthAndYear = hc.getYearAndMonthEditorOpenerElement().getText(); String month = monthAndYear.substring(0, monthAndYear.indexOf(",")); monthsLabels.add(month); hc.nextMonth(); } assertEquals(monthsLabels, expectedLabels, "Month label in calendar"); } @Test @CoversAttributes("monthLabelsShort") @Templates("plain") public void testMonthLabelsShort() { String labelsString = "jan, feb, mar, apr, máj, jún, júl, aug, sep, okt, nov, dec"; calendarAttributes.set(CalendarAttributes.monthLabelsShort, labelsString); List<String> expectedLabels = Arrays.asList(labelsString.split(", ")); List<String> shortMonthsLabels = popupCalendar.openPopup().getHeaderControls().openYearAndMonthEditor() .getShortMonthsLabels(); assertEquals(shortMonthsLabels, expectedLabels, "Month label in calendar"); } @Test @CoversAttributes("ontimeselect") public void testOnTimeSelect() { testFireEvent(calendarAttributes, CalendarAttributes.ontimeselect, setTimeAction); } @Test @CoversAttributes("onbeforetimeselect") public void testOnbeforetimeselect() { testFireEvent(calendarAttributes, CalendarAttributes.onbeforetimeselect, setTimeAction); } @Test @CoversAttributes("onchange") public void testOnchange() { testFireEvent(calendarAttributes, CalendarAttributes.onchange, setCurrentDateWithCalendarsTodayButtonAction); } @Test @CoversAttributes("onclean") public void testOnclean() { testFireEvent(calendarAttributes, CalendarAttributes.onclean, new Action() { @Override public void perform() { PopupFooterControls fc = popupCalendar.openPopup().getFooterControls(); MetamerPage.waitRequest(fc, WaitRequestType.NONE).todayDate(); Graphene.waitGui().until().element(fc.getCleanButtonElement()).is().visible(); MetamerPage.waitRequest(fc, WaitRequestType.NONE).cleanDate(); } }); } @Test @CoversAttributes("oncomplete") public void testOncomplete() { calendarAttributes.set(CalendarAttributes.mode, "ajax"); testFireEvent(calendarAttributes, CalendarAttributes.oncomplete, new Action() { @Override public void perform() { MetamerPage.waitRequest(popupCalendar.openPopup().getHeaderControls(), WaitRequestType.XHR).nextMonth(); } }); } @Test @CoversAttributes("oncurrentdateselect") @IssueTracking("https://issues.jboss.org/browse/RF-12505") public void testOncurrentdateselect() { testFireEvent(calendarAttributes, CalendarAttributes.oncurrentdateselect, setTodayAndThenClickToNextMonthAction); } @Test @CoversAttributes("ondatemouseout") @Templates(value = "plain") public void testOndatemouseout() { testFireEvent(calendarAttributes, CalendarAttributes.ondatemouseout, new Action() { @Override public void perform() { fireEvent(popupCalendar.openPopup().getDayPicker().getTodayDay().getDayElement(), Event.MOUSEOUT); } }); } @Test @CoversAttributes("ondatemouseover") @Templates(value = "plain") public void testOndatemouseover() { testFireEvent(calendarAttributes, CalendarAttributes.ondatemouseover, new Action() { @Override public void perform() { fireEvent(popupCalendar.openPopup().getDayPicker().getTodayDay().getDayElement(), Event.MOUSEOVER); } }); } @Test @CoversAttributes("ondateselect") public void testOndateselect() { testFireEvent(calendarAttributes, CalendarAttributes.ondateselect, setCurrentDateWithCalendarsTodayButtonAction); } @Test @CoversAttributes("onhide") public void testOnhide() { testFireEvent( calendarAttributes, CalendarAttributes.onhide, new Actions(driver).click(popupCalendar.getInput().advanced().getInputElement()) .click(popupCalendar.getInput().advanced().getInputElement()).build()); } @Test @CoversAttributes("oninputblur") public void testOninputblur() { // this throws the condition 2x // testFireEventWithJS(calendar.getInput(), Event.BLUR, calendarAttributes, CalendarAttributes.oninputblur); testFireEvent(calendarAttributes, CalendarAttributes.oninputblur, new Actions(driver).click(popupCalendar.getInput().advanced().getInputElement()) .click(getMetamerPage().getRequestTimeElement()).build()); } @Test @CoversAttributes("oninputchange") @IssueTracking("https://issues.jboss.org/browse/RF-9602") public void testOninputchange() { calendarAttributes.set(CalendarAttributes.enableManualInput, Boolean.TRUE); testFireEvent(calendarAttributes, CalendarAttributes.oninputchange, new Action() { @Override public void perform() { popupCalendar.getInput().sendKeys("0"); submitWithA4jSubmitBtn(); } }); } @Test @CoversAttributes("oninputclick") @Templates(value = "plain") public void testOninputclick() { testFireEvent(calendarAttributes, CalendarAttributes.oninputclick, new Actions(driver).click(popupCalendar.getInput().advanced().getInputElement()).build()); } @Test @CoversAttributes("oninputdblclick") @Templates(value = "plain") public void testOninputdblclick() { testFireEvent(calendarAttributes, CalendarAttributes.oninputdblclick, new Actions(driver).doubleClick(popupCalendar.getInput().advanced().getInputElement()).build()); } @Test @CoversAttributes("oninputfocus") public void testOninputfocus() { testFireEvent(calendarAttributes, CalendarAttributes.oninputfocus, new Actions(driver).click(popupCalendar.getInput().advanced().getInputElement()).build()); } @Test @CoversAttributes("oninputkeydown") @Templates(value = "plain") public void testOninputkeydown() { testFireEventWithJS(popupCalendar.getInput().advanced().getInputElement(), Event.KEYDOWN, calendarAttributes, CalendarAttributes.oninputkeydown); } @Test @CoversAttributes("oninputkeypress") @Templates(value = "plain") public void testOninputkeypress() { testFireEventWithJS(popupCalendar.getInput().advanced().getInputElement(), Event.KEYPRESS, calendarAttributes, CalendarAttributes.oninputkeypress); } @Test @CoversAttributes("oninputkeyup") @Templates(value = "plain") public void testOninputkeyup() { testFireEventWithJS(popupCalendar.getInput().advanced().getInputElement(), Event.KEYUP, calendarAttributes, CalendarAttributes.oninputkeyup); } @Test @CoversAttributes("oninputmousedown") @Templates(value = "plain") public void testOninputmousedown() { testFireEvent(calendarAttributes, CalendarAttributes.oninputmousedown, new Actions(driver).clickAndHold(popupCalendar.getInput().advanced().getInputElement()).build()); } @Test @CoversAttributes("oninputmousemove") @Templates(value = "plain") public void testOninputmousemove() { testFireEvent(calendarAttributes, CalendarAttributes.oninputmousemove, new Actions(driver).moveToElement(popupCalendar.getInput().advanced().getInputElement()).build()); } @Test @CoversAttributes("oninputmouseout") @Templates(value = "plain") public void testOninputmouseout() { testFireEvent( calendarAttributes, CalendarAttributes.oninputmouseout, new Actions(driver).click(popupCalendar.getInput().advanced().getInputElement()) .moveToElement(getMetamerPage().getRequestTimeElement()).build()); } @Test @CoversAttributes("oninputmouseover") @Templates(value = "plain") public void testOninputmouseover() { testFireEvent(calendarAttributes, CalendarAttributes.oninputmouseover, new Actions(driver).moveToElement(getMetamerPage().getRequestTimeElement()).moveToElement(popupCalendar.getInput().advanced().getInputElement()).build()); } @Test @CoversAttributes("oninputmouseup") @Templates(value = "plain") public void testOninputmouseup() { testFireEvent(calendarAttributes, CalendarAttributes.oninputmouseup, new Actions(driver).click(popupCalendar.getInput().advanced().getInputElement()).build()); } @Test @CoversAttributes("oninputselect") public void testOninputselect() { setCurrentDateWithCalendarsTodayButtonAction.perform(); WebElement inputElement = popupCalendar.getInput().advanced().getInputElement(); final int width = Utils.getLocations(inputElement).getWidth(); testFireEvent(calendarAttributes, CalendarAttributes.oninputselect, new Actions(driver) .moveToElement(inputElement, 3, 3) .clickAndHold() .moveByOffset(width - 5, 0) .release() .build() ); } @Test @CoversAttributes("onshow") public void testOnshow() { testFireEvent(calendarAttributes, CalendarAttributes.onshow, new Action() { @Override public void perform() { popupCalendar.openPopup(); } }); } @Test @CoversAttributes("onbeforecurrentdateselect") public void testOnbeforecurrentdateselect() { testFireEvent(calendarAttributes, CalendarAttributes.onbeforecurrentdateselect, setTodayAndThenClickToNextMonthAction); } @Test @CoversAttributes("onbeforedateselect") public void testOnbeforedateselect() { testFireEvent(calendarAttributes, CalendarAttributes.onbeforedateselect, setCurrentDateWithCalendarsTodayButtonAction); } @Test @CoversAttributes("popup") public void testPopup() { calendarAttributes.set(CalendarAttributes.popup, Boolean.FALSE); assertTrue(inlineCalendar.isVisible(), "Inline calendar should be visible."); assertListOfWebElementsNotVisible(Arrays.asList(popupCalendar.getInput().advanced().getInputElement(), popupCalendar.getPopupButtonElement())); } @Test @CoversAttributes("popupClass") @Templates(value = "plain") public void testPopupClass() { testHTMLAttribute(popupCalendar.openPopup().getRoot(), calendarAttributes, CalendarAttributes.popupClass, "metamer-ftest-class"); } @Test @CoversAttributes("popupStyle") @Templates(value = "plain") public void testPopupStyle() { testHTMLAttribute(popupCalendar.openPopup().getRoot(), calendarAttributes, CalendarAttributes.popupStyle, "background-color: yellow;"); } @Test @CoversAttributes("readonly") @Templates("plain") public void testReadonly() { calendarAttributes.set(CalendarAttributes.readonly, Boolean.TRUE); // the input should be readonly assertEquals(popupCalendar.getInput().advanced().getInputElement().getAttribute("readonly"), "true"); // and user cannot select a day DayPicker dayPicker = popupCalendar.openPopup().getDayPicker(); Integer dayNumber = dayPicker.getTodayDay().getDayNumber(); try { dayPicker.selectDayInMonth(dayNumber >= 28 ? dayNumber - 1 : dayNumber + 1); fail("No day should be selectable!"); } catch (TimeoutException expected) { } } @Test @CoversAttributes("rendered") @Templates(value = "plain") public void testRendered() { calendarAttributes.set(CalendarAttributes.rendered, Boolean.FALSE); assertFalse(popupCalendar.isVisible()); } @Test @CoversAttributes("required") @UseWithField(field = "booleanValue", valuesFrom = FROM_FIELD, value = "booleans") public void testRequired() { calendarAttributes.set(CalendarAttributes.required, booleanValue); submitWithA4jSubmitBtn(); if (booleanValue) { assertTrue(message.advanced().isVisible()); assertEquals(message.getDetail(), "value is required"); } else { assertFalse(message.advanced().isVisible()); } } @Test @CoversAttributes("requiredMessage") public void testRequiredMessage() { String msg = "RichFaces 4"; attsSetter() .setAttribute(CalendarAttributes.requiredMessage).toValue(msg) .setAttribute(CalendarAttributes.required).toValue(true) .asSingleAction().perform(); submitWithA4jSubmitBtn(); assertTrue(message.advanced().isVisible()); assertEquals(message.getDetail(), msg); } @Test @CoversAttributes("resetTimeOnDateSelect") @UseWithField(field = "booleanValue", valuesFrom = FROM_FIELD, value = "booleans") public void testResetTimeOnDateSelect() { calendarAttributes.set(CalendarAttributes.resetTimeOnDateSelect, booleanValue); int minutes = 33; // set yesterday with some minutes Graphene.guardAjax(popupCalendar).setDateTime(todayMidday.plusMinutes(minutes).minusDays(1)); performStabilizationWorkaround(); // second time, but without minutes setting, to see if the minutes will reset setCurrentDateWithCalendarsTodayButtonAction.perform(); int minutesAfterReseting = dateTimeFormatter.parseDateTime(popupCalendar.getInput().getStringValue()).getMinuteOfHour(); if (booleanValue) { assertEquals(minutesAfterReseting, 0); } else { assertEquals(minutesAfterReseting, minutes); } } @Test @CoversAttributes("showApplyButton") @UseWithField(field = "booleanValue", valuesFrom = FROM_FIELD, value = "booleans") public void testShowApplyButton() { calendarAttributes.set(CalendarAttributes.showApplyButton, booleanValue); PopupFooterControls fc = popupCalendar.openPopup().getFooterControls(); if (booleanValue) { assertVisible(fc.getApplyButtonElement()); } else { assertNotVisible(fc.getApplyButtonElement()); setCurrentDateWithCalendarsTodayButtonAction.perform(); DateTime inputTime = dateTimeFormatter.parseDateTime(popupCalendar.getInput().getStringValue()); assertEquals(inputTime.getDayOfMonth(), todayMidday.getDayOfMonth()); assertEquals(inputTime.getMonthOfYear(), todayMidday.getMonthOfYear()); assertEquals(inputTime.getYear(), todayMidday.getYear()); } } @Test @CoversAttributes("showFooter") @UseWithField(field = "booleanValue", valuesFrom = FROM_FIELD, value = "booleans") @Templates("plain") public void testShowFooter() { setCurrentDateWithCalendarsTodayButtonAction.perform(); calendarAttributes.set(CalendarAttributes.showFooter, booleanValue); PopupFooterControls fc = popupCalendar.openPopup().getFooterControls(); if (booleanValue) { assertTrue(fc.isVisible(), "Footer elements should be visible, when footer is rendered"); assertListOfWebElementsVisible(Arrays.asList(fc.getApplyButtonElement(), fc.getCleanButtonElement(), fc.getTimeEditorOpenerElement(), fc.getTodayButtonElement())); } else { assertFalse(fc.isVisible(), "Footer elements should not be visible, when footer is not rendered"); } } @Test @CoversAttributes("showHeader") @UseWithField(field = "booleanValue", valuesFrom = FROM_FIELD, value = "booleans") @Templates("plain") public void testShowHeader() { calendarAttributes.set(CalendarAttributes.showHeader, booleanValue); PopupHeaderControls hc = popupCalendar.openPopup().getHeaderControls(); if (booleanValue) { assertListOfWebElementsVisible(Arrays.asList(hc.getCloseButtonElement(), hc.getNextMonthElement(), hc.getNextYearElement(), hc.getPreviousMonthElement(), hc.getPreviousYearElement(), hc.getYearAndMonthEditorOpenerElement())); } else { assertListOfWebElementsNotVisible(Arrays.asList(hc.getCloseButtonElement(), hc.getNextMonthElement(), hc.getNextYearElement(), hc.getPreviousMonthElement(), hc.getPreviousYearElement(), hc.getYearAndMonthEditorOpenerElement())); } } @Test @CoversAttributes("showInput") @UseWithField(field = "booleanValue", valuesFrom = FROM_FIELD, value = "booleans") @Templates("plain") public void testShowInput() { calendarAttributes.set(CalendarAttributes.showInput, booleanValue); if (booleanValue) { assertVisible(popupCalendar.getInput().advanced().getInputElement()); } else { assertNotVisible(popupCalendar.getInput().advanced().getInputElement()); } } @Test @CoversAttributes("showWeekDaysBar") @UseWithField(field = "booleanValue", valuesFrom = FROM_FIELD, value = "booleans") @Templates("plain") public void testShowWeekDaysBar() { calendarAttributes.set(CalendarAttributes.showWeekDaysBar, booleanValue); DayPicker dayPicker = popupCalendar.openPopup().getDayPicker(); if (booleanValue) { assertVisible(dayPicker.getWeekDaysBarElement()); } else { assertNotVisible(dayPicker.getWeekDaysBarElement()); } } @Test @CoversAttributes("showWeeksBar") @UseWithField(field = "booleanValue", valuesFrom = FROM_FIELD, value = "booleans") public void testShowWeeksBar() { calendarAttributes.set(CalendarAttributes.showWeeksBar, booleanValue); DayPicker dayPicker = popupCalendar.openPopup().getDayPicker(); if (booleanValue) { assertVisible(dayPicker.getWeek(1).getWeekNumberElement()); } else { assertNotVisible(dayPicker.getWeek(1).getWeekNumberElement()); } } @Test @CoversAttributes("style") @IssueTracking("https://issues.jboss.org/browse/RF-9655") @Templates(value = "plain") public void testStyle() { testStyle(popupCalendar.getRootElement()); } @Test @CoversAttributes("styleClass") @Templates(value = "plain") public void testStyleClass() { testStyleClass(popupCalendar.getRootElement()); } @Test @CoversAttributes("style") @IssueTracking("https://issues.jboss.org/browse/RF-10782") @Templates(value = "plain") public void testStyleWidth() { setAttribute("style", "width: 700px"); assertEquals(popupCalendar.getRootElement().getCssValue("width"), "700px"); } @Test @CoversAttributes("tabindex") @Templates(value = "plain") public void testTabindexInput() { testHTMLAttribute(popupCalendar.getInput().advanced().getInputElement(), calendarAttributes, CalendarAttributes.tabindex, "101"); } @Test @CoversAttributes("tabindex") @IssueTracking("https://issues.jboss.org/browse/RF-10980") @Templates(value = "richPopupPanel") public void testTabindexInputInPopupPanel() { testHTMLAttribute(popupCalendar.getInput().advanced().getInputElement(), calendarAttributes, CalendarAttributes.tabindex, "101"); } @Test @CoversAttributes("tabindex") @Templates("plain") public void testTabindexButton() { testHTMLAttribute(popupCalendar.getPopupButtonElement(), calendarAttributes, CalendarAttributes.tabindex, "101"); } @Test @CoversAttributes("title") @Templates("plain") public void testTitle() { testTitle(popupCalendar.getInput().advanced().getInputElement()); } @Test @CoversAttributes("todayControlMode") @UseWithField(field = "todayControlMode", valuesFrom = FROM_ENUM, value = "") public void testTodayControlMode() { calendarAttributes.set(CalendarAttributes.todayControlMode, todayControlMode.value); PopupCalendar popup; switch (todayControlMode) { case HIDDEN: assertNotVisible(popupCalendar.openPopup().getFooterControls().getTodayButtonElement()); break; case NULL: case SELECT: // set date to tomorrow guardAjax(popupCalendar).setDateTime(firstOfJanuary2012); performStabilizationWorkaround(); // set date with calendar's 'Today' button, // this will scroll and select todays day popup = popupCalendar.openPopup(); MetamerPage.waitRequest(popup.getFooterControls(), WaitRequestType.NONE).todayDate(); CalendarDay selectedDay = popup.getDayPicker().getSelectedDay(); assertNotNull(selectedDay); assertTrue(selectedDay.is(DayType.todayDay)); // view of day picker should change to current month and year assertEquals(popup.getHeaderControls().getYearAndMonth().getMonthOfYear(), todayMidday.getMonthOfYear(), "Year should match with actual year."); assertEquals(popup.getHeaderControls().getYearAndMonth().getYear(), todayMidday.getYear(), "Month should match with actual month."); break; case SCROLL: guardAjax(popupCalendar).setDateTime(firstOfJanuary2012); performStabilizationWorkaround(); // set date with calendar's 'Today' button, // this will only scroll to today but will not select it popup = popupCalendar.openPopup(); MetamerPage.waitRequest(popup.getFooterControls(), WaitRequestType.NONE).todayDate(); // no selected day should be in calendar assertNull(popup.getDayPicker().getSelectedDay()); // but view of day picker should change to current month and year assertEquals(popup.getHeaderControls().getYearAndMonth().getMonthOfYear(), todayMidday.getMonthOfYear(), "Year should match with actual year."); assertEquals(popup.getHeaderControls().getYearAndMonth().getYear(), todayMidday.getYear(), "Month should match with actual month."); break; } } @Test @CoversAttributes("valueChangeListener") public void testValueChangeListener() { setCurrentDateWithCalendarsTodayButtonAction.perform(); getMetamerPage().assertListener(PhaseId.PROCESS_VALIDATIONS, "value changed: null -> " + popupCalendar.getInput().getStringValue()); } @Test @CoversAttributes("verticalOffset") @Templates("plain") public void testVerticalOffset() { testVerticalOffset(new ShowElementAndReturnAction() { @Override public WebElement perform() { return popupCalendar.openPopup().getRoot(); } }); } @Test @CoversAttributes("weekDayLabelsShort") @Templates("plain") public void testWeekDayLabelsShort() { List<String> originalValues = Arrays.asList("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); List<String> weekDayShortNames = popupCalendar.openPopup().getDayPicker().getWeekDayShortNames(); assertEquals(weekDayShortNames, originalValues); String expectedWeekDayShortNames = "ne, po, ut, st, ct, pa, so"; calendarAttributes.set(CalendarAttributes.weekDayLabelsShort, expectedWeekDayShortNames); List<String> expectedList = Arrays.asList(expectedWeekDayShortNames.split(", ")); weekDayShortNames = popupCalendar.openPopup().getDayPicker().getWeekDayShortNames(); assertEquals(weekDayShortNames, expectedList); } @Test @CoversAttributes("zindex") @Templates(value = "plain") public void testZindex() { final String zindex = "30"; calendarAttributes.set(CalendarAttributes.zindex, zindex); String contentZindex = popupCalendar.openPopup().getRoot().getCssValue("z-index"); assertEquals(contentZindex, zindex, "Z-index of the popup"); } private void assertVisible(WebElement element) { assertTrue(new WebElementConditionFactory(element).isVisible().apply(driver)); } private void assertNotVisible(WebElement element) { assertTrue(new WebElementConditionFactory(element).not().isVisible().apply(driver)); } private void assertListOfWebElementsVisible(List<WebElement> list) { for (WebElement webElement : list) { assertVisible(webElement); } } private void assertListOfWebElementsNotVisible(List<WebElement> list) { for (WebElement webElement : list) { assertNotVisible(webElement); } } private void submitWithA4jSubmitBtn() { MetamerPage.waitRequest(a4jbutton, WaitRequestType.XHR).click(); } private class SetTimeAction implements Action { @Override public void perform() { popupCalendar.openPopup().getFooterControls().todayDate(); popupCalendar.openPopup().getFooterControls().openTimeEditor() .setTime(todayMidday.plusMinutes(5), SetValueBy.BUTTONS).confirmTime(); } } private class SetCurrentDateWithCalendarsTodayButtonAction implements Action { @Override public void perform() { Graphene.guardAjax(popupCalendar.openPopup().getFooterControls()).setTodaysDate(); performStabilizationWorkaround(); } } private class SetTodayAndThenClickToNextMonthAction implements Action { @Override public void perform() { popupCalendar.openPopup().getFooterControls().todayDate(); popupCalendar.openPopup().getHeaderControls().nextMonth(); } } }