/*
* 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.testng.Assert.assertEquals;
import org.jboss.arquillian.graphene.Graphene;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.openqa.selenium.Keys;
import org.openqa.selenium.interactions.Keyboard;
import org.richfaces.fragment.calendar.PopupCalendar;
import org.richfaces.fragment.calendar.TimeEditor;
import org.richfaces.tests.metamer.ftest.annotations.IssueTracking;
import org.richfaces.tests.metamer.ftest.webdriver.MetamerPage.WaitRequestType;
import org.testng.annotations.Test;
/**
* @author <a href="mailto:jstefek@redhat.com">Jiri Stefek</a>
*/
@IssueTracking({ "https://issues.jboss.org/browse/RF-14078", "https://issues.jboss.org/browse/RF-14166" })
public class TestCalendarKeyboardNavigation extends AbstractCalendarTest {
private static final String CLEAN_KEY = "c";
private static final Keys CLOSE_POPUP_KEY = Keys.ESCAPE;
private static final Keys NEXT_DAY_KEY = Keys.ARROW_RIGHT;
private static final Keys NEXT_MONTH_KEY = Keys.PAGE_DOWN;
private static final Keys NEXT_WEEK_KEY = Keys.ARROW_DOWN;
private static final String NEXT_YEAR_KEY = Keys.chord(Keys.SHIFT, Keys.PAGE_DOWN);
private static final String OPEN_TIME_EDITOR_KEY = "h";
private static final Keys PREVIOUS_DAY_KEY = Keys.ARROW_LEFT;
private static final Keys PREVIOUS_MONTH_KEY = Keys.PAGE_UP;
private static final Keys PREVIOUS_WEEK_KEY = Keys.ARROW_UP;
private static final String PREVIOUS_YEAR_KEY = Keys.chord(Keys.SHIFT, Keys.PAGE_UP);
private static final Keys TIME_SPINNER_DECREASE_KEY = Keys.ARROW_DOWN;
private static final Keys TIME_SPINNER_INCREASE_KEY = Keys.ARROW_UP;
private static final String TODAY_KEY = "t";
@ArquillianResource
private Keyboard keyboard;
private void assertCalendarInputEqualsTo(String expected) {
assertEquals(popupCalendar.getInput().getStringValue(), expected);
}
private void assertHighlightedDay(PopupCalendar calendarPopup, Integer expectedDay) {
assertEquals(calendarPopup.getDayPicker().getSelectedDay().getDayNumber(), expectedDay);
}
private void assertYearAndMonth(PopupCalendar calendarPopup, DateTime expectedYearAndMonth) {
DateTime actualYearAndMonth = calendarPopup.getHeaderControls().getYearAndMonth();
assertEquals(actualYearAndMonth.getMonthOfYear(), expectedYearAndMonth.getMonthOfYear());
assertEquals(actualYearAndMonth.getYear(), expectedYearAndMonth.getYear());
}
@Override
public String getComponentTestPagePath() {
return "richCalendar/simple.xhtml";
}
private PopupCalendar setReferenceDate_openPopup_check() {
waitUtilNoTimeoutsArePresent();
// set reference date
Graphene.guardAjax(popupCalendar).setDateTime(firstOfJanuary2012);
waitUtilNoTimeoutsArePresent();
//open popup
PopupCalendar calendarPopup = popupCalendar.openPopup();
// check actual position
assertYearAndMonth(calendarPopup, firstOfJanuary2012);
assertHighlightedDay(calendarPopup, 1);
return calendarPopup;
}
@Test
public void testClean() {
// set some date, so we can clean it
setReferenceDate_openPopup_check();
assertCalendarInputEqualsTo("Jan 1, 2012 12:00");
// invoke clean key
keyboard.sendKeys(CLEAN_KEY);
// apply
Graphene.guardAjax(keyboard).sendKeys(Keys.ENTER);
// the input should be empty
assertCalendarInputEqualsTo("");
}
@Test
public void testClose() {
assertCalendarInputEqualsTo("");
// open calendar
popupCalendar.openPopup();
// invoke close key
keyboard.sendKeys(CLOSE_POPUP_KEY);
popupCalendar.getPopup().waitUntilIsNotVisible().perform();
// calendar value should stay unchanged
assertCalendarInputEqualsTo("");
// stabilization
blur(WaitRequestType.NONE);
waitUtilNoTimeoutsArePresent();
// set some date
setReferenceDate_openPopup_check();
assertCalendarInputEqualsTo("Jan 1, 2012 12:00");
// scroll to previous day
keyboard.sendKeys(PREVIOUS_DAY_KEY);
// invoke close key
keyboard.sendKeys(CLOSE_POPUP_KEY);
popupCalendar.getPopup().waitUntilIsNotVisible().perform();
// calendar value should stay unchanged
assertCalendarInputEqualsTo("Jan 1, 2012 12:00");
}
@Test
public void testScrollingDaysAndWeeks() {
PopupCalendar calendarPopup = setReferenceDate_openPopup_check();
// verify days scrolling
keyboard.sendKeys(PREVIOUS_DAY_KEY);
assertHighlightedDay(calendarPopup, 31);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.minusDays(1));
keyboard.sendKeys(PREVIOUS_DAY_KEY);
assertHighlightedDay(calendarPopup, 30);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.minusDays(2));
keyboard.sendKeys(NEXT_DAY_KEY);
assertHighlightedDay(calendarPopup, 31);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.minusDays(1));
keyboard.sendKeys(NEXT_DAY_KEY);
assertHighlightedDay(calendarPopup, 1);
assertYearAndMonth(calendarPopup, firstOfJanuary2012);
keyboard.sendKeys(NEXT_DAY_KEY);
assertHighlightedDay(calendarPopup, 2);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.plusDays(1));
// verify weeks scrolling
keyboard.sendKeys(NEXT_WEEK_KEY);
assertHighlightedDay(calendarPopup, 9);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.plusWeeks(1));
keyboard.sendKeys(NEXT_WEEK_KEY);
assertHighlightedDay(calendarPopup, 16);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.plusWeeks(2));
keyboard.sendKeys(NEXT_WEEK_KEY);
assertHighlightedDay(calendarPopup, 23);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.plusWeeks(3));
keyboard.sendKeys(NEXT_WEEK_KEY);
assertHighlightedDay(calendarPopup, 30);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.plusWeeks(4));
keyboard.sendKeys(NEXT_WEEK_KEY);
assertHighlightedDay(calendarPopup, 6);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.plusWeeks(5));
keyboard.sendKeys(PREVIOUS_WEEK_KEY);
assertHighlightedDay(calendarPopup, 30);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.plusWeeks(4));
keyboard.sendKeys(PREVIOUS_WEEK_KEY);
assertHighlightedDay(calendarPopup, 23);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.plusWeeks(3));
// apply
Graphene.guardAjax(keyboard).sendKeys(Keys.ENTER);
assertCalendarInputEqualsTo("Jan 23, 2012 12:00");
}
@Test
public void testScrollingMonths() {
PopupCalendar calendarPopup = setReferenceDate_openPopup_check();
// verify months scrolling
keyboard.sendKeys(PREVIOUS_MONTH_KEY);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.minusMonths(1));
keyboard.sendKeys(PREVIOUS_MONTH_KEY);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.minusMonths(2));
keyboard.sendKeys(NEXT_MONTH_KEY);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.minusMonths(1));
keyboard.sendKeys(NEXT_MONTH_KEY);
assertYearAndMonth(calendarPopup, firstOfJanuary2012);
keyboard.sendKeys(NEXT_MONTH_KEY);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.plusMonths(1));
// apply
Graphene.guardAjax(keyboard).sendKeys(Keys.ENTER);
assertCalendarInputEqualsTo("Feb 1, 2012 12:00");
}
@Test
public void testScrollingYears() {
PopupCalendar calendarPopup = setReferenceDate_openPopup_check();
// verify years scrolling
keyboard.sendKeys(NEXT_YEAR_KEY);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.plusYears(1));
keyboard.sendKeys(NEXT_YEAR_KEY);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.plusYears(2));
keyboard.sendKeys(PREVIOUS_YEAR_KEY);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.plusYears(1));
keyboard.sendKeys(PREVIOUS_YEAR_KEY);
assertYearAndMonth(calendarPopup, firstOfJanuary2012);
keyboard.sendKeys(PREVIOUS_YEAR_KEY);
assertYearAndMonth(calendarPopup, firstOfJanuary2012.minusYears(1));
// apply
Graphene.guardAjax(keyboard).sendKeys(Keys.ENTER);
assertCalendarInputEqualsTo("Jan 1, 2011 12:00");
}
@Test
public void testTimeEditor() {
String datePattern = "dd/M/yy hh:mm:ss a";
calendarAttributes.set(CalendarAttributes.datePattern, datePattern);
PopupCalendar calendarPopup = setReferenceDate_openPopup_check();
assertCalendarInputEqualsTo("01/1/12 12:00:00 PM");
keyboard.sendKeys(OPEN_TIME_EDITOR_KEY);
TimeEditor timeEditor = calendarPopup.getFooterControls().getTimeEditor();
timeEditor.waitUntilIsVisible().perform();
// increase hours by 2
keyboard.sendKeys(TIME_SPINNER_INCREASE_KEY);
keyboard.sendKeys(TIME_SPINNER_INCREASE_KEY);
// switch to minutes
keyboard.sendKeys(Keys.TAB);
// decrease minutes by 3
keyboard.sendKeys(TIME_SPINNER_DECREASE_KEY);
keyboard.sendKeys(TIME_SPINNER_DECREASE_KEY);
keyboard.sendKeys(TIME_SPINNER_DECREASE_KEY);
// switch to seconds
keyboard.sendKeys(Keys.TAB);
// increase seconds by 1
keyboard.sendKeys(TIME_SPINNER_INCREASE_KEY);
// switch to time sign
keyboard.sendKeys(Keys.TAB);
// change time sign
keyboard.sendKeys(TIME_SPINNER_INCREASE_KEY);
// switch to hours again
keyboard.sendKeys(Keys.TAB);
// increase hours by 1
keyboard.sendKeys(TIME_SPINNER_INCREASE_KEY);
// switch to minutes again
keyboard.sendKeys(Keys.TAB);
// switch to seconds again
keyboard.sendKeys(Keys.TAB);
// increase seconds by 1
keyboard.sendKeys(TIME_SPINNER_INCREASE_KEY);
// confirm
keyboard.sendKeys(Keys.ENTER);
// apply
Graphene.guardAjax(keyboard).sendKeys(Keys.ENTER);
assertCalendarInputEqualsTo("01/1/12 03:57:02 AM");
}
@Test
public void testToday() {
setReferenceDate_openPopup_check();
keyboard.sendKeys(TODAY_KEY);
assertHighlightedDay(popupCalendar.openPopup(), todayMidday.getDayOfMonth());
// apply
Graphene.guardAjax(keyboard).sendKeys(Keys.ENTER);
assertCalendarInputEqualsTo(todayMidday.toString(DateTimeFormat.forPattern(calendarAttributes.get(CalendarAttributes.datePattern))));
}
}