mirror of https://github.com/IoTcat/cron-git.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
376 lines
11 KiB
376 lines
11 KiB
5 years ago
|
|
||
|
'use strict';
|
||
|
|
||
|
var main = require('../package.json').main;
|
||
|
var schedule = require('../' + main);
|
||
|
var sinon = require('sinon');
|
||
|
var clock;
|
||
|
|
||
|
// 12:30:15 pm Thursday 29 April 2010 in the timezone this code is being run in
|
||
|
var base = new Date(2010, 3, 29, 12, 30, 15, 0);
|
||
|
var baseMs = base.getTime();
|
||
|
|
||
|
module.exports = {
|
||
|
"setUp": function(cb) {
|
||
|
clock = sinon.useFakeTimers(baseMs);
|
||
|
cb();
|
||
|
},
|
||
|
"tearDown": function(cb) {
|
||
|
clock.restore();
|
||
|
cb();
|
||
|
},
|
||
|
"#nextInvocationDate(Date)": {
|
||
|
"next second": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.second = null;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.deepEqual(new Date(2010, 3, 29, 12, 30, 16, 0), next);
|
||
|
test.done();
|
||
|
},
|
||
|
"next 25th second": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.second = 25;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.deepEqual(new Date(2010, 3, 29, 12, 30, 25, 0), next);
|
||
|
test.done();
|
||
|
},
|
||
|
"next 5th second (minutes incremented)": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.second = 5;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.deepEqual(new Date(2010, 3, 29, 12, 31, 5, 0), next);
|
||
|
test.done();
|
||
|
},
|
||
|
"next 40th minute": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.minute = 40;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.deepEqual(new Date(2010, 3, 29, 12, 40, 0, 0), next);
|
||
|
test.done();
|
||
|
},
|
||
|
"next 1st minute (hours incremented)": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.minute = 1;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.deepEqual(new Date(2010, 3, 29, 13, 1, 0, 0), next);
|
||
|
test.done();
|
||
|
},
|
||
|
"next 23rd hour": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.hour = 23;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.deepEqual(new Date(2010, 3, 29, 23, 0, 0, 0), next);
|
||
|
test.done();
|
||
|
},
|
||
|
"next 3rd hour (days incremented)": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.hour = 3;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.deepEqual(new Date(2010, 3, 30, 3, 0, 0, 0), next);
|
||
|
test.done();
|
||
|
},
|
||
|
"next Friday": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.dayOfWeek = 5;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.deepEqual(new Date(2010, 3, 30, 0, 0, 0, 0), next);
|
||
|
test.done();
|
||
|
},
|
||
|
"next Monday (months incremented)": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.dayOfWeek = 1;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.deepEqual(new Date(2010, 4, 3, 0, 0, 0, 0), next);
|
||
|
test.done();
|
||
|
},
|
||
|
"next 30th date": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.date = 30;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.deepEqual(new Date(2010, 3, 30, 0, 0, 0, 0), next);
|
||
|
test.done();
|
||
|
},
|
||
|
"next 5th date (months incremented)": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.date = 5;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.deepEqual(new Date(2010, 4, 5, 0, 0, 0, 0), next);
|
||
|
test.done();
|
||
|
},
|
||
|
"next October": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.month = 9;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.deepEqual(new Date(2010, 9, 1, 0, 0, 0, 0), next);
|
||
|
test.done();
|
||
|
},
|
||
|
"next February (years incremented)": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.month = 1;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.deepEqual(new Date(2011, 1, 1, 0, 0, 0, 0), next);
|
||
|
test.done();
|
||
|
},
|
||
|
"in the year 2040": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.year = 2040;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.deepEqual(new Date(2040, 0, 1, 0, 0, 0, 0), next);
|
||
|
test.done();
|
||
|
},
|
||
|
"using past year": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.year = 2000;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.equal(null, next);
|
||
|
test.done();
|
||
|
},
|
||
|
"using mixed time components": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.second = 50;
|
||
|
rule.minute = 5;
|
||
|
rule.hour = 10;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.deepEqual(new Date(2010, 3, 30, 10, 5, 50, 0), next);
|
||
|
test.done();
|
||
|
},
|
||
|
/*
|
||
|
"using date and dayOfWeek together": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.dayOfWeek = 4; // This is Thursday April 1st
|
||
|
rule.date = 10; // This is Saturday April 10th
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.deepEqual(new Date(2010, 3, 1, 0, 0, 0, 0), next);
|
||
|
test.done();
|
||
|
}*/
|
||
|
"returns null when no invocations left": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.year = 2000;
|
||
|
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
|
||
|
test.strictEqual(null, next);
|
||
|
test.done();
|
||
|
},
|
||
|
"specify span of components using Range": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.minute = new schedule.Range(4, 6);
|
||
|
|
||
|
var next;
|
||
|
|
||
|
next = rule.nextInvocationDate(base);
|
||
|
test.deepEqual(new Date(2010, 3, 29, 13, 4, 0, 0), next);
|
||
|
|
||
|
next = rule.nextInvocationDate(next);
|
||
|
test.deepEqual(new Date(2010, 3, 29, 13, 5, 0, 0), next);
|
||
|
|
||
|
next = rule.nextInvocationDate(next);
|
||
|
test.deepEqual(new Date(2010, 3, 29, 13, 6, 0, 0), next);
|
||
|
|
||
|
next = rule.nextInvocationDate(next);
|
||
|
test.deepEqual(new Date(2010, 3, 29, 14, 4, 0, 0), next);
|
||
|
|
||
|
test.done();
|
||
|
},
|
||
|
"specify intervals within span of components using Range with step": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.minute = new schedule.Range(4, 8, 2);
|
||
|
|
||
|
var next;
|
||
|
|
||
|
next = rule.nextInvocationDate(base);
|
||
|
test.deepEqual(new Date(2010, 3, 29, 13, 4, 0, 0), next);
|
||
|
|
||
|
next = rule.nextInvocationDate(next);
|
||
|
test.deepEqual(new Date(2010, 3, 29, 13, 6, 0, 0), next);
|
||
|
|
||
|
/* Should Range stay inclusive on both ends when step > 1
|
||
|
next = rule.nextInvocationDate(next);
|
||
|
test.deepEqual(new Date(2010, 3, 29, 13, 8, 0, 0), next);
|
||
|
*/
|
||
|
|
||
|
next = rule.nextInvocationDate(next);
|
||
|
test.deepEqual(new Date(2010, 3, 29, 14, 4, 0, 0), next);
|
||
|
|
||
|
test.done();
|
||
|
},
|
||
|
"specify span and explicit components using Array of Ranges and Numbers": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.minute = [2, new schedule.Range(4, 6)];
|
||
|
|
||
|
var next;
|
||
|
|
||
|
next = rule.nextInvocationDate(base);
|
||
|
test.deepEqual(new Date(2010, 3, 29, 13, 2, 0, 0), next);
|
||
|
|
||
|
next = rule.nextInvocationDate(next);
|
||
|
test.deepEqual(new Date(2010, 3, 29, 13, 4, 0, 0), next);
|
||
|
|
||
|
next = rule.nextInvocationDate(next);
|
||
|
test.deepEqual(new Date(2010, 3, 29, 13, 5, 0, 0), next);
|
||
|
|
||
|
next = rule.nextInvocationDate(next);
|
||
|
test.deepEqual(new Date(2010, 3, 29, 13, 6, 0, 0), next);
|
||
|
|
||
|
next = rule.nextInvocationDate(next);
|
||
|
test.deepEqual(new Date(2010, 3, 29, 14, 2, 0, 0), next);
|
||
|
|
||
|
test.done();
|
||
|
},
|
||
|
"From 31th May schedule the 1st of every June": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.second = 0;
|
||
|
rule.minute = 0;
|
||
|
rule.hour = 0;
|
||
|
rule.date = 1;
|
||
|
rule.month = 5;
|
||
|
|
||
|
var next;
|
||
|
var base1 = new Date(2010, 4, 31, 12, 30, 15, 0);
|
||
|
|
||
|
next = rule.nextInvocationDate(base1);
|
||
|
test.deepEqual(new Date(2010, 5, 1, 0, 0, 0, 0), next);
|
||
|
|
||
|
next = rule.nextInvocationDate(next);
|
||
|
test.deepEqual(new Date(2011, 5, 1, 0, 0, 0, 0), next);
|
||
|
|
||
|
test.done();
|
||
|
},
|
||
|
"With the year set should not loop indefinetely": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.second = 0;
|
||
|
rule.minute = 0;
|
||
|
rule.hour = 0;
|
||
|
rule.date = 1;
|
||
|
rule.month = 5;
|
||
|
rule.year = 2010;
|
||
|
|
||
|
var next;
|
||
|
var base1 = new Date(2010, 4, 31, 12, 30, 15, 0);
|
||
|
|
||
|
next = rule.nextInvocationDate(base1);
|
||
|
test.deepEqual(new Date(2010, 5, 1, 0, 0, 0, 0), next);
|
||
|
|
||
|
next = rule.nextInvocationDate(next);
|
||
|
test.equal(next, null);
|
||
|
|
||
|
test.done();
|
||
|
},
|
||
|
"using rule with string properties": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.second = '50';
|
||
|
rule.minute = '5';
|
||
|
rule.hour = '10';
|
||
|
var next = rule.nextInvocationDate(base);
|
||
|
test.deepEqual(new Date(2010, 3, 30, 10, 5, 50, 0), next);
|
||
|
test.done();
|
||
|
},
|
||
|
"nextInvocationDate on an invalid month should return null": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.month = 12;
|
||
|
var next = rule.nextInvocationDate();
|
||
|
test.equal(next, null);
|
||
|
|
||
|
var rule2 = new schedule.RecurrenceRule();
|
||
|
rule2.month = 'asdfasdf';
|
||
|
var next2 = rule2.nextInvocationDate(next);
|
||
|
test.equal(next2, null);
|
||
|
|
||
|
test.done();
|
||
|
},
|
||
|
"nextInvocationDate on an invalid second should return null": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.second = 60;
|
||
|
var next = rule.nextInvocationDate();
|
||
|
test.equal(next, null);
|
||
|
|
||
|
var rule2 = new schedule.RecurrenceRule();
|
||
|
rule2.second = 'asdfasdf';
|
||
|
var next2 = rule2.nextInvocationDate();
|
||
|
test.equal(next2, null);
|
||
|
|
||
|
test.done();
|
||
|
},
|
||
|
"nextInvocationDate on an invalid hour should return null": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.hour = 24;
|
||
|
var next = rule.nextInvocationDate();
|
||
|
test.equal(next, null);
|
||
|
|
||
|
var rule2 = new schedule.RecurrenceRule();
|
||
|
rule2.hour = 'asdfasdf';
|
||
|
var next2 = rule2.nextInvocationDate();
|
||
|
test.equal(next2, null);
|
||
|
|
||
|
test.done();
|
||
|
},
|
||
|
"nextInvocationDate on an invalid date should return null": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.date = 90;
|
||
|
var next = rule.nextInvocationDate();
|
||
|
test.equal(next, null);
|
||
|
|
||
|
// Test February
|
||
|
var rule2 = new schedule.RecurrenceRule();
|
||
|
rule2.month = 1;
|
||
|
rule2.date = 30;
|
||
|
var next2 = rule2.nextInvocationDate();
|
||
|
test.equal(next2, null);
|
||
|
|
||
|
var rule3 = new schedule.RecurrenceRule();
|
||
|
rule3.date = 'asdfasdf';
|
||
|
var next3 = rule3.nextInvocationDate();
|
||
|
test.equal(next3, null);
|
||
|
|
||
|
test.done();
|
||
|
},
|
||
|
"nextInvocationDate on an invalid dayOfWeek should return null": function(test) {
|
||
|
var rule = new schedule.RecurrenceRule();
|
||
|
rule.dayOfWeek = 90;
|
||
|
var next = rule.nextInvocationDate();
|
||
|
test.equal(next, null);
|
||
|
|
||
|
var rule2 = new schedule.RecurrenceRule();
|
||
|
rule2.dayOfWeek = 'asdfasdf';
|
||
|
var next2 = rule.nextInvocationDate();
|
||
|
test.equal(next2, null);
|
||
|
|
||
|
test.done();
|
||
|
}
|
||
|
}
|
||
|
};
|