From f2be585bf2ac549728759d1b3c7c9d801ad283ab Mon Sep 17 00:00:00 2001 From: Sam Verschueren Date: Sat, 25 Nov 2017 11:25:55 +0100 Subject: [PATCH] Add date predicate (#26) --- source/index.ts | 8 ++++++++ source/lib/predicates/date.ts | 31 +++++++++++++++++++++++++++++++ source/test/date.ts | 19 +++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 source/lib/predicates/date.ts create mode 100644 source/test/date.ts diff --git a/source/index.ts b/source/index.ts index c2ab83c..748f6db 100644 --- a/source/index.ts +++ b/source/index.ts @@ -4,6 +4,7 @@ import {StringPredicate} from './lib/predicates/string'; import {NumberPredicate} from './lib/predicates/number'; import {BooleanPredicate} from './lib/predicates/boolean'; import {ArrayPredicate} from './lib/predicates/array'; +import {DatePredicate} from './lib/predicates/date'; export interface Ow { (value: any, predicate: Predicate): void; @@ -23,6 +24,10 @@ export interface Ow { * Test the value to be an array. */ array: ArrayPredicate; + /** + * Test the value to be a Date. + */ + date: DatePredicate; } const main = (value: any, predicate: Predicate) => { @@ -46,6 +51,9 @@ Object.defineProperties(main, { }, array: { get: () => new ArrayPredicate() + }, + date: { + get: () => new DatePredicate() } }); diff --git a/source/lib/predicates/date.ts b/source/lib/predicates/date.ts new file mode 100644 index 0000000..0c3858e --- /dev/null +++ b/source/lib/predicates/date.ts @@ -0,0 +1,31 @@ +import {Predicate, Context} from './predicate'; + +export class DatePredicate extends Predicate { + constructor(context?: Context) { + super('date', context); + } + + /** + * Test a date to be before another date. + * + * @param date Maximum value. + */ + before(date: Date) { + return this.addValidator({ + message: value => `Expected ${value.toISOString()} to be before ${date.toISOString()}`, + validator: value => value.getTime() < date.getTime() + }); + } + + /** + * Test a date to be before another date. + * + * @param date Minimum value. + */ + after(date: Date) { + return this.addValidator({ + message: value => `Expected ${value.toISOString()} to be after ${date.toISOString()}`, + validator: value => value.getTime() > date.getTime() + }); + } +} diff --git a/source/test/date.ts b/source/test/date.ts new file mode 100644 index 0000000..0e10cb4 --- /dev/null +++ b/source/test/date.ts @@ -0,0 +1,19 @@ +import test from 'ava'; +import m from '..'; + +test('date', t => { + t.notThrows(() => m(new Date(), m.date)); + t.throws(() => m('12', m.date), 'Expected argument to be of type `date` but received type `string`'); +}); + +test('date.before', t => { + t.notThrows(() => m(new Date('2017-11-25'), m.date.before(new Date('2017-11-26')))); + t.notThrows(() => m(new Date('2017-11-25T12:00:00Z'), m.date.before(new Date('2017-11-25T12:00:01Z')))); + t.throws(() => m(new Date('2017-11-25T12:00:00Z'), m.date.before(new Date('2017-11-25T12:00:00Z'))), 'Expected 2017-11-25T12:00:00.000Z to be before 2017-11-25T12:00:00.000Z'); +}); + +test('date.after', t => { + t.notThrows(() => m(new Date('2017-11-26'), m.date.after(new Date('2017-11-25')))); + t.notThrows(() => m(new Date('2017-11-26T12:00:00Z'), m.date.after(new Date('2017-11-26T11:59:59Z')))); + t.throws(() => m(new Date('2017-11-26T12:00:00Z'), m.date.after(new Date('2017-11-26T12:00:00Z'))), 'Expected 2017-11-26T12:00:00.000Z to be after 2017-11-26T12:00:00.000Z'); +});