UNPKG

elliptical-datetime

Version:

Elliptical phrases to handle natural language dates and times

137 lines (127 loc) 3.3 kB
/** @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) } }) }) })