elliptical-datetime
Version:
Elliptical phrases to handle natural language dates and times
137 lines (127 loc) • 3.3 kB
JSX
/** @jsx createElement */
/* eslint-env mocha */
import _ from 'lodash'
import { text } from './_util'
import {createElement, compile} from 'elliptical'
import { expect } from 'chai'
import lolex from 'lolex'
import { Time } from '../src'
import moment from 'moment'
function momentToTime (mom) {
return {hour: mom.hour(), minutes: mom.minute()}
}
describe('Time', () => {
let parse
let clock
const testCases = [{
output: {hour: 12, minute: 0, second: 0},
input: 'right now'
}, {
output: {hour: 12, minute: 0, second: 0},
input: 'now'
}, {
output: {hour: 3, minute: 31, second: 0},
input: '3:31 am'
}, {
output: {hour: 15, minute: 31, second: 0},
input: '3:31 pm'
}, {
output: {hour: 15, minute: 0, second: 0},
decorated: '3:00pm',
input: '3pm'
}, {
output: {hour: 0, minute: 0, second: 0},
input: 'midnight'
}, {
output: {hour: 12, minute: 0, second: 0},
input: 'noon'
}, {
output: {hour: 15, minute: 45, second: 0},
input: 'quarter to 4pm',
decorated: 'quarter to 4:00pm'
}, {
output: {hour: 23, minute: 45, second: 0},
input: 'quarter to midnight'
}, {
output: {hour: 15, minute: 30, second: 0},
input: 'half past 3pm',
decorated: 'half past 3:00pm'
}, {
output: {hour: 15, minute: 0, second: 0},
input: '15',
decorated: '15:00'
}, {
output: {hour: 15, minute: 30, second: 0},
input: 'half past 15',
decorated: 'half past 15:00'
}, {
output: {hour: 15, minute: 20, second: 0},
input: '15:20'
}, {
output: {hour: 0, minute: 0, second: 0},
input: '24',
decorated: '24:00'
}, {
input: '24:01',
length: 0
}, {
input: '15pm',
length: 0
}, {
input: '0:34',
output: {hour: 0, minute: 34, second: 0}
}, {
input: '0:34pm',
length: 0
}, {
output: {hour: 21, minute: 0, second: 0},
input: '9pm',
decorated: '9:00pm'
}, {
output: {hour: 15, minute: 50, second: 0},
input: '10 til 4pm',
decorated: '10 til 4:00pm'
}, {
output: {hour: 15, minute: 50, second: 0},
input: '10 minutes before 4pm',
decorated: '10 minutes before 4:00pm'
}, {
output: {hour: 10, minute: 0, second: 0},
input: '2 hours before noon'
}, {
output: {hour: 9, minute: 0, second: 0},
input: '3 hours before now'
}, {
output: {hour: 12, minute: 1, second: 0},
input: '1 minute after right now'
}, {
output: {hour: 15, minute: 0, second: 0},
input: 'in 3 hours'
}, {
output: {hour: 11, minute: 57, second: 0},
input: '3 minutes ago'
}, {
input: '2 minutes before 3 minutes ago',
length: 0
}]
before(() => {
clock = lolex.install(global, moment({hour: 12}).toDate())
})
after(() => {
clock.uninstall()
})
beforeEach(() => {
parse = compile(<Time />)
})
_.forEach(testCases, ({input, output, decorated, length = 1 }) => {
it(input, () => {
const data = _.filter(parse(input), output => !_.some(output.words, 'placeholder'))
// console.log(require('util').inspect(data, {depth: 999}))
expect(data).to.have.length(length)
if (length > 0) {
expect(text(data[0])).to.equal(decorated || input)
expect(data[0].result).to.eql(output)
}
})
})
})