expression.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  1. var util = require('util');
  2. var test = require('tap').test;
  3. var CronExpression = require('../lib/expression');
  4. var CronDate = require('../lib/date');
  5. test('empty expression test', function(t) {
  6. try {
  7. var interval = CronExpression.parse('');
  8. t.ok(interval, 'Interval parsed');
  9. var date = new CronDate();
  10. date.addMinute();
  11. var next = interval.next();
  12. t.ok(next, 'Found next scheduled interval');
  13. t.equal(next.getMinutes(), date.getMinutes(), 'Schedule matches');
  14. t.end();
  15. } catch (err) {
  16. t.ifError(err, 'Interval parse error');
  17. }
  18. });
  19. test('default expression test', function(t) {
  20. try {
  21. var interval = CronExpression.parse('* * * * *');
  22. t.ok(interval, 'Interval parsed');
  23. var date = new CronDate();
  24. date.addMinute();
  25. var next = interval.next();
  26. t.ok(next, 'Found next scheduled interval');
  27. t.equal(next.getMinutes(), date.getMinutes(), 'Schedule matches');
  28. } catch (err) {
  29. t.ifError(err, 'Interval parse error');
  30. }
  31. t.end();
  32. });
  33. test('second value out of the range', function(t) {
  34. try {
  35. CronExpression.parse('61 * * * * *');
  36. } catch (err) {
  37. t.ok(err, 'Error expected');
  38. t.equal(err.message, 'Constraint error, got value 61 expected range 0-59');
  39. }
  40. t.end();
  41. });
  42. test('second value out of the range', function(t) {
  43. try {
  44. CronExpression.parse('-1 * * * * *');
  45. } catch (err) {
  46. t.ok(err, 'Error expected');
  47. t.equal(err.message, 'Constraint error, got value -1 expected range 0-59');
  48. }
  49. t.end();
  50. });
  51. test('minute value out of the range', function(t) {
  52. try {
  53. CronExpression.parse('* 32,72 * * * *');
  54. } catch (err) {
  55. t.ok(err, 'Error expected');
  56. t.equal(err.message, 'Constraint error, got value 72 expected range 0-59');
  57. }
  58. t.end();
  59. });
  60. test('hour value out of the range', function(t) {
  61. try {
  62. CronExpression.parse('* * 12-36 * * *');
  63. } catch (err) {
  64. t.ok(err, 'Error expected');
  65. t.equal(err.message, 'Constraint error, got range 12-36 expected range 0-23');
  66. }
  67. t.end();
  68. });
  69. test('day of the month value out of the range', function(t) {
  70. try {
  71. CronExpression.parse('* * * 10-15,40 * *');
  72. } catch (err) {
  73. t.ok(err, 'Error expected');
  74. t.equal(err.message, 'Constraint error, got value 40 expected range 1-31');
  75. }
  76. t.end();
  77. });
  78. test('month value out of the range', function(t) {
  79. try {
  80. CronExpression.parse('* * * * */10,12-13 *');
  81. } catch (err) {
  82. t.ok(err, 'Error expected');
  83. t.equal(err.message, 'Constraint error, got range 12-13 expected range 1-12');
  84. }
  85. t.end();
  86. });
  87. test('day of the week value out of the range', function(t) {
  88. try {
  89. CronExpression.parse('* * * * * 9');
  90. } catch (err) {
  91. t.ok(err, 'Error expected');
  92. t.equal(err.message, 'Constraint error, got value 9 expected range 0-7');
  93. }
  94. t.end();
  95. });
  96. test('incremental minutes expression test', function(t) {
  97. try {
  98. var interval = CronExpression.parse('*/3 * * * *');
  99. t.ok(interval, 'Interval parsed');
  100. var next = interval.next();
  101. t.ok(next, 'Found next scheduled interval');
  102. t.equal(next.getMinutes() % 3, 0, 'Schedule matches');
  103. } catch (err) {
  104. t.ifError(err, 'Interval parse error');
  105. }
  106. t.end();
  107. });
  108. test('fixed expression test', function(t) {
  109. try {
  110. var interval = CronExpression.parse('10 2 12 8 0');
  111. t.ok(interval, 'Interval parsed');
  112. var next = interval.next();
  113. t.ok(next, 'Found next scheduled interval');
  114. t.equal(next.getDay(), 0, 'Day matches');
  115. t.equal(next.getMonth(), 7, 'Month matches');
  116. t.equal(next.getDate(), 12, 'Day of month matches');
  117. t.equal(next.getHours(), 2, 'Hour matches');
  118. t.equal(next.getMinutes(), 10, 'Minute matches');
  119. } catch (err) {
  120. t.ifError(err, 'Interval parse error');
  121. }
  122. t.end();
  123. });
  124. test('invalid characters test - symbol', function(t) {
  125. try {
  126. CronExpression.parse('10 ! 12 8 0');
  127. } catch (err) {
  128. t.ok(err, 'Error expected');
  129. t.equal(err.message, 'Invalid characters, got value: !');
  130. }
  131. t.end();
  132. });
  133. test('invalid characters test - letter', function(t) {
  134. try {
  135. CronExpression.parse('10 x 12 8 0');
  136. } catch (err) {
  137. t.ok(err, 'Error expected');
  138. t.equal(err.message, 'Invalid characters, got value: x');
  139. }
  140. t.end();
  141. });
  142. test('invalid characters test - parentheses', function(t) {
  143. try {
  144. CronExpression.parse('10 ) 12 8 0');
  145. } catch (err) {
  146. t.ok(err, 'Error expected');
  147. t.equal(err.message, 'Invalid characters, got value: )');
  148. }
  149. t.end();
  150. });
  151. test('interval with invalid characters test', function(t) {
  152. try {
  153. CronExpression.parse('10 */A 12 8 0');
  154. } catch (err) {
  155. t.ok(err, 'Error expected');
  156. t.equal(err.message, 'Invalid characters, got value: */A');
  157. }
  158. t.end();
  159. });
  160. test('range with invalid characters test', function(t) {
  161. try {
  162. CronExpression.parse('10 0-z 12 8 0');
  163. } catch (err) {
  164. t.ok(err, 'Error expected');
  165. t.equal(err.message, 'Invalid characters, got value: 0-z');
  166. }
  167. t.end();
  168. });
  169. test('group with invalid characters test', function(t) {
  170. try {
  171. CronExpression.parse('10 0,1,z 12 8 0');
  172. } catch (err) {
  173. t.ok(err, 'Error expected');
  174. t.equal(err.message, 'Invalid characters, got value: 0,1,z');
  175. }
  176. t.end();
  177. });
  178. test('range test with iterator', function(t) {
  179. try {
  180. var interval = CronExpression.parse('10-30 2 12 8 0');
  181. t.ok(interval, 'Interval parsed');
  182. var intervals = interval.iterate(20);
  183. t.ok(intervals, 'Found intervals');
  184. for (var i = 0, c = intervals.length; i < c; i++) {
  185. var next = intervals[i];
  186. t.ok(next, 'Found next scheduled interval');
  187. t.equal(next.getDay(), 0, 'Day matches');
  188. t.equal(next.getMonth(), 7, 'Month matches');
  189. t.equal(next.getDate(), 12, 'Day of month matches');
  190. t.equal(next.getHours(), 2, 'Hour matches');
  191. t.equal(next.getMinutes(), 10 + i, 'Minute matches');
  192. }
  193. } catch (err) {
  194. t.ifError(err, 'Interval parse error');
  195. }
  196. t.end();
  197. });
  198. test('incremental range test with iterator', function(t) {
  199. try {
  200. var interval = CronExpression.parse('10-30/2 2 12 8 0');
  201. t.ok(interval, 'Interval parsed');
  202. var intervals = interval.iterate(10);
  203. t.ok(intervals, 'Found intervals');
  204. for (var i = 0, c = intervals.length; i < c; i++) {
  205. var next = intervals[i];
  206. t.ok(next, 'Found next scheduled interval');
  207. t.equal(next.getDay(), 0, 'Day matches');
  208. t.equal(next.getMonth(), 7, 'Month matches');
  209. t.equal(next.getDate(), 12, 'Day of month matches');
  210. t.equal(next.getHours(), 2, 'Hour matches');
  211. t.equal(next.getMinutes(), 10 + (i * 2), 'Minute matches');
  212. }
  213. } catch (err) {
  214. t.ifError(err, 'Interval parse error');
  215. }
  216. t.end();
  217. });
  218. test('predefined expression', function(t) {
  219. try {
  220. var interval = CronExpression.parse('@yearly');
  221. t.ok(interval, 'Interval parsed');
  222. var date = new CronDate();
  223. date.addYear();
  224. var next = interval.next();
  225. t.ok(next, 'Found next scheduled interval');
  226. t.equal(next.getFullYear(), date.getFullYear(), 'Year matches');
  227. } catch (err) {
  228. t.ifError(err, 'Interval parse error');
  229. }
  230. t.end();
  231. });
  232. test('expression limited with start and end date', function(t) {
  233. try {
  234. var options = {
  235. currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'),
  236. endDate: new CronDate('Wed, 26 Dec 2012 16:40:00')
  237. };
  238. var interval = CronExpression.parse('*/20 * * * *', options);
  239. t.ok(interval, 'Interval parsed');
  240. var dates = interval.iterate(10);
  241. t.equal(dates.length, 7, 'Dates count matches');
  242. interval.reset(); // Reset
  243. var next = interval.next();
  244. t.equal(next.getHours(), 14, 'Hour matches');
  245. t.equal(next.getMinutes(), 40, 'Minute matches');
  246. next = interval.next();
  247. t.equal(next.getHours(), 15, 'Hour matches');
  248. t.equal(next.getMinutes(), 0, 'Minute matches');
  249. next = interval.next();
  250. t.equal(next.getHours(), 15, 'Hour matches');
  251. t.equal(next.getMinutes(), 20, 'Minute matches');
  252. next = interval.next();
  253. t.equal(next.getHours(), 15, 'Hour matches');
  254. t.equal(next.getMinutes(), 40, 'Minute matches');
  255. next = interval.next();
  256. t.equal(next.getHours(), 16, 'Hour matches');
  257. t.equal(next.getMinutes(), 0, 'Minute matches');
  258. next = interval.next();
  259. t.equal(next.getHours(), 16, 'Hour matches');
  260. t.equal(next.getMinutes(), 20, 'Minute matches');
  261. next = interval.next();
  262. t.equal(next.getHours(), 16, 'Hour matches');
  263. t.equal(next.getMinutes(), 40, 'Minute matches');
  264. try {
  265. interval.next();
  266. t.ok(false, 'Should fail');
  267. } catch (e) {
  268. t.ok(true, 'Failed as expected');
  269. }
  270. } catch (err) {
  271. t.ifError(err, 'Interval parse error');
  272. }
  273. t.end();
  274. });
  275. test('parse expression as UTC', function(t) {
  276. try {
  277. var options = {
  278. utc: true
  279. };
  280. var interval = CronExpression.parse('0 0 10 * * *', options);
  281. var date = interval.next();
  282. t.equal(date.getUTCHours(), 10, 'Correct UTC hour value');
  283. interval = CronExpression.parse('0 */5 * * * *', options);
  284. var date = interval.next(), now = new Date();
  285. now.setMinutes(now.getMinutes() + 5 - (now.getMinutes() % 5));
  286. t.equal(date.getHours(), now.getHours(), 'Correct local time for 5 minute interval');
  287. } catch (err) {
  288. t.ifError(err, 'UTC parse error');
  289. }
  290. t.end();
  291. });
  292. test('expression using days of week strings', function(t) {
  293. try {
  294. var interval = CronExpression.parse('15 10 * * MON-TUE');
  295. t.ok(interval, 'Interval parsed');
  296. var intervals = interval.iterate(8);
  297. t.ok(intervals, 'Found intervals');
  298. for (var i = 0, c = intervals.length; i < c; i++) {
  299. var next = intervals[i];
  300. var day = next.getDay();
  301. t.ok(next, 'Found next scheduled interval');
  302. t.ok(day == 1 || day == 2, 'Day matches')
  303. t.equal(next.getHours(), 10, 'Hour matches');
  304. t.equal(next.getMinutes(), 15, 'Minute matches');
  305. }
  306. } catch (err) {
  307. t.ifError(err, 'Interval parse error');
  308. }
  309. t.end();
  310. });
  311. test('expression using mixed days of week strings', function(t) {
  312. try {
  313. var options = {
  314. currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53')
  315. };
  316. var interval = CronExpression.parse('15 10 * jAn-FeB mOn-tUE', options);
  317. t.ok(interval, 'Interval parsed');
  318. var intervals = interval.iterate(8);
  319. t.ok(intervals, 'Found intervals');
  320. for (var i = 0, c = intervals.length; i < c; i++) {
  321. var next = intervals[i];
  322. var day = next.getDay();
  323. var month = next.getMonth();
  324. t.ok(next, 'Found next scheduled interval');
  325. t.ok(month == 0 || month == 2, 'Month Matches');
  326. t.ok(day == 1 || day == 2, 'Day matches');
  327. t.equal(next.getHours(), 10, 'Hour matches');
  328. t.equal(next.getMinutes(), 15, 'Minute matches');
  329. }
  330. } catch (err) {
  331. t.ifError(err, 'Interval parse error');
  332. }
  333. t.end();
  334. });
  335. test('expression using non-standard second field (wildcard)', function(t) {
  336. try {
  337. var options = {
  338. currentDate: new CronDate('Wed, 26 Dec 2012 14:38:00'),
  339. endDate: new CronDate('Wed, 26 Dec 2012 15:40:00')
  340. };
  341. var interval = CronExpression.parse('* * * * * *', options);
  342. t.ok(interval, 'Interval parsed');
  343. var intervals = interval.iterate(10);
  344. t.ok(intervals, 'Found intervals');
  345. for (var i = 0, c = intervals.length; i < c; i++) {
  346. var next = intervals[i];
  347. t.ok(next, 'Found next scheduled interval');
  348. t.equal(next.getSeconds(), i + 1, 'Second matches');
  349. }
  350. } catch (err) {
  351. t.ifError(err, 'Interval parse error');
  352. }
  353. t.end();
  354. });
  355. test('expression using non-standard second field (step)', function(t) {
  356. try {
  357. var options = {
  358. currentDate: new CronDate('Wed, 26 Dec 2012 14:38:00'),
  359. endDate: new CronDate('Wed, 26 Dec 2012 15:40:00')
  360. };
  361. var interval = CronExpression.parse('*/20 * * * * *', options);
  362. t.ok(interval, 'Interval parsed');
  363. var intervals = interval.iterate(3);
  364. t.ok(intervals, 'Found intervals');
  365. t.equal(intervals[0].getSeconds(), 20, 'Second matches');
  366. t.equal(intervals[1].getSeconds(), 40, 'Second matches');
  367. t.equal(intervals[2].getSeconds(), 0, 'Second matches');
  368. } catch (err) {
  369. t.ifError(err, 'Interval parse error');
  370. }
  371. t.end();
  372. });
  373. test('expression using non-standard second field (range)', function(t) {
  374. try {
  375. var options = {
  376. currentDate: new CronDate('Wed, 26 Dec 2012 14:38:00'),
  377. endDate: new CronDate('Wed, 26 Dec 2012 15:40:00')
  378. };
  379. var interval = CronExpression.parse('20-40/10 * * * * *', options);
  380. t.ok(interval, 'Interval parsed');
  381. var intervals = interval.iterate(3);
  382. t.ok(intervals, 'Found intervals');
  383. for (var i = 0, c = intervals.length; i < c; i++) {
  384. var next = intervals[i];
  385. t.ok(next, 'Found next scheduled interval');
  386. t.equal(next.getSeconds(), 20 + (i * 10), 'Second matches');
  387. }
  388. } catch (err) {
  389. t.ifError(err, 'Interval parse error');
  390. }
  391. t.end();
  392. });
  393. test('day of month and week are both set', function(t) {
  394. try {
  395. var interval = CronExpression.parse('10 2 12 8 0');
  396. t.ok(interval, 'Interval parsed');
  397. var next = interval.next();
  398. t.ok(next, 'Found next scheduled interval');
  399. t.equal(next.getDay(), 0, 'Day matches');
  400. t.equal(next.getMonth(), 7, 'Month matches');
  401. t.equal(next.getDate(), 12, 'Day of month matches');
  402. next = interval.next();
  403. t.ok(next, 'Found next scheduled interval');
  404. t.equal(next.getDay(), 0, 'Day matches');
  405. t.equal(next.getMonth(), 7, 'Month matches');
  406. t.equal(next.getDate(), 12, 'Day of month matches');
  407. next = interval.next();
  408. t.ok(next, 'Found next scheduled interval');
  409. t.equal(next.getDay(), 0, 'Day matches');
  410. t.equal(next.getMonth(), 7, 'Month matches');
  411. t.equal(next.getDate(), 12, 'Day of month matches');
  412. next = interval.next();
  413. t.ok(next, 'Found next scheduled interval');
  414. t.equal(next.getDay(), 0, 'Day matches');
  415. t.equal(next.getMonth(), 7, 'Month matches');
  416. t.equal(next.getDate(), 12, 'Day of month matches');
  417. } catch (err) {
  418. t.ifError(err, 'Interval parse error');
  419. }
  420. t.end();
  421. });
  422. test('Summertime bug test', function(t) {
  423. try {
  424. var month = new CronDate().getMonth() + 1;
  425. var interval = CronExpression.parse('0 0 0 1 '+month+' *');
  426. t.ok(interval, 'Interval parsed');
  427. var next = interval.next();
  428. // Before fix the bug it was getting a timeout error if you are
  429. // in a timezone that changes the DST to ST in the hour 00:00h.
  430. t.ok(next, 'Found next scheduled interval');
  431. } catch (err) {
  432. t.ifError(err, 'Interval parse error');
  433. }
  434. t.end();
  435. });
  436. test('day of month and week are both set and dow is 7', function(t) {
  437. try {
  438. var interval = CronExpression.parse('10 2 12 8 7');
  439. t.ok(interval, 'Interval parsed');
  440. var next = interval.next();
  441. t.ok(next, 'Found next scheduled interval');
  442. t.equal(next.getDay(), 0, 'Day matches');
  443. t.equal(next.getMonth(), 7, 'Month matches');
  444. t.equal(next.getDate(), 12, 'Day of month matches');
  445. next = interval.next();
  446. t.ok(next, 'Found next scheduled interval');
  447. t.equal(next.getDay(), 0, 'Day matches');
  448. t.equal(next.getMonth(), 7, 'Month matches');
  449. t.equal(next.getDate(), 12, 'Day of month matches');
  450. next = interval.next();
  451. t.ok(next, 'Found next scheduled interval');
  452. t.equal(next.getDay(), 0, 'Day matches');
  453. t.equal(next.getMonth(), 7, 'Month matches');
  454. t.equal(next.getDate(), 12, 'Day of month matches');
  455. next = interval.next();
  456. t.ok(next, 'Found next scheduled interval');
  457. t.equal(next.getDay(), 0, 'Day matches');
  458. t.equal(next.getMonth(), 7, 'Month matches');
  459. t.equal(next.getDate(), 12, 'Day of month matches');
  460. } catch (err) {
  461. t.ifError(err, 'Interval parse error');
  462. }
  463. t.end();
  464. });
  465. test('day of month and week are both set and dow is 6,0', function(t) {
  466. try {
  467. var interval = CronExpression.parse('10 2 12 8 6,0');
  468. t.ok(interval, 'Interval parsed');
  469. var next = interval.next();
  470. t.ok(next, 'Found next scheduled interval');
  471. t.equal(next.getDay(), 6, 'Day matches');
  472. t.equal(next.getMonth(), 7, 'Month matches');
  473. t.equal(next.getDate(), 12, 'Day of month matches');
  474. next = interval.next();
  475. t.ok(next, 'Found next scheduled interval');
  476. t.equal(next.getDay(), 6, 'Day matches');
  477. t.equal(next.getMonth(), 7, 'Month matches');
  478. t.equal(next.getDate(), 12, 'Day of month matches');
  479. next = interval.next();
  480. t.ok(next, 'Found next scheduled interval');
  481. t.equal(next.getDay(), 6, 'Day matches');
  482. t.equal(next.getMonth(), 7, 'Month matches');
  483. t.equal(next.getDate(), 12, 'Day of month matches');
  484. // next = interval.next();
  485. t.ok(next, 'Found next scheduled interval');
  486. t.equal(next.getDay(), 6, 'Day matches');
  487. t.equal(next.getMonth(), 7, 'Month matches');
  488. t.equal(next.getDate(), 12, 'Day of month matches');
  489. } catch (err) {
  490. t.ifError(err, 'Interval parse error');
  491. }
  492. t.end();
  493. });
  494. test('day of month and week are both set and dow is 6-7', function(t) {
  495. try {
  496. var interval = CronExpression.parse('10 2 12 8 6-7');
  497. t.ok(interval, 'Interval parsed');
  498. var next = interval.next();
  499. t.ok(next, 'Found next scheduled interval');
  500. t.equal(next.getDay(), 6, 'Day matches');
  501. t.equal(next.getMonth(), 7, 'Month matches');
  502. t.equal(next.getDate(), 12, 'Day of month matches');
  503. next = interval.next();
  504. t.ok(next, 'Found next scheduled interval');
  505. t.equal(next.getDay(), 6, 'Day matches');
  506. t.equal(next.getMonth(), 7, 'Month matches');
  507. t.equal(next.getDate(), 12, 'Day of month matches');
  508. next = interval.next();
  509. t.ok(next, 'Found next scheduled interval');
  510. t.equal(next.getDay(), 6, 'Day matches');
  511. t.equal(next.getMonth(), 7, 'Month matches');
  512. t.equal(next.getDate(), 12, 'Day of month matches');
  513. // next = interval.next();
  514. t.ok(next, 'Found next scheduled interval');
  515. t.equal(next.getDay(), 6, 'Day matches');
  516. t.equal(next.getMonth(), 7, 'Month matches');
  517. t.equal(next.getDate(), 12, 'Day of month matches');
  518. } catch (err) {
  519. t.ifError(err, 'Interval parse error');
  520. }
  521. t.end();
  522. });
  523. test('day and date in week should matches', function(t){
  524. try {
  525. var interval = CronExpression.parse('0 1 1 1 * 1');
  526. t.ok(interval, 'Interval parsed');
  527. var next = interval.next();
  528. t.ok(next, 'Found next scheduled interval');
  529. t.equal(next.getHours(), 1, 'Hours matches');
  530. t.equal(next.getDay(), 1, 'Day matches');
  531. t.equal(next.getDate(), 1, 'Day of month matches');
  532. next = interval.next();
  533. t.ok(next, 'Found next scheduled interval');
  534. t.equal(next.getHours(), 1, 'Hours matches');
  535. t.equal(next.getDay(), 1, 'Day matches');
  536. t.equal(next.getDate(), 1, 'Day of month matches');
  537. next = interval.next();
  538. t.ok(next, 'Found next scheduled interval');
  539. t.equal(next.getHours(), 1, 'Hours matches');
  540. t.equal(next.getDay(), 1, 'Day matches');
  541. t.equal(next.getDate(), 1, 'Day of month matches');
  542. } catch (err) {
  543. t.ifError(err, 'Interval parse error');
  544. }
  545. t.end();
  546. });
  547. test('day of month value can\'t be larger than days in month maximum value if it\'s defined explicitly', function(t) {
  548. try {
  549. var interval = CronExpression.parse('0 4 30 2 *');
  550. t.ok(interval, 'Interval parsed');
  551. try {
  552. interval.next();
  553. t.ok(false, 'Should fail');
  554. } catch (e) {
  555. t.ok(true, 'Failed as expected');
  556. }
  557. } catch (err) {
  558. t.ifError(err, 'Interval parse error');
  559. }
  560. t.end();
  561. });
  562. test('valid ES6 iterator should be returned if iterator options is set to true', function(t) {
  563. try {
  564. var options = {
  565. currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'),
  566. endDate: new CronDate('Wed, 26 Dec 2012 15:40:00'),
  567. iterator: true
  568. };
  569. var val = null;
  570. var interval = CronExpression.parse('*/25 * * * *', options);
  571. t.ok(interval, 'Interval parsed');
  572. val = interval.next();
  573. t.ok(val, 'Next iteration resolved');
  574. t.ok(val.value, 'Iterator value is set');
  575. t.notOk(val.done, 'Iterator is not finished');
  576. val = interval.next();
  577. t.ok(val, 'Next iteration resolved');
  578. t.ok(val.value, 'Iterator value is set');
  579. t.notOk(val.done, 'Iterator is not finished');
  580. val = interval.next();
  581. t.ok(val, 'Next iteration resolved');
  582. t.ok(val.value, 'Iterator value is set');
  583. t.ok(val.done, 'Iterator is finished');
  584. } catch (err) {
  585. t.ifError(err, 'Interval parse error');
  586. }
  587. t.end();
  588. });
  589. test('Must not parse an expression which has repeat 0 times', function(t) {
  590. try {
  591. var expression = CronExpression.parse('0 */0 * * *');
  592. var val = expression.next();
  593. } catch (err) {
  594. t.ok(err, 'Error expected');
  595. t.equal(err.message, 'Constraint error, cannot repeat at every 0 time.');
  596. }
  597. t.end();
  598. });
  599. test('Must not parse an expression which has repeat negative number times', function(t) {
  600. try {
  601. var expression = CronExpression.parse('0 */-5 * * *');
  602. var val = expression.next();
  603. } catch (err) {
  604. t.ok(err, 'Error expected');
  605. t.equal(err.message, 'Constraint error, cannot repeat at every -5 time.');
  606. }
  607. t.end();
  608. });