diff --git a/tests/lib/jasmine-ext.js b/tests/lib/jasmine-ext.js index 785ec94..25ecbcd 100644 --- a/tests/lib/jasmine-ext.js +++ b/tests/lib/jasmine-ext.js @@ -1,27 +1,64 @@ beforeEach(function() { + jasmine.addMatchers({ toEqualMoment: function() { return { compare: function(actual, expected) { - return { - pass: $.fullCalendar.moment.parseZone(actual).format() === - $.fullCalendar.moment.parseZone(expected).format() + var actualStr = $.fullCalendar.moment.parseZone(actual).format(); + var expectedStr = $.fullCalendar.moment.parseZone(expected).format(); + var result = { + pass: actualStr === expectedStr }; + if (!result.pass) { + result.message = 'Moment ' + actualStr + ' does not equal ' + expectedStr; + } + return result; } }; }, toEqualNow: function() { return { compare: function(actual) { - return { - pass: Math.abs( - $.fullCalendar.moment.parseZone(actual) - - new Date() - ) < 1000 // within a second of current datetime + var actualMoment = $.fullCalendar.moment.parseZone(actual); + var result = { + pass: Math.abs(actualMoment - new Date()) < 1000 // within a second of current datetime }; + if (!result.pass) { + result.message = 'Moment ' + actualMoment.format() + ' is not close enough to now'; + } + return result; + } + }; + }, + toEqualDuration: function() { + return { + compare: function(actual, expected) { + var actualStr = serializeDuration(moment.duration(actual)); + var expectedStr = serializeDuration(moment.duration(expected)); + var result = { + pass: actualStr === expectedStr + }; + if (!result.pass) { + result.message = 'Duration ' + actualStr + ' does not equal ' + expectedStr; + } + return result; } }; } }); -}); \ No newline at end of file + + function serializeDuration(duration) { + return Math.floor(duration.asDays()) + '.' + + pad(duration.hours(), 2) + ':' + + pad(duration.minutes(), 2) + ':' + + pad(duration.seconds(), 2) + '.' + + pad(duration.milliseconds(), 3); + } + + function pad(n, width) { + n = n + ''; + return n.length >= width ? n : new Array(width - n.length + 1).join('0') + n; + } + +});