angular-material-npfixed
Version:
The Angular Material project is an implementation of Material Design in Angular.js. This project provides a set of reusable, well-tested, and accessible Material Design UI components. Angular Material is supported internally at Google by the Angular.js, M
772 lines (618 loc) • 30 kB
JavaScript
describe('md-calendar', function() {
// When constructing a Date, the month is zero-based. This can be confusing, since people are
// used to seeing them one-based. So we create these aliases to make reading the tests easier.
var JAN = 0, FEB = 1, MAR = 2, APR = 3, MAY = 4, JUN = 5, JUL = 6, AUG = 7, SEP = 8, OCT = 9,
NOV = 10, DEC = 11;
var ngElement, element, scope, pageScope, calendarMonthController, calendarYearController, calendarController;
var $rootScope, dateLocale, $mdUtil, $material, $compile, $timeout, keyCodes, dateUtil;
// List of calendar elements added to the DOM so we can remove them after every test.
var attachedCalendarElements = [];
/**
* To apply a change in the date, a scope $apply() AND a manual triggering of animation
* callbacks is necessary.
*/
function applyDateChange() {
$timeout.flush();
pageScope.$apply();
$material.flushOutstandingAnimations();
// Internally, the calendar sets scrollTop to scroll to the month for a change.
// The handler for that scroll won't be invoked unless we manually trigger it.
var activeViewController = calendarMonthController || calendarYearController;
if (activeViewController) {
angular.element(activeViewController.calendarScroller).triggerHandler('scroll');
}
}
/** Extracts text as an array (one element per cell) from a tr element. */
function extractRowText(tr) {
var cellContents = [];
angular.forEach(tr.children, function(tableElement) {
cellContents.push(tableElement.textContent);
});
return cellContents;
}
/** Finds a td given a label. */
function findCellByLabel(monthElement, day) {
var tds = monthElement.querySelectorAll('td');
var td;
for (var i = 0; i < tds.length; i++) {
td = tds[i];
if (td.textContent === day.toString()) {
return td;
}
}
}
/**
* Finds a month `tbody` in the calendar element given a date.
*/
function findMonthElement(date) {
var months = element.querySelectorAll('[md-calendar-month-body]');
var monthHeader = dateLocale.monthHeaderFormatter(date);
var month;
for (var i = 0; i < months.length; i++) {
month = months[i];
if (month.querySelector('tr:first-child td:first-child').textContent === monthHeader) {
return month;
}
}
return null;
}
/** Find the `tbody` for a year in the calendar. */
function findYearElement(year) {
var node = element[0] || element;
var years = node.querySelectorAll('[md-calendar-year-body]');
var yearHeader = year.toString();
var target;
for (var i = 0; i < years.length; i++) {
target = years[i];
if (target.querySelector('.md-calendar-month-label').textContent === yearHeader) {
return target;
}
}
return null;
}
/**
* Gets the group label for a given date cell.
* @param {HTMLElement|DocumentView} cell
* @returns {string}
*/
function getGroupLabelForDateCell(cell) {
return $mdUtil.getClosest(cell, 'tbody').querySelector('.md-calendar-month-label').textContent;
}
/** Creates and compiles an md-calendar element. */
function createElement(parentScope, templateOverride) {
var directiveScope = parentScope || $rootScope.$new();
var template = templateOverride || '<md-calendar md-min-date="minDate" md-max-date="maxDate" ' +
'ng-model="myDate"></md-calendar>';
var attachedElement = angular.element(template);
document.body.appendChild(attachedElement[0]);
var newElement = $compile(attachedElement)(directiveScope);
attachedCalendarElements.push(newElement);
applyDateChange();
return newElement;
}
/**
* Dispatches a KeyboardEvent for the calendar.
* @param {number} keyCode
* @param {Object=} opt_modifiers
*/
function dispatchKeyEvent(keyCode, opt_modifiers) {
var mod = opt_modifiers || {};
angular.element(element).triggerHandler({
type: 'keydown',
keyCode: keyCode,
which: keyCode,
ctrlKey: mod.ctrl,
altKey: mod.alt,
metaKey: mod.meta,
shortKey: mod.shift
});
}
function getFocusedDateElement() {
return element.querySelector('.md-focus');
}
beforeEach(module('material.components.datepicker', 'ngAnimateMock'));
beforeEach(inject(function($injector) {
jasmine.addMatchers({
toBeSameDayAs: function() {
return {
compare: function(actual, expected) {
var results = {
pass: dateUtil.isSameDay(actual, expected)
};
var negation = !results.pass ? '' : 'not ';
results.message = [
'Expected',
actual,
negation + 'to be the same day as',
expected
].join(' ');
return results;
}
};
}
});
$material = $injector.get('$material');
$compile = $injector.get('$compile');
$rootScope = $injector.get('$rootScope');
$timeout = $injector.get('$timeout');
dateLocale = $injector.get('$mdDateLocale');
dateUtil = $injector.get('$$mdDateUtil');
$mdUtil = $injector.get('$mdUtil');
keyCodes = $injector.get('$mdConstant').KEY_CODE;
pageScope = $rootScope.$new();
pageScope.myDate = null;
ngElement = createElement(pageScope);
element = ngElement[0];
scope = ngElement.isolateScope();
calendarController = ngElement.controller('mdCalendar');
calendarMonthController = ngElement.find('md-calendar-month').controller('mdCalendarMonth');
calendarYearController = ngElement.find('md-calendar-year').controller('mdCalendarYear');
}));
afterEach(function() {
attachedCalendarElements.forEach(function(element) {
element.remove();
});
attachedCalendarElements = [];
});
describe('ngModel binding', function() {
it('should update the calendar based on ngModel change', function() {
pageScope.myDate = new Date(2014, MAY, 30);
applyDateChange();
var selectedDate = element.querySelector('.md-calendar-selected-date');
expect(getGroupLabelForDateCell(selectedDate)).toBe('May 2014');
expect(selectedDate.textContent).toBe('30');
});
});
describe('calendar construction', function() {
it('should be able to switch between views', function() {
expect(element.querySelector('md-calendar-month')).toBeTruthy();
calendarController.setCurrentView('year');
applyDateChange();
expect(element.querySelector('md-calendar-month')).toBeFalsy();
expect(element.querySelector('md-calendar-year')).toBeTruthy();
});
describe('month view', function() {
var monthCtrl;
beforeEach(function() {
monthCtrl = angular.element(element.querySelector('[md-calendar-month-body]'))
.controller('mdCalendarMonthBody');
});
it('should render a month correctly as a table', function() {
var date = new Date(2014, MAY, 30);
var monthElement = monthCtrl.buildCalendarForMonth(date);
var calendarRows = monthElement.querySelectorAll('tr');
var calendarDates = [];
angular.forEach(calendarRows, function(tr) {
calendarDates.push(extractRowText(tr));
});
var expectedDates = [
['May 2014', '', '1', '2', '3'],
['4', '5', '6', '7', '8', '9', '10'],
['11', '12', '13', '14', '15', '16', '17'],
['18', '19', '20', '21', '22', '23', '24'],
['25', '26', '27', '28', '29', '30', '31'],
['', '', '', '', '', '', ''],
];
expect(calendarDates).toEqual(expectedDates);
});
it('should render a month correctly when the first day of the week is Monday', function() {
dateLocale.firstDayOfWeek = 1;
var date = new Date(2014, MAY, 30);
var monthElement = monthCtrl.buildCalendarForMonth(date);
var calendarRows = monthElement.querySelectorAll('tr');
var calendarDates = [];
angular.forEach(calendarRows, function(tr) {
calendarDates.push(extractRowText(tr));
});
var expectedDates = [
['May 2014', '1', '2', '3', '4'],
['5', '6', '7', '8', '9', '10', '11'],
['12', '13', '14', '15', '16', '17', '18'],
['19', '20', '21', '22', '23', '24', '25'],
['26', '27', '28', '29', '30', '31', ''],
['', '', '', '', '', '', ''],
];
expect(calendarDates).toEqual(expectedDates);
dateLocale.firstDayOfWeek = 0;
});
it('should show the month on its own row if the first day is before Tuesday', function() {
var date = new Date(2014, JUN, 30); // 1st on Sunday
var monthElement = monthCtrl.buildCalendarForMonth(date);
var firstRow = monthElement.querySelector('tr');
expect(extractRowText(firstRow)).toEqual(['Jun 2014']);
});
it('should apply the locale-specific month header formatter', function() {
var date = new Date(2014, JUN, 30);
spyOn(dateLocale, 'monthHeaderFormatter').and.callFake(function(expectedDateArg) {
expect(expectedDateArg).toBeSameDayAs(date);
return 'Junz 2014';
});
var monthElement = monthCtrl.buildCalendarForMonth(date);
var monthHeader = monthElement.querySelector('tr');
expect(monthHeader.textContent).toEqual('Junz 2014');
});
it('should update the model on cell click', function() {
spyOn(scope, '$emit');
var date = new Date(2014, MAY, 30);
var monthElement = monthCtrl.buildCalendarForMonth(date);
var expectedDate = new Date(2014, MAY, 5);
findCellByLabel(monthElement, 5).click();
expect(pageScope.myDate).toBeSameDayAs(expectedDate);
expect(scope.$emit).toHaveBeenCalledWith('md-calendar-change', expectedDate);
});
it('should disable any dates outside the min/max date range', function() {
pageScope.minDate = new Date(2014, JUN, 10);
pageScope.maxDate = new Date(2014, JUN, 20);
pageScope.$apply();
var monthElement = monthCtrl.buildCalendarForMonth(new Date(2014, JUN, 15));
expect(findCellByLabel(monthElement, 5)).toHaveClass('md-calendar-date-disabled');
expect(findCellByLabel(monthElement, 10)).not.toHaveClass('md-calendar-date-disabled');
expect(findCellByLabel(monthElement, 20)).not.toHaveClass('md-calendar-date-disabled');
expect(findCellByLabel(monthElement, 25)).toHaveClass('md-calendar-date-disabled');
});
it('should not respond to disabled cell clicks', function() {
var initialDate = new Date(2014, JUN, 15);
pageScope.myDate = initialDate;
pageScope.minDate = new Date(2014, JUN, 10);
pageScope.maxDate = new Date(2014, JUN, 20);
pageScope.$apply();
var monthElement = monthCtrl.buildCalendarForMonth(pageScope.myDate);
findCellByLabel(monthElement, 5).click();
expect(pageScope.myDate).toBeSameDayAs(initialDate);
});
it('should ensure that all month elements have a height when the max ' +
'date is in the same month as the current date', function() {
ngElement.remove();
var newScope = $rootScope.$new();
newScope.myDate = new Date(2016, JUN, 15);
newScope.maxDate = new Date(2016, JUN, 20);
element = createElement(newScope)[0];
applyDateChange();
var monthWrapper = angular.element(element.querySelector('md-calendar-month'));
var scroller = monthWrapper.controller('mdCalendarMonth').calendarScroller;
scroller.scrollTop -= 50;
angular.element(scroller).triggerHandler('scroll');
var monthElements = $mdUtil.nodesToArray(
element.querySelectorAll('[md-calendar-month-body]')
);
expect(monthElements.every(function(currentMonthElement) {
return currentMonthElement.offsetHeight > 0;
})).toBe(true);
});
describe('weeks header', function() {
it('should display the weeks header in the first row', function() {
var header = element.querySelector('.md-calendar-day-header tr');
expect(extractRowText(header)).toEqual(['S', 'M', 'T', 'W', 'T', 'F' ,'S']);
});
it('should use $mdDateLocale.shortDays as weeks header values', function() {
var oldShortDays = dateLocale.shortDays;
dateLocale.shortDays = ['SZ', 'MZ', 'TZ', 'WZ', 'TZ', 'FZ', 'SZ'];
var newElement = createElement()[0];
var header = newElement.querySelector('.md-calendar-day-header tr');
expect(extractRowText(header)).toEqual(['SZ', 'MZ', 'TZ', 'WZ', 'TZ', 'FZ','SZ']);
dateLocale.shortDays = oldShortDays;
});
it('should allow changing the first day of the week to Monday', function() {
var oldShortDays = dateLocale.shortDays;
dateLocale.shortDays = ['SZ', 'MZ', 'TZ', 'WZ', 'TZ', 'FZ', 'SZ'];
dateLocale.firstDayOfWeek = 1;
var newElement = createElement()[0];
var header = newElement.querySelector('.md-calendar-day-header tr');
expect(extractRowText(header)).toEqual(['MZ', 'TZ', 'WZ', 'TZ', 'FZ','SZ', 'SZ']);
dateLocale.shortDays = oldShortDays;
dateLocale.firstDayOfWeek = 0;
});
});
it('should highlight today', function() {
pageScope.myDate = calendarController.today;
applyDateChange();
var todayElement = element.querySelector('.md-calendar-date-today');
expect(todayElement).not.toBeNull();
expect(todayElement.textContent).toBe(calendarController.today.getDate() + '');
});
it('should highlight the selected date', function() {
pageScope.myDate = calendarController.selectedDate = new Date(2014, JUN, 30);
applyDateChange();
var selectedElement = element.querySelector('.md-calendar-selected-date');
expect(selectedElement).not.toBeNull();
expect(selectedElement.textContent).toBe(calendarController.selectedDate.getDate() + '');
});
it('should block month transitions when a month transition is happening', function() {
var earlierDate = new Date(2014, FEB, 11);
var laterDate = new Date(2014, MAR, 11);
calendarMonthController.changeDisplayDate(earlierDate);
expect(calendarController.displayDate).toBeSameDayAs(earlierDate);
calendarMonthController.changeDisplayDate(laterDate);
expect(calendarController.displayDate).toBeSameDayAs(earlierDate);
$material.flushOutstandingAnimations();
calendarMonthController.changeDisplayDate(laterDate);
expect(calendarController.displayDate).toBeSameDayAs(laterDate);
});
it('should not render any months before the min date', function() {
ngElement.remove();
var newScope = $rootScope.$new();
newScope.minDate = new Date(2014, JUN, 5);
newScope.myDate = new Date(2014, JUN, 15);
newScope.$apply();
element = createElement(newScope)[0];
expect(findMonthElement(new Date(2014, JUL, 1))).not.toBeNull();
expect(findMonthElement(new Date(2014, JUN, 1))).not.toBeNull();
expect(findMonthElement(new Date(2014, MAY, 1))).toBeNull();
});
});
describe('year view', function() {
var yearCtrl;
beforeEach(function() {
calendarController.setCurrentView('year');
applyDateChange();
yearCtrl = angular.element(element.querySelector('[md-calendar-year-body]'))
.controller('mdCalendarYearBody');
});
it('should render a year correctly as a table', function() {
var date = new Date(2014, MAY, 30);
var yearElement = yearCtrl.buildCalendarForYear(date);
var calendarRows = yearElement.querySelectorAll('tr');
var calendarDates = [];
angular.forEach(calendarRows, function(tr) {
calendarDates.push(extractRowText(tr));
});
var expectedDates = [
['2014', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
['', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
];
expect(calendarDates).toEqual(expectedDates);
});
it('should jump to the first day of the relevant month on cell click', function() {
var date = new Date(2014, MAY, 30);
var yearElement = yearCtrl.buildCalendarForYear(date);
var expectedDate = new Date(2014, DEC, 1);
findCellByLabel(yearElement, 'Dec').click();
applyDateChange();
expect(calendarController.displayDate).toBeSameDayAs(expectedDate);
expect(calendarController.currentView).not.toBe('year');
});
it('should disable any months outside the min/max date range', function() {
pageScope.minDate = new Date(2014, JUN, 10);
pageScope.maxDate = new Date(2014, SEP, 20);
pageScope.$apply();
var yearElement = yearCtrl.buildCalendarForYear(new Date(2014, JAN, 1));
var disabledClass = 'md-calendar-date-disabled';
expect(findCellByLabel(yearElement, 'Jan')).toHaveClass(disabledClass);
expect(findCellByLabel(yearElement, 'Aug')).not.toHaveClass(disabledClass);
expect(findCellByLabel(yearElement, 'Oct')).toHaveClass(disabledClass);
});
it('should not respond to disabled cell clicks', function() {
var initialDate = new Date(2014, JUN, 15);
calendarController.displayDate = initialDate;
pageScope.minDate = new Date(2014, FEB, 10);
pageScope.maxDate = new Date(2014, AUG, 20);
pageScope.$apply();
var yearElement = yearCtrl.buildCalendarForYear(calendarController.displayDate);
findCellByLabel(yearElement, 'Jan').click();
expect(calendarController.displayDate).toBe(initialDate);
});
it('should highlight the current month', function() {
var todayElement = element.querySelector('.md-calendar-date-today');
expect(todayElement).not.toBeNull();
expect(todayElement.textContent).toBe(dateLocale.shortMonths[calendarController.today.getMonth()]);
});
it('should highlight the month of the selected date', function() {
ngElement.remove();
var newScope = $rootScope.$new();
newScope.myDate = new Date(2014, JUN, 30);
element = createElement(newScope)[0];
angular.element(element).controller('mdCalendar').setCurrentView('year');
applyDateChange();
var selectedElement = element.querySelector('.md-calendar-selected-date');
expect(selectedElement).not.toBeNull();
expect(selectedElement.textContent).toBe('Jun');
});
it('should not render any years before the min date', function() {
ngElement.remove();
var newScope = $rootScope.$new();
newScope.minDate = new Date(2014, JUN, 5);
newScope.myDate = new Date(2014, JUL, 15);
element = createElement(newScope);
element.controller('mdCalendar').setCurrentView('year');
applyDateChange();
expect(findYearElement(2014)).not.toBeNull();
expect(findYearElement(2013)).toBeNull();
});
it('should ensure that all year elements have a height when the ' +
'current date is in the same month as the max date', function() {
ngElement.remove();
var newScope = $rootScope.$new();
newScope.myDate = new Date(2016, JUN, 15);
newScope.maxDate = new Date(2016, JUN, 20);
element = createElement(newScope);
element.controller('mdCalendar').setCurrentView('year');
applyDateChange();
var yearWrapper = angular.element(element[0].querySelector('md-calendar-year'));
var scroller = yearWrapper.controller('mdCalendarYear').calendarScroller;
scroller.scrollTop -= 50;
angular.element(scroller).triggerHandler('scroll');
var yearElements = $mdUtil.nodesToArray(
element[0].querySelectorAll('[md-calendar-year-body]')
);
expect(yearElements.every(function(currentYearElement) {
return currentYearElement.offsetHeight > 0;
})).toBe(true);
});
});
it('should have ids for date elements unique to the directive instance', function() {
var controller = ngElement.controller('mdCalendar');
pageScope.myDate = calendarController.today;
applyDateChange();
var otherScope = $rootScope.$new();
var day = 15;
otherScope.myDate = calendarController.today;
var otherNgElement = createElement(otherScope);
var monthElement = element.querySelector('.md-calendar-month');
var dateElement = findCellByLabel(monthElement, day);
var otherMonthElement = otherNgElement[0].querySelector('.md-calendar-month');
var otherDateElement = findCellByLabel(otherMonthElement, day);
expect(dateElement.id).not.toEqual(otherDateElement.id);
});
});
describe('keyboard events', function() {
describe('month view', function() {
it('should navigate around the calendar based on key presses', function() {
pageScope.myDate = new Date(2014, FEB, 11);
applyDateChange();
var selectedDate = element.querySelector('.md-calendar-selected-date');
selectedDate.focus();
dispatchKeyEvent(keyCodes.LEFT_ARROW);
expect(getFocusedDateElement().textContent).toBe('10');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Feb 2014');
dispatchKeyEvent(keyCodes.UP_ARROW);
expect(getFocusedDateElement().textContent).toBe('3');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Feb 2014');
dispatchKeyEvent(keyCodes.RIGHT_ARROW);
expect(getFocusedDateElement().textContent).toBe('4');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Feb 2014');
dispatchKeyEvent(keyCodes.DOWN_ARROW);
expect(getFocusedDateElement().textContent).toBe('11');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Feb 2014');
dispatchKeyEvent(keyCodes.HOME);
expect(getFocusedDateElement().textContent).toBe('1');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Feb 2014');
dispatchKeyEvent(keyCodes.END);
expect(getFocusedDateElement().textContent).toBe('28');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Feb 2014');
dispatchKeyEvent(keyCodes.RIGHT_ARROW);
expect(getFocusedDateElement().textContent).toBe('1');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Mar 2014');
dispatchKeyEvent(keyCodes.PAGE_UP);
expect(getFocusedDateElement().textContent).toBe('1');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Feb 2014');
dispatchKeyEvent(keyCodes.PAGE_DOWN);
expect(getFocusedDateElement().textContent).toBe('1');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Mar 2014');
dispatchKeyEvent(keyCodes.UP_ARROW, {meta: true});
expect(getFocusedDateElement().textContent).toBe('1');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Feb 2014');
dispatchKeyEvent(keyCodes.DOWN_ARROW, {meta: true});
expect(getFocusedDateElement().textContent).toBe('1');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Mar 2014');
dispatchKeyEvent(keyCodes.ENTER);
applyDateChange();
expect(calendarController.selectedDate).toBeSameDayAs(new Date(2014, MAR, 1));
});
it('should restrict date navigation to min/max dates', function() {
pageScope.minDate = new Date(2014, FEB, 5);
pageScope.maxDate = new Date(2014, FEB, 10);
pageScope.myDate = new Date(2014, FEB, 8);
applyDateChange();
var selectedDate = element.querySelector('.md-calendar-selected-date');
selectedDate.focus();
dispatchKeyEvent(keyCodes.UP_ARROW);
expect(getFocusedDateElement().textContent).toBe('5');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Feb 2014');
dispatchKeyEvent(keyCodes.LEFT_ARROW);
expect(getFocusedDateElement().textContent).toBe('5');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Feb 2014');
dispatchKeyEvent(keyCodes.DOWN_ARROW);
expect(getFocusedDateElement().textContent).toBe('10');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Feb 2014');
dispatchKeyEvent(keyCodes.RIGHT_ARROW);
expect(getFocusedDateElement().textContent).toBe('10');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Feb 2014');
dispatchKeyEvent(keyCodes.UP_ARROW, {meta: true});
expect(getFocusedDateElement().textContent).toBe('5');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Feb 2014');
dispatchKeyEvent(keyCodes.DOWN_ARROW, {meta: true});
expect(getFocusedDateElement().textContent).toBe('10');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Feb 2014');
});
});
describe('year view', function() {
it('should navigate around the calendar based on key presses', function() {
pageScope.myDate = new Date(2014, JUN, 1);
calendarController.setCurrentView('year');
applyDateChange();
var selectedDate = element.querySelector('.md-calendar-selected-date');
selectedDate.focus();
dispatchKeyEvent(keyCodes.LEFT_ARROW);
expect(getFocusedDateElement().textContent).toBe('May');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('2014');
dispatchKeyEvent(keyCodes.UP_ARROW);
expect(getFocusedDateElement().textContent).toBe('Nov');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('2013');
dispatchKeyEvent(keyCodes.RIGHT_ARROW);
expect(getFocusedDateElement().textContent).toBe('Dec');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('2013');
dispatchKeyEvent(keyCodes.DOWN_ARROW);
expect(getFocusedDateElement().textContent).toBe('Jun');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('2014');
dispatchKeyEvent(keyCodes.ENTER);
applyDateChange();
expect(calendarController.displayDate).toBeSameDayAs(new Date(2014, JUN, 1));
expect(calendarController.currentView).toBe('month');
expect(getFocusedDateElement().textContent).toBe('1');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('Jun 2014');
});
it('should restrict date navigation to min/max dates', function() {
pageScope.minDate = new Date(2014, JAN, 30);
pageScope.maxDate = new Date(2014, SEP, 1);
pageScope.myDate = new Date(2014, JUN, 1);
calendarController.setCurrentView('year');
applyDateChange();
var selectedDate = element.querySelector('.md-calendar-selected-date');
selectedDate.focus();
dispatchKeyEvent(keyCodes.UP_ARROW);
expect(getFocusedDateElement().textContent).toBe('Jan');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('2014');
dispatchKeyEvent(keyCodes.LEFT_ARROW);
expect(getFocusedDateElement().textContent).toBe('Jan');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('2014');
dispatchKeyEvent(keyCodes.DOWN_ARROW);
dispatchKeyEvent(keyCodes.RIGHT_ARROW);
expect(getFocusedDateElement().textContent).toBe('Aug');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('2014');
dispatchKeyEvent(keyCodes.RIGHT_ARROW);
expect(getFocusedDateElement().textContent).toBe('Sep');
expect(getGroupLabelForDateCell(getFocusedDateElement())).toBe('2014');
});
});
it('should fire an event when escape is pressed', function() {
var escapeHandler = jasmine.createSpy('escapeHandler');
pageScope.$on('md-calendar-close', escapeHandler);
pageScope.myDate = new Date(2014, FEB, 11);
applyDateChange();
var selectedDate = element.querySelector('.md-calendar-selected-date');
selectedDate.focus();
dispatchKeyEvent(keyCodes.ESCAPE);
pageScope.$apply();
expect(escapeHandler).toHaveBeenCalled();
});
});
it('should render one single-row month of disabled cells after the max date', function() {
ngElement.remove();
var newScope = $rootScope.$new();
newScope.myDate = new Date(2014, APR, 15);
newScope.maxDate = new Date(2014, APR, 30);
newScope.$apply();
element = createElement(newScope)[0];
expect(findMonthElement(new Date(2014, MAR, 1))).not.toBeNull();
expect(findMonthElement(new Date(2014, APR, 1))).not.toBeNull();
// First date of May 2014 on Thursday (i.e. has 3 dates on the first row).
var nextMonth = findMonthElement(new Date(2014, MAY, 1));
expect(nextMonth).not.toBeNull();
expect(nextMonth.querySelector('.md-calendar-month-label')).toHaveClass(
'md-calendar-month-label-disabled');
expect(nextMonth.querySelectorAll('tr').length).toBe(1);
var dates = nextMonth.querySelectorAll('.md-calendar-date');
for (var i = 0; i < dates.length; i++) {
date = dates[i];
if (date.textContent) {
expect(date).toHaveClass('md-calendar-date-disabled');
}
}
});
it('should have a configurable default view', function() {
ngElement.remove();
var calendar = createElement(null, '<md-calendar ng-model="myDate" md-current-view="year"></md-calendar>')[0];
expect(calendar.querySelector('md-calendar-month')).toBeFalsy();
expect(calendar.querySelector('md-calendar-year')).toBeTruthy();
});
});