parse-messy-schedule
Version:
parse recurring or one-off scheduled events from free-form text
274 lines (259 loc) • 6.76 kB
JavaScript
var test = require('tape')
var parse = require('../')
var strftime = require('strftime')
test('one-off event (tomorrow)', function (t) {
var str = 'DMV tomorrow at 10:30'
var ev = parse(str, { created: new Date('2015-12-10 03:00') })
t.equal(ev.oneTime, true)
t.equal(ev.title, 'DMV')
t.equal(
ev.next('2015-12-10 03:00').toString().replace(/ GMT.*/, ''),
'Fri Dec 11 2015 10:30:00'
)
t.equal(
ev.next('2015-12-11 10:00').toString().replace(/ GMT.*/, ''),
'Fri Dec 11 2015 10:30:00'
)
t.equal(ev.next('2015-12-11 11:00'), null)
t.end()
})
test('one-off event (day)', function (t) {
var str = 'DMV friday at 10:30'
var ev = parse(str, { created: new Date('2015-12-10 03:00') })
t.equal(ev.oneTime, true)
t.equal(ev.title, 'DMV')
t.equal(
ev.next('2015-12-10 03:00').toString().replace(/ GMT.*/, ''),
'Fri Dec 11 2015 10:30:00'
)
t.equal(
ev.next('2015-12-11 10:00').toString().replace(/ GMT.*/, ''),
'Fri Dec 11 2015 10:30:00'
)
t.equal(ev.next('2015-12-11 11:00'), null)
t.end()
})
test('thursdays', function (t) {
var str = 'javascript study group thursdays at 7 pm'
var ev = parse(str, { created: new Date('2015-12-10 03:00') })
t.equal(ev.oneTime, false)
var n = '2015-12-10 03:00', outputs = []
for (var i = 0; i < 3; i++) {
n = ev.next(n)
if (!n) break
outputs.push(n.toString().replace(/ GMT.*/, ''))
}
t.deepEqual(outputs, [
'Thu Dec 10 2015 19:00:00',
'Thu Dec 17 2015 19:00:00',
'Thu Dec 24 2015 19:00:00'
])
t.end()
})
test('every other starting until', function (t) {
var str = 'oakland wiki 18:30 every other wednesday'
+ ' starting dec 2 until dec 23'
var ev = parse(str, { created: new Date('2015-12-10 03:00') })
t.equal(ev.oneTime, false)
var n = '2015-12-10 03:00', outputs = []
for (var i = 0; i < 3; i++) {
n = ev.next(n)
if (!n) break
outputs.push(n.toString().replace(/ GMT.*/, ''))
}
t.deepEqual(outputs, [
'Wed Dec 16 2015 18:30:00'
])
t.end()
})
test('every other starting until', function (t) {
var str = 'oakland wiki 18:30 every other wednesday'
+ ' starting dec 2 until dec 30'
var ev = parse(str, { created: new Date('2015-12-10 03:00') })
t.equal(ev.oneTime, false)
var n = '2015-12-10 03:00', outputs = []
for (var i = 0; i < 3; i++) {
n = ev.next(n)
if (!n) break
outputs.push(n.toString().replace(/ GMT.*/, ''))
}
t.deepEqual(outputs, [
'Wed Dec 16 2015 18:30:00',
'Wed Dec 30 2015 18:30:00'
])
t.end()
})
test('every day', function (t) {
var str = 'every day at 7 pm'
var ev = parse(str, { created: new Date('2015-12-10 03:00') })
t.equal(ev.oneTime, false)
var n = '2015-12-10 03:00', outputs = []
for (var i = 0; i < 3; i++) {
n = ev.next(n)
if (!n) break
outputs.push(n.toString().replace(/ GMT.*/, ''))
}
t.deepEqual(outputs, [
'Thu Dec 10 2015 19:00:00',
'Fri Dec 11 2015 19:00:00',
'Sat Dec 12 2015 19:00:00'
])
t.end()
})
test('using quotes to escape titles', function (t) {
var str = '"linux installfest friday" friday at 21:00'
var ev = parse(str, { created: new Date('2015-12-09 03:00') })
t.equal(ev.oneTime, true)
t.equal(ev.title, 'linux installfest friday')
t.equal(
ev.next('2015-12-09 03:00').toString().replace(/ GMT.*/, ''),
'Fri Dec 11 2015 21:00:00'
)
t.equal(ev.next('2015-12-12 10:00'), null)
t.end()
})
test('every every', function (t) {
var str = 'every body dance each friday at 3pm'
var ev = parse(str)
t.equal(ev.title, 'every body dance')
t.equal(
strftime('%F %T', ev.next('2015-12-09 12:00')),
'2015-12-11 15:00:00'
)
t.end()
})
test('taco tuesdays', function (t) {
var str = 'taco tuesdays each tuesday at 6pm'
var ev = parse(str)
t.equal(ev.title, 'taco tuesdays')
t.equal(
strftime('%F %T', ev.next('2015-12-09 12:00')),
'2015-12-15 18:00:00'
)
t.end()
})
test('every day next', function (t) {
var str = 'every day at 12:00 starting jan 15 until feb 10'
var ev = parse(str, { created: new Date('2015-12-25') })
var d = new Date('2016-01-01 00:00')
var dates = []
for (var i = 0; i < 20; i++) {
d = ev.next(d)
dates.push(strftime('%F %T', d))
}
t.deepEqual(dates, [
'2016-01-15 12:00:00',
'2016-01-16 12:00:00',
'2016-01-17 12:00:00',
'2016-01-18 12:00:00',
'2016-01-19 12:00:00',
'2016-01-20 12:00:00',
'2016-01-21 12:00:00',
'2016-01-22 12:00:00',
'2016-01-23 12:00:00',
'2016-01-24 12:00:00',
'2016-01-25 12:00:00',
'2016-01-26 12:00:00',
'2016-01-27 12:00:00',
'2016-01-28 12:00:00',
'2016-01-29 12:00:00',
'2016-01-30 12:00:00',
'2016-01-31 12:00:00',
'2016-02-01 12:00:00',
'2016-02-02 12:00:00',
'2016-02-03 12:00:00'
])
t.end()
})
test('the 1st', function (t) {
var str = 'the 1st'
var ev = parse(str, { created: new Date('2016-06-01') })
var d = new Date('2016-06-10 00:00')
var dates = []
for (var i = 0; i < 10; i++) {
d = ev.next(d)
dates.push(strftime('%F', d))
}
t.deepEqual(dates, [
'2016-07-01',
'2016-08-01',
'2016-09-01',
'2016-10-01',
'2016-11-01',
'2016-12-01',
'2017-01-01',
'2017-02-01',
'2017-03-01',
'2017-04-01'
])
t.end()
})
test('the 15th', function (t) {
var str = 'the 15th'
var ev = parse(str, { created: new Date('2016-06-01') })
var d = new Date('2016-06-10 00:00')
var dates = []
for (var i = 0; i < 10; i++) {
d = ev.next(d)
dates.push(strftime('%F', d))
}
t.deepEqual(dates, [
'2016-06-15',
'2016-07-15',
'2016-08-15',
'2016-09-15',
'2016-10-15',
'2016-11-15',
'2016-12-15',
'2017-01-15',
'2017-02-15',
'2017-03-15'
])
t.end()
})
test('every oct 31st', function (t) {
var str = 'every oct 31st'
var ev = parse(str, { created: new Date('2016-06-01') })
var d = new Date('2016-06-10 00:00')
var dates = []
for (var i = 0; i < 10; i++) {
d = ev.next(d)
dates.push(strftime('%F', d))
}
t.deepEqual(dates, [
'2016-10-31',
'2017-10-31',
'2018-10-31',
'2019-10-31',
'2020-10-31',
'2021-10-31',
'2022-10-31',
'2023-10-31',
'2024-10-31',
'2025-10-31'
])
t.end()
})
test('every oct 31', function (t) {
var str = 'every oct 31'
var ev = parse(str, { created: new Date('2016-06-01') })
var d = new Date('2016-06-10 00:00')
var dates = []
for (var i = 0; i < 10; i++) {
d = ev.next(d)
dates.push(strftime('%F', d))
}
t.deepEqual(dates, [
'2016-10-31',
'2017-10-31',
'2018-10-31',
'2019-10-31',
'2020-10-31',
'2021-10-31',
'2022-10-31',
'2023-10-31',
'2024-10-31',
'2025-10-31'
])
t.end()
})