Skip to content

Commit

Permalink
Merge pull request #42 from bchelli/master
Browse files Browse the repository at this point in the history
Fix the support of Day of week vs Day of month
  • Loading branch information
merencia committed Feb 6, 2017
2 parents c89903c + 748b1cd commit ea02aee
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 3 deletions.
18 changes: 15 additions & 3 deletions src/task.js
Expand Up @@ -15,16 +15,28 @@ module.exports = (function(){
function mustRun(task, date){
var runInSecond = matchPattern(task.expressions[0], date.getSeconds());
var runOnMinute = matchPattern(task.expressions[1], date.getMinutes());
var runOnHour = matchPattern(task.expressions[2], date.getHours());
var runOnHour = matchPattern(task.expressions[2], date.getHours());
var runOnDayOfMonth = matchPattern(task.expressions[3], date.getDate());
var runOnMonth = matchPattern(task.expressions[4], date.getMonth() + 1);
var runOnDayOfWeek = matchPattern(task.expressions[5], date.getDay());
return runInSecond && runOnMinute && runOnHour && runOnDayOfMonth &&
runOnMonth && runOnDayOfWeek;

var runOnDay = false;
var delta = task.initialPattern.length === 6 ? 0 : -1;

if (task.initialPattern[3 + delta] === '*') {
runOnDay = runOnDayOfWeek;
} else if (task.initialPattern[5 + delta] === '*') {
runOnDay = runOnDayOfMonth;
} else {
runOnDay = runOnDayOfMonth || runOnDayOfWeek;
}

return runInSecond && runOnMinute && runOnHour && runOnDay && runOnMonth;
}

function Task(pattern, execution){
validatePattern(pattern);
this.initialPattern = pattern.split(' ');
this.pattern = convertExpression(pattern);
this.execution = execution;
this.expressions = this.pattern.split(' ');
Expand Down
89 changes: 89 additions & 0 deletions test/task-week-day-day-of-month-test.js
@@ -0,0 +1,89 @@
'use strict';

var expect = require('expect.js');
var Task = require('../src/task');

describe('Task', function(){
describe('week day & day of month', function(){

it('should run on week day', function(){
var task = new Task('* * * * 1', function(){
this.executed += 1;
});
task.executed = 0;
var date = new Date(2016, 0, 1);
for (var day = 1; day <= 7; day++) {
date.setDate(day);
task.update(date);
}
expect(1).to.equal(task.executed);
});

it('should run on day of month', function(){
var task = new Task('* * 1 * *', function(){
this.executed += 1;
});
task.executed = 0;
var date = new Date(2016, 0, 1);
for (var day = 1; day <= 7; day++) {
date.setDate(day);
task.update(date);
}
expect(1).to.equal(task.executed);
});

it('should run on week day & day of month', function(){
var task = new Task('* * 1 * 1', function(){
this.executed += 1;
});
task.executed = 0;
var date = new Date(2016, 0, 1);
for (var day = 1; day <= 7; day++) {
date.setDate(day);
task.update(date);
}
expect(2).to.equal(task.executed);
});

it('should run on week day with seconds', function(){
var task = new Task('0 * * * * 1', function(){
this.executed += 1;
});
task.executed = 0;
var date = new Date(2016, 0, 1);
for (var day = 1; day <= 7; day++) {
date.setDate(day);
task.update(date);
}
expect(1).to.equal(task.executed);
});

it('should run on day of month with seconds', function(){
var task = new Task('0 * * 1 * *', function(){
this.executed += 1;
});
task.executed = 0;
var date = new Date(2016, 0, 1);
for (var day = 1; day <= 7; day++) {
date.setDate(day);
task.update(date);
}
expect(1).to.equal(task.executed);
});

it('should run on week day & day of month with seconds', function(){
var task = new Task('0 * * 1 * 1', function(){
this.executed += 1;
});
task.executed = 0;
var date = new Date(2016, 0, 1);
for (var day = 1; day <= 7; day++) {
date.setDate(day);
task.update(date);
}
expect(2).to.equal(task.executed);
});

});
});

0 comments on commit ea02aee

Please sign in to comment.