Files
2026-07-13 12:48:55 +08:00

395 lines
17 KiB
JavaScript

// a bunch of tests copy+pasted from the chronic date parser,
// by Tom Preston-Werner ❤️
// https://github.com/mojombo/chronic/edit/master/test/test_parsing.rb
import test from 'tape'
import spacetime from 'spacetime'
import nlp from './_lib.js'
const fmt = (iso) => (iso ? spacetime(iso).format('iso-short') : '-')
// eslint-disable-next-line
const mk = function (y, m, d, h, sec, mil) {
let s = spacetime.now().year(y)
if (m) {
s = s.month(m - 1)
}
if (d) {
s = s.date(d)
}
if (h) {
s = s.hour(h)
}
if (sec) {
s = s.second(sec)
}
if (mil) {
s = s.millisecond(mil)
}
return fmt(s)
}
test('chronic-tests-one', (t) => {
const arr = [
['2012-08-02T13:00:00', mk(2012, 8, 2, 13)],
['aug 3', mk(2007, 8, 3, 12)],
['aug. 3', mk(2007, 8, 3, 12)],
['aug-20', mk(2007, 8, 20, 12)],
['may 27', mk(2007, 5, 27, 12)],
['may 28', mk(2007, 5, 28, 12)],
['may 28 5pm', mk(2007, 5, 28, 17)],
['may 28 at 5pm', mk(2007, 5, 28, 17)],
// ['may 28 at 5:32.19pm', mk(2006, 5, 28, 17, 32, 19)],
// ['may 28 at 5:32:19.764', mk(2007, 5, 28, 17, 32, 19, 764000)],
['5pm on may 28', mk(2007, 5, 28, 17)],
['5pm may 28', mk(2007, 5, 28, 17)],
['5 on may 28', mk(2007, 5, 28, 5)],
['may 27th', mk(2007, 5, 27, 12)],
['may 27th 5:00 pm', mk(2007, 5, 27, 17)],
['may 27th at 5pm', mk(2007, 5, 27, 17)],
// ['may 27th at 5', mk(2007, 5, 27, 5)],
// ['fifteenth of this month', mk(2007, 8, 15, 12)],
['22nd February', mk(2007, 2, 22, 12)],
['31st of may at 6:30pm', mk(2007, 5, 31, 18, 30)],
['11th december 8am', mk(2006, 12, 11, 8)],
// ['2009 May 22nd', mk(2009, 05, 22, 12)],
['22 February', mk(2007, 2, 22, 12)],
['22 feb', mk(2007, 2, 22, 12)],
['22-feb', mk(2007, 2, 22, 12)],
['31 of may at 6:30pm', mk(2007, 5, 31, 18, 30)],
['11 december 8am', mk(2006, 12, 11, 8)],
['5:00 pm may 27th', mk(2007, 5, 27, 17)],
['05:00 pm may 27th', mk(2007, 5, 27, 17)],
['5pm on may 27th', mk(2007, 5, 27, 17)],
// ['5 on may 27th', mk(2007, 5, 27, 5)],
// ["may '97", mk(1997, 5, 16, 12)],
// ['may 33', mk(2033, 5, 16, 12)],
// ['may 32', mk(2032, 5, 16, 12, 0, 0)],
// ["may '01", mk(2001, 5, 16, 12, 0, 0)],
['November 18, 2010', mk(2010, 11, 18, 12)],
['Jan 1, 2010', mk(2010, 1, 1, 12)],
['February 14, 2004', mk(2004, 2, 14, 12)],
['jan 3 2010', mk(2010, 1, 3, 12)],
['jan 3 2010 midnight', mk(2010, 1, 3, 0)],
['jan 3 2010 at midnight', mk(2010, 1, 3, 0)],
['jan 3 2010 at 4', mk(2010, 1, 3, 4)],
['may 27, 1979', mk(1979, 5, 27, 12)],
// ["may 27 '79", mk(1979, 5, 27, 12)],
// ['may 27 79 4:30', mk(1979, 5, 27, 16, 30)],
// ['may 27 79 at 4:30', mk(1979, 5, 27, 4, 30)],
// ['may 27 32', mk(2032, 5, 27, 12, 0, 0)],
// ['oct 5 2012 1045pm', mk(2012, 10, 5, 22, 45)],
// ['may 1st 01', mk(2001, 5, 1, 12)],
['November 18th 2010', mk(2010, 11, 18, 12)],
['November 18th, 2010', mk(2010, 11, 18, 12)],
['November 18th 2010 midnight', mk(2010, 11, 18, 0)],
// ['November 18th 2010 at midnight', mk(2010, 11, 19, 0)],
['November 18th 2010 at 4', mk(2010, 11, 18, 16)],
['November 18th 2010 at 4', mk(2010, 11, 18, 4)],
['March 30th, 1979', mk(1979, 3, 30, 12)],
// ['March 30th 79', mk(1979, 3, 30, 12)],
// ['March 30th 79 4:30', mk(1979, 3, 30, 16, 30)],
// ['March 30th 79 at 4:30', mk(1979, 3, 30, 4, 30)],
['22nd February 2012', mk(2012, 2, 22, 12)],
// ['11th december 79', mk(1979, 12, 11, 12)],
['3 jan 2010', mk(2010, 1, 3, 12)],
['3 jan 2010 4pm', mk(2010, 1, 3, 16)],
['27 Oct 2006 7:30pm', mk(2006, 10, 27, 19, 30)],
// ['3 jan 10', mk(2010, 1, 3, 12)],
// ['3 jan 10', mk(2010, 1, 3, 12)],
// ['3 jan 10', mk(2010, 1, 3, 12)],
['5/27/1979', mk(1979, 5, 27, 12), 'iso-times'],
['5/27/1979 4am', mk(1979, 5, 27, 4), 'iso-times'],
// ['7/12/11', mk(2011, 7, 12, 12), 'iso-times'],
// ['7/12/11', mk(2011, 12, 7, 12), 'iso-times'],
['9/19/2011 6:05:57 PM', mk(2011, 9, 19, 18, 5, 57), 'iso-times'],
['2013-03-12 17:00', mk(2013, 3, 12, 17, 0, 0), 'iso-times'],
['27/5/1979', mk(1979, 5, 27, 12)],
['27/5/1979 @ 0700', mk(1979, 5, 27, 7)],
['03/18/2012 09:26 pm', mk(2012, 3, 18, 21, 26)],
// ['30.07.2013 16:34:22', mk(2013, 7, 30, 16, 34, 22)],
// ['09.08.2013', mk(2013, 8, 9, 12)],
// ['9.8.2013', mk(2013, 8, 9, 12)],
['30-07-2013 21:53:49', mk(2013, 7, 30, 21, 53, 49), 'iso-short'],
['2000-1-1', mk(2000, 1, 1, 12), 'iso-short'],
['2006-08-20', mk(2006, 8, 20, 12), 'iso-short'],
['2006-08-20 7pm', mk(2006, 8, 20, 19), 'iso-short'],
['2006-08-20 03:00', mk(2006, 8, 20, 3), 'iso-short'],
['2006-08-20 03:30:30', mk(2006, 8, 20, 3, 30, 30), 'iso-short'],
['2006-08-20 15:30:30', mk(2006, 8, 20, 15, 30, 30), 'iso-short'],
['2006-08-20 15:30.30', mk(2006, 8, 20, 15, 30, 30), 'iso-short'],
['1902-08-20', mk(1902, 8, 20, 12, 0, 0), 'iso-short'],
['2013.07.30 11:45:23', mk(2013, 7, 30, 11, 45, 23)],
['2013.08.09', mk(2013, 8, 9, 12, 0, 0)],
// ['2012:05:25 22:06:50', mk(2012, 5, 25, 22, 6, 50)],
// ['05/06', mk(2007, 5, 6, 12)],
// ['05/06', mk(2007, 6, 5, 12)],
// ['05/06 6:05:57 PM', mk(2007, 5, 6, 18, 05, 57)],
// ['05/06 6:05:57 PM', mk(2007, 6, 5, 18, 05, 57)],
// ['13/09', mk(2006, 9, 13, 12),'dd/mm'],
// ['1/13', mk(2007, 1, 13, 12),'dd/mm'],
// ['3/13', mk(2006, 3, 13, 12),'dd/mm'],
// ['12/1', mk(2005, 12, 1, 12),'dd/mm'],
// ['12/1', mk(2006, 12, 1, 12),'dd/mm'],
// ['12/1', mk(2006, 12, 1, 12),'dd/mm'],
// ['8/1', mk(2006, 8, 1, 12),'dd/mm'],
// ['8/1', mk(2007, 8, 1, 12),'dd/mm'],
// ['8/1', mk(2006, 8, 1, 12),'dd/mm'],
// ['1/1', mk(2006, 1, 1, 12),'dd/mm'],
// ['1/1', mk(2007, 1, 1, 12),'dd/mm'],
// ['1/1', mk(2006, 1, 1, 12),'dd/mm'],
// ['2012-06', mk(2012, 6, 1)],
// ['2013/12', mk(2013, 12, 1, 0)],
]
const context = {
today: [2006, 8, 24],
}
arr.forEach(a => {
const found = nlp(a[0]).dates(context).json()[0] || {}
const have = fmt((found.dates || {}).start)
t.equal(have, a[1], a[0])
})
t.end()
})
test('chronic-tests-two', (t) => {
const context = {
today: [2006, 7, 16],
}
const arr = [
// ['9am on Saturday', mk(2006, 8, 19, 9)],
['on Tuesday', mk(2006, 8, 22, 12)],
['1:00:00 PM', mk(2006, 8, 16, 13)],
['01:00:00 PM', mk(2006, 8, 16, 13)],
['today at 02:00:00', mk(2006, 8, 16, 14)],
['today at 02:00:00 AM', mk(2006, 8, 16, 2)],
['today at 3:00:00', mk(2006, 8, 16, 3)],
['today at 03:00:00', mk(2006, 8, 16, 3)],
// ['tomorrow at 4a.m.', mk(2006, 8, 17, 4)],
// ['3rd month next year', mk(2007, 3, 1)],
// ['3rd thursday this september', mk(2006, 9, 21, 12)],
// ['3rd thursday this november', mk(2010, 11, 18, 12)],
// ['4th day last week', mk(2006, 8, 9, 12)],
// ['30-Mar-11', mk(2011, 3, 30, 12)],
// ['31-Aug-12', mk(2012, 8, 31)],
// //end of testing handlers
['friday', mk(2006, 8, 18, 12)],
// ['tue', mk(2006, 8, 22, 12)],
['13:00', mk(2006, 8, 16, 13), 'times'],
['13:45', mk(2006, 8, 16, 13, 45), 'times'],
['1:01pm', mk(2006, 8, 16, 13, 1), 'times'],
['2:01pm', mk(2006, 8, 16, 14, 1), 'times'],
['november', mk(2006, 11, 1), 'times'],
['friday 13:00', mk(2006, 8, 18, 13), 'times'],
['monday 4:00', mk(2006, 8, 21, 16), 'times'],
['sat 4:00', mk(2006, 8, 19, 4), 'times'],
['sunday 4:20', mk(2006, 8, 20, 4, 20), 'times'],
['4 pm', mk(2006, 8, 16, 16), 'times'],
['4 am', mk(2006, 8, 16, 4), 'times'],
['12 pm', mk(2006, 8, 16, 12), 'times'],
['12:01 pm', mk(2006, 8, 16, 12, 1), 'times'],
['12:01 am', mk(2006, 8, 16, 0, 1), 'times'],
['12 am', mk(2006, 8, 16), 'times'],
['4:00 in the morning', mk(2006, 8, 16, 4), 'times'],
// ['0:10', mk(2006, 8, 17, 0, 10),'times'],
['november 4', mk(2006, 11, 4, 12)],
['aug 24', mk(2006, 8, 24, 12)],
['friday 1 pm', mk(2006, 8, 18, 13)],
// ['friday 11 at night', mk(2006, 8, 18, 23)],
// ['friday 11 in the evening', mk(2006, 8, 18, 23)],
['sunday 6am', mk(2006, 8, 20, 6)],
['friday evening at 7', mk(2006, 8, 18, 19)],
// //year
['this year', mk(2006, 1, 1)],
// //month name
['last november', mk(2005, 11, 1)],
// //fortnight
// ['this fortnight', mk(2006, 8, 21, 19, 30)],
// ['this fortnight', mk(2006, 8, 14, 19)],
// //week
['this week', mk(2006, 8, 14)],
// //week
// ['this weekend', mk(2006, 8, 20)],
// ['this weekend', mk(2006, 8, 13)],
// ['last weekend', mk(2006, 8, 13)],
// //day
// ['this day', mk(2006, 8, 16, 19)],
['today', mk(2006, 8, 16, 19)],
['yesterday', mk(2006, 8, 15, 12)],
['tomorrow', mk(2006, 8, 17, 12)],
// //day name
// ['this tuesday', mk(2006, 8, 22, 12),'rel-dayname'],
// ['next tuesday', mk(2006, 8, 22, 12),'rel-dayname'],
// ['last tuesday', mk(2006, 8, 15, 12),'rel-dayname'],
// ['this wed', mk(2006, 8, 23, 12),'rel-dayname'],
// ['next wed', mk(2006, 8, 23, 12),'rel-dayname'],
// ['last wed', mk(2006, 8, 9, 12),'rel-dayname'],
// //day portion
// ['this morning', mk(2006, 8, 16, 9)],
// ['tonight', mk(2006, 8, 16, 22)],
// //hour
// ['next hr', mk(2006, 8, 16, 15, 30, 0)],
// ['next hrs', mk(2006, 8, 16, 15, 30, 0)],
// //minute
// ['next min', mk(2006, 8, 16, 14, 1, 30)],
// ['next mins', mk(2006, 8, 16, 14, 1, 30)],
// ['next minute', mk(2006, 8, 16, 14, 1, 30)],
// //second
// ['next sec', mk(2006, 8, 16, 14, 0, 1)],
// ['next secs', mk(2006, 8, 16, 14, 0, 1)],
// ['this second', mk(2006, 8, 16, 14)],
// ['this second', mk(2006, 8, 16, 14)],
// ['next second', mk(2006, 8, 16, 14, 0, 1)],
// ['last second', mk(2006, 8, 16, 13, 59, 59)],
// ['yesterday at 4:00', mk(2006, 8, 15, 16)],
['today at 9:00', mk(2006, 8, 16, 9)],
// ['today at 2100', mk(2006, 8, 16, 21)],
// ['this day at 0900', mk(2006, 8, 16, 9)],
// ['tomorrow at 0900', mk(2006, 8, 17, 9)],
// ['yesterday at 4:00', mk(2006, 8, 15, 4)],
// ['last friday at 4:00', mk(2006, 8, 11, 16)],
// ['next wed 4:00', mk(2006, 8, 23, 16)],
// ['yesterday afternoon', mk(2006, 8, 15, 15)],
// ['last week tuesday', mk(2006, 8, 8, 12)],
['tonight at 7', mk(2006, 8, 16, 19)],
// ['tonight 7', mk(2006, 8, 16, 19)],
// ['7 tonight', mk(2006, 8, 16, 19)],
['today at 6:00pm', mk(2006, 8, 16, 18)],
['today at 6:00am', mk(2006, 8, 16, 6)],
// ['this day 1800', mk(2006, 8, 16, 18)],
['yesterday at 4:00pm', mk(2006, 8, 15, 16)],
['tomorrow evening at 7', mk(2006, 8, 17, 19)],
['tomorrow morning at 5:30', mk(2006, 8, 17, 5, 30)],
// ['next monday at 12:01 am', mk(2006, 8, 21, 0, 1)],
// ['next monday at 12:01 pm', mk(2006, 8, 21, 12, 1)],
// //with context
// ['sunday at 8:15pm', mk(2006, 8, 13, 20, 15)],
// ['afternoon yesterday', mk(2006, 8, 15, 15)],
// ['tuesday last week', mk(2006, 8, 8, 12)],
// ['An hour ago', mk(2006, 8, 16, 13)],
['A day ago', mk(2006, 8, 15, 14)],
['a month ago', mk(2006, 7, 16, 14)],
['a year ago', mk(2005, 8, 16, 14)],
// //past
['3 years ago', mk(2003, 8, 16, 14), 'ago'],
['1 month ago', mk(2006, 7, 16, 14), 'ago'],
// ['1 fortnight ago', mk(2006, 8, 2, 14),'ago'],
// ['2 fortnights ago', mk(2006, 7, 19, 14),'ago'],
['3 weeks ago', mk(2006, 7, 26, 14), 'ago'],
// ['2 weekends ago', mk(2006, 8, 5), 'ago'],
['3 days ago', mk(2006, 8, 13, 14), 'ago'],
// ['5 mornings ago', mk(2006, 8, 12, 9),'ago'],
// ['7 hours ago', mk(2006, 8, 16, 7), 'ago'],
// ['3 minutes ago', mk(2006, 8, 16, 13, 57), 'ago'],
// ['20 seconds before now', mk(2006, 8, 16, 13, 59, 40),'ago'],
// //future
['3 years from now', mk(2009, 8, 16, 14, 0, 0), 'from now'],
// ['6 months hence', mk(2007, 2, 16, 14)],
// ['3 fortnights hence', mk(2006, 9, 27, 14)],
['1 week from now', mk(2006, 8, 23, 14, 0, 0), 'from now'],
// ['1 weekend from now', mk(2006, 8, 19)],
// ['2 weekends from now', mk(2006, 8, 26)],
// ['1 day hence', mk(2006, 8, 17, 14)],
// ['5 mornings hence', mk(2006, 8, 21, 9)],
['1 hour from now', mk(2006, 8, 16, 15), 'from now'],
// ['20 minutes hence', mk(2006, 8, 16, 14, 20)],
['20 seconds from now', mk(2006, 8, 16, 14, 0, 20), 'from now'],
// ['2 months ago', mk(2007, 1, 7, 23, 30)],
// //Two repeaters
['25 minutes and 20 seconds from now', mk(2006, 8, 16, 14, 25, 20), 'from now'],
// ['24 hours and 20 minutes from now', mk(2006, 8, 17, 14, 20, 0), 'from now'],
['24 hours 20 minutes from now', mk(2006, 8, 17, 14, 20, 0), 'from now'],
['in 3 hours', mk(2006, 8, 16, 17), 'from now'],
// //past
// ['3 years ago tomorrow', mk(2003, 8, 17, 12)],
// ['3 years ago this friday', mk(2003, 8, 18, 12)],
// ['3 months ago saturday at 5:00 pm', mk(2006, 5, 19, 17)],
// ['2 days from this second', mk(2006, 8, 18, 14)],
// ['7 hours before tomorrow at midnight', mk(2006, 8, 17, 17)],
// //future
// ['september 3 years ago', mk(2003, 9)],
// ['3rd month next year', mk(2007, 3)],
// ['3rd month next year', mk(2007, 3, 1)],
// ['3rd thursday this september', mk(2006, 9, 21, 12)],
// ['3rd thursday this november', mk(2010, 11, 18, 12)],
// ['4th day last week', mk(2006, 8, 9, 12)],
// ['this spring', mk(2007, 3, 20),'year'],
// ['this winter', mk(2006, 12, 22),'year'],
// ['last spring', mk(2006, 3, 20),'year'],
// ['last winter', mk(2005, 12, 22),'year'],
// ['next spring', mk(2007, 3, 20),'year'],
// ['this quarter', mk(2006, 7, 1),'year'],
// ['next quarter', mk(2006, 10, 1),'year'],
// ['last quarter', mk(2006, 4, 1),'year'],
// ['1 quarter ago', mk(2006, 4, 1),'year'],
// ['2 quarters ago', mk(2006, 1, 1),'year'],
// ['1 quarter from now', mk(2006, 10, 1),'year'],
// ['Q1', mk(2006, 1, 1),'year'],
// ['first quarter', mk(2007, 1, 1),'year'],
// ['1st quarter', mk(2006, 1, 1),'year'],
// ['q1 2005', mk(2005, 1, 1),'year'],
// ['2005 q1', mk(2005, 1, 1),'year'],
// ['q1 this year', mk(2006, 1, 1),'year'],
// ['this year q1', mk(2006, 1, 1),'q1'],
// ['q1 next year', mk(2007, 1, 1),'q1'],
// ['next year q1', mk(2007, 1, 1),'q1'],
// ['this q1', mk(2006, 1, 1),'q1'],
// ['last q1', mk(2006, 1, 1),'q1'],
// ['next q1', mk(2007, 1, 1),'q1'],
// ['#q2 2005', mk(2005, 4, 1),'q1'],
// ['2005 q2', mk(2005, 4, 1),'q1'],
// ['q2 this year', mk(2006, 4, 1),'q1'],
// ['this year q2', mk(2006, 4, 1),'q1'],
// ['q2 next year', mk(2007, 4, 1),'q1'],
// ['next year q2', mk(2007, 4, 1),'q1'],
// ['this q2', mk(2006, 4, 1),'q1'],
// ['last q2', mk(2006, 4, 1),'q1'],
// ['next q2', mk(2007, 4, 1),'q1'],
['Q4', mk(2006, 10, 1), 'q4 #1'],
['fourth quarter', mk(2006, 10, 1), 'q4 #2'],
// ['4th quarter', mk(2005, 10, 1), 'q4'],
['4th quarter 2005', mk(2005, 10, 1), 'q4 #3'],
// ['2005 4th quarter', mk(2005, 10, 1), 'q4'],
// ['4th quarter this year', mk(2006, 10, 1), 'q4'],
// ['this year 4th quarter', mk(2006, 10, 1), 'q4'],
// ['4th quarter next year', mk(2007, 10, 1), 'q4'],
// ['next year 4th quarter', mk(2007, 10, 1), 'q4'],
// ['this 4th quarter', mk(2006, 10, 1), 'q4'],
// ['last 4th quarter', mk(2005, 10, 1), 'q4'],
// ['next 4th quarter', mk(2006, 10, 1), 'q4'],
// ['1st thursday in november', mk(2007, 11, 1, 12), 'thurs tests'],
// ['1st friday in november', mk(2007, 11, 2, 12), 'thurs tests'],
// ['1st saturday in november', mk(2007, 11, 3, 12), 'thurs tests'],
['2011-01-01 at noon', mk(2011, 1, 1, 12, 0), 'thurs tests'],
['Thu Aug 10', mk(2006, 8, 10, 12), 'thurs tests'],
// ['Thursday July 31', mk(2006, 7, 31, 12), 'thurs tests')//],
['Thursday December 31', mk(2006, 12, 31, 12), 'thurs tests'],
['Thu Aug 10 4pm', mk(2006, 8, 10, 16), 'thurs tests'],
['Thu Aug 10 at 4pm', mk(2006, 8, 10, 16), 'thurs tests'],
['Thu Aug 10th at 4pm', mk(2006, 8, 10, 16), 'thurs tests'],
// ['Thu 17th at 4pm', mk(2006, 8, 17, 16), 'thurs tests'],
// ['Thu 16th at 4pm', mk(2006, 8, 16, 16), 'thurs tests'],
// ['Thu 1st at 4pm', mk(2006, 9, 1, 16), 'thurs tests'],
// ['Thu 17th', mk(2006, 8, 17, 12), 'thurs tests'],
['Thu Aug 10 2006', mk(2006, 8, 10, 12), 'thurs tests'],
['Thursday July 31 2006', mk(2006, 7, 31, 12), 'thurs tests'],
['Thursday December 31 2006', mk(2006, 12, 31, 12), 'thurs tests'],
['Thursday December 30 2006', mk(2006, 12, 30, 12), 'thurs tests'],
['Thu Aug 10th', mk(2006, 8, 10, 12), 'thurs tests'],
// ['Thursday July 31st', mk(2006, 7, 31, 12), 'thurs tests'],
['Thursday December 31st', mk(2006, 12, 31, 12), 'thurs tests'],
['Thu Aug 10th 2005', mk(2005, 8, 10, 12), 'thurs tests'],
['Thursday July 31st 2005', mk(2005, 7, 31, 12), 'thurs tests'],
['Thursday December 31st 2005', mk(2005, 12, 31, 12), 'thurs tests'],
['Thursday December 30th 2005', mk(2005, 12, 30, 12), 'thurs tests'],
]
arr.forEach(a => {
const found = nlp(a[0]).dates(context).json()[0] || {}
const have = fmt(found.dates.start)
t.equal(have, a[1], a[3] || a[0])
})
t.end()
})