diff --git a/src/common/parsers/ISOFormatParser.ts b/src/common/parsers/ISOFormatParser.ts index 648aa2a5..a3b2da40 100644 --- a/src/common/parsers/ISOFormatParser.ts +++ b/src/common/parsers/ISOFormatParser.ts @@ -11,11 +11,11 @@ import { AbstractParserWithWordBoundaryChecking } from "./AbstractParserWithWord // - TZD = (Z or +hh:mm or -hh:mm) const PATTERN = new RegExp( "([0-9]{4})\\-([0-9]{1,2})\\-([0-9]{1,2})" + - "(?:T" + //.. - "([0-9]{1,2}):([0-9]{1,2})" + // hh:mm - "(?::([0-9]{1,2})(?:\\.(\\d{1,4}))?)?" + // :ss.s - "(?:Z|([+-]\\d{2}):?(\\d{2})?)?" + // TZD (Z or ±hh:mm or ±hhmm or ±hh) - ")?" + //.. + "(?:T" + //.. + "([0-9]{1,2}):([0-9]{1,2})" + // hh:mm + "(?::([0-9]{1,2})(?:\\.(\\d{1,4}))?)?" + // :ss.s + "(?:Z|([+-]\\d{2}):?(\\d{2})?)?" + // TZD (Z or ±hh:mm or ±hhmm or ±hh) + ")?" + //.. "(?=\\W|$)", "i" ); diff --git a/src/locales/nl/constants.ts b/src/locales/nl/constants.ts index 44dda28b..c2ab08d2 100644 --- a/src/locales/nl/constants.ts +++ b/src/locales/nl/constants.ts @@ -213,7 +213,7 @@ const SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); const SINGLE_TIME_UNIT_PATTERN_NO_CAPTURE = SINGLE_TIME_UNIT_PATTERN.replace(/\((?!\?)/g, "(?:"); export const TIME_UNITS_PATTERN = - `(?:(?:about|around)\\s*)?` + + `(?:(?:binnen|in)\\s*)?` + `${SINGLE_TIME_UNIT_PATTERN_NO_CAPTURE}\\s*(?:,?\\s*${SINGLE_TIME_UNIT_PATTERN_NO_CAPTURE})*`; export function parseTimeUnits(timeunitText): TimeUnits { diff --git a/src/locales/nl/index.ts b/src/locales/nl/index.ts index 8d548791..71126faf 100644 --- a/src/locales/nl/index.ts +++ b/src/locales/nl/index.ts @@ -11,6 +11,9 @@ import NLWeekdayParser from "./parsers/NLWeekdayParser"; import NLMonthNameMiddleEndianParser from "./parsers/NLMonthNameMiddleEndianParser"; import NLMonthNameParser from "./parsers/NLMonthNameParser"; import NLSlashMonthFormatParser from "./parsers/NLSlashMonthFormatParser"; +import NLTimeExpressionParser from "./parsers/NLTimeExpressionParser"; +import NLCasualYearMonthDayParser from "./parsers/NLCasualYearMonthDayParser"; +import NLCasualDateTimeParser from "./parsers/NLCasualDateTimeParser"; // Shortcuts export const casual = new Chrono(createCasualConfiguration()); @@ -28,6 +31,7 @@ export function createCasualConfiguration(littleEndian = true): Configuration { const option = createConfiguration(false, littleEndian); option.parsers.unshift(new NLCasualDateParser()); option.parsers.unshift(new NLCasualTimeParser()); + option.parsers.unshift(new NLCasualDateTimeParser()); return option; } @@ -36,11 +40,13 @@ export function createConfiguration(strictMode = true, littleEndian = true): Con { parsers: [ new SlashDateFormatParser(littleEndian), - new NLTimeUnitWithinFormatParser(), - new NLWeekdayParser(), new NLMonthNameMiddleEndianParser(), new NLMonthNameParser(), + new NLTimeExpressionParser(), + new NLTimeUnitWithinFormatParser(), new NLSlashMonthFormatParser(), + new NLWeekdayParser(), + new NLCasualYearMonthDayParser(), ], refiners: [new NLMergeDateTimeRefiner(), new NLMergeDateRangeRefiner()], }, diff --git a/src/locales/nl/parsers/NLCasualDateParser.ts b/src/locales/nl/parsers/NLCasualDateParser.ts index 29017cc0..3ca22871 100644 --- a/src/locales/nl/parsers/NLCasualDateParser.ts +++ b/src/locales/nl/parsers/NLCasualDateParser.ts @@ -3,9 +3,9 @@ import { ParsingComponents, ParsingResult } from "../../../results"; import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; import * as references from "../../../common/casualReferences"; -export default class ENCasualDateParser extends AbstractParserWithWordBoundaryChecking { +export default class NLCasualDateParser extends AbstractParserWithWordBoundaryChecking { innerPattern(context: ParsingContext): RegExp { - return /(nu|vandaag|vanacht|morgen|morgend|gisteren)(?=\W|$)/i; + return /(nu|vandaag|morgen|morgend|gisteren)(?=\W|$)/i; } innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents | ParsingResult { @@ -25,9 +25,6 @@ export default class ENCasualDateParser extends AbstractParserWithWordBoundaryCh case "gisteren": return references.yesterday(context.refDate); - - case "vanacht": - return references.tonight(context.refDate); } return component; diff --git a/src/locales/nl/parsers/NLCasualDateTimeParser.ts b/src/locales/nl/parsers/NLCasualDateTimeParser.ts new file mode 100644 index 00000000..03c04478 --- /dev/null +++ b/src/locales/nl/parsers/NLCasualDateTimeParser.ts @@ -0,0 +1,75 @@ +import { ParsingContext } from "../../../chrono"; +import { ParsingComponents, ParsingResult } from "../../../results"; +import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; +import { Meridiem } from "../../../index"; +import { assignSimilarDate, assignTheNextDay } from "../../../utils/dayjs"; +import dayjs from "dayjs"; + +/* + * Find combined words + * - morgenochtend + * - morgenmiddag + * - morgennamiddag + * - morgenavond + * - morgennacht + * - vanochtend + * - vanmiddag + * - vannamiddag + * - vanavond + * - vannacht + * - gisterenochtend + * - gisterenmiddag + * - gisterennamiddag + * - gisterenavond + * - gisterennacht + * */ + +const DATE_GROUP = 1; +const TIME_OF_DAY_GROUP = 2; + +export default class NLCasualDateTimeParser extends AbstractParserWithWordBoundaryChecking { + innerPattern(context: ParsingContext): RegExp { + return /(gisteren|morgen|van)(ochtend|middag|namiddag|avond|nacht)(?=\W|$)/i; + } + + innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents | ParsingResult { + const dateText = match[DATE_GROUP].toLowerCase(); + const timeText = match[TIME_OF_DAY_GROUP].toLowerCase(); + const component = context.createParsingComponents(); + const targetDate = dayjs(context.refDate); + + switch (dateText) { + case "gisteren": + assignSimilarDate(component, targetDate.add(-1, "day")); + break; + case "van": + assignSimilarDate(component, targetDate); + break; + case "morgen": + assignTheNextDay(component, targetDate); + break; + } + + switch (timeText) { + case "ochtend": + component.imply("meridiem", Meridiem.AM); + component.imply("hour", 6); + break; + case "middag": + component.imply("meridiem", Meridiem.AM); + component.imply("hour", 12); + break; + case "namiddag": + component.imply("meridiem", Meridiem.PM); + component.imply("hour", 15); + break; + + case "avond": + component.imply("meridiem", Meridiem.PM); + component.imply("hour", 20); + break; + } + + return component; + } +} diff --git a/src/locales/nl/parsers/NLCasualTimeParser.ts b/src/locales/nl/parsers/NLCasualTimeParser.ts index f8a0f8a0..bacd02e5 100644 --- a/src/locales/nl/parsers/NLCasualTimeParser.ts +++ b/src/locales/nl/parsers/NLCasualTimeParser.ts @@ -4,16 +4,25 @@ import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/ import dayjs from "dayjs"; import { assignTheNextDay } from "../../../utils/dayjs"; -export default class ENCasualTimeParser extends AbstractParserWithWordBoundaryChecking { +const DAY_GROUP = 1; +const MOMENT_GROUP = 2; + +export default class NLCasualTimeParser extends AbstractParserWithWordBoundaryChecking { innerPattern() { - return /(?:this)?\s*(namiddag|avond|middernacht|ochtend|middag|'s middags|'s avonds|'s ochtends)(?=\W|$)/i; + return /(deze)?\s*(namiddag|avond|middernacht|ochtend|middag|'s middags|'s avonds|'s ochtends)(?=\W|$)/i; } innerExtract(context: ParsingContext, match: RegExpMatchArray) { const targetDate = dayjs(context.refDate); const component = context.createParsingComponents(); - switch (match[1].toLowerCase()) { + if (match[DAY_GROUP] === "deze") { + component.assign("day", context.refDate.getDate()); + component.assign("month", context.refDate.getMonth() + 1); + component.assign("year", context.refDate.getFullYear()); + } + + switch (match[MOMENT_GROUP].toLowerCase()) { case "namiddag": case "'s namiddags": component.imply("meridiem", Meridiem.PM); diff --git a/src/locales/nl/parsers/NLCasualYearMonthDayParser.ts b/src/locales/nl/parsers/NLCasualYearMonthDayParser.ts new file mode 100644 index 00000000..d6fe6312 --- /dev/null +++ b/src/locales/nl/parsers/NLCasualYearMonthDayParser.ts @@ -0,0 +1,49 @@ +import { ParsingContext } from "../../../chrono"; +import { MONTH_DICTIONARY } from "../constants"; +import { matchAnyPattern } from "../../../utils/pattern"; +import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; + +/* + Date format with slash "/" between numbers like ENSlashDateFormatParser, + but this parser expect year before month and date. + - YYYY/MM/DD + - YYYY-MM-DD + - YYYY.MM.DD +*/ +const PATTERN = new RegExp( + `([0-9]{4})[\\.\\/\\s]` + + `(?:(${matchAnyPattern(MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]` + + `([0-9]{1,2})` + + "(?=\\W|$)", + "i" +); + +const YEAR_NUMBER_GROUP = 1; +const MONTH_NAME_GROUP = 2; +const MONTH_NUMBER_GROUP = 3; +const DATE_NUMBER_GROUP = 4; + +export default class NLCasualYearMonthDayParser extends AbstractParserWithWordBoundaryChecking { + innerPattern(): RegExp { + return PATTERN; + } + + innerExtract(context: ParsingContext, match: RegExpMatchArray) { + const month = match[MONTH_NUMBER_GROUP] + ? parseInt(match[MONTH_NUMBER_GROUP]) + : MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + + if (month < 1 || month > 12) { + return null; + } + + const year = parseInt(match[YEAR_NUMBER_GROUP]); + const day = parseInt(match[DATE_NUMBER_GROUP]); + + return { + day: day, + month: month, + year: year, + }; + } +} diff --git a/src/locales/nl/parsers/NLMonthNameMiddleEndianParser.ts b/src/locales/nl/parsers/NLMonthNameMiddleEndianParser.ts index b295b3ce..e30c89eb 100644 --- a/src/locales/nl/parsers/NLMonthNameMiddleEndianParser.ts +++ b/src/locales/nl/parsers/NLMonthNameMiddleEndianParser.ts @@ -1,43 +1,51 @@ import { ParsingContext } from "../../../chrono"; import { findYearClosestToRef } from "../../../calculation/years"; -import { MONTH_DICTIONARY } from "../../en/constants"; -import { ORDINAL_NUMBER_PATTERN, parseOrdinalNumberPattern } from "../../en/constants"; -import { YEAR_PATTERN, parseYear } from "../../en/constants"; +import { MONTH_DICTIONARY } from "../constants"; +import { ORDINAL_NUMBER_PATTERN, parseOrdinalNumberPattern } from "../constants"; +import { YEAR_PATTERN, parseYear } from "../constants"; import { matchAnyPattern } from "../../../utils/pattern"; import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; const PATTERN = new RegExp( - `(${matchAnyPattern(MONTH_DICTIONARY)})` + - "(?:-|/|\\s*,?\\s*)" + - `(${ORDINAL_NUMBER_PATTERN})(?!\\s*)\\s*` + - "(?:" + - "(?:to|\\-)\\s*" + - `(${ORDINAL_NUMBER_PATTERN})\\s*` + + "(?:on\\s*?)?" + + `(${ORDINAL_NUMBER_PATTERN})` + + "(?:\\s*" + + "(?:tot|\\-|\\–|until|through|till|\\s)\\s*" + + `(${ORDINAL_NUMBER_PATTERN})` + ")?" + + "(?:-|/|\\s*(?:of)?\\s*)" + + "(" + + matchAnyPattern(MONTH_DICTIONARY) + + ")" + "(?:" + - "(?:-|/|\\s*,?\\s*)" + - `(${YEAR_PATTERN})` + + "(?:-|/|,?\\s*)" + + `(${YEAR_PATTERN}(?![^\\s]\\d))` + ")?" + - "(?=\\W|$)(?!\\:\\d)", + "(?=\\W|$)", "i" ); -const MONTH_NAME_GROUP = 1; -const DATE_GROUP = 2; -const DATE_TO_GROUP = 3; +const MONTH_NAME_GROUP = 3; +const DATE_GROUP = 1; +const DATE_TO_GROUP = 2; const YEAR_GROUP = 4; /** - * The parser for parsing US's date format that begin with month's name. - * - January 13 - * - January 13, 2012 - * - January 13 - 15, 2012 - * Note: Watch out for: - * - January 12:00 - * - January 12.44 - * - January 1222344 + * The parser for parsing BE/NL date format with month's name in full writing + * - 1 januari 2019 + * - 01 januari 2019 + * - 10 januari 2019 + * - 13 januari + * - 10 - 25 maart + * - 10 - 25 maart 2019 + * - 1 aug 2019 + * - 1 september 200 voor Christus + * - 1 september 2002 na Christus + * - 19 januari 87 + * - 12de juli 2013 + * - 1ste november 2013 */ -export default class ENMonthNameMiddleEndianParser extends AbstractParserWithWordBoundaryChecking { +export default class NLMonthNameMiddleEndianParser extends AbstractParserWithWordBoundaryChecking { innerPattern(): RegExp { return PATTERN; } @@ -46,6 +54,8 @@ export default class ENMonthNameMiddleEndianParser extends AbstractParserWithWor const month = MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; const day = parseOrdinalNumberPattern(match[DATE_GROUP]); if (day > 31) { + // e.g. "[96 Aug]" => "9[6 Aug]", we need to shift away from the next number + match.index = match.index + match[DATE_GROUP].length; return null; } diff --git a/src/locales/nl/parsers/NLMonthNameParser.ts b/src/locales/nl/parsers/NLMonthNameParser.ts index d4f513ca..b7d06f5e 100644 --- a/src/locales/nl/parsers/NLMonthNameParser.ts +++ b/src/locales/nl/parsers/NLMonthNameParser.ts @@ -7,8 +7,8 @@ import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/ const PATTERN = new RegExp( `(${matchAnyPattern(MONTH_DICTIONARY)})` + - "\\s*" + - "(?:" + + `\\s*` + + `(?:` + `[,-]?\\s*(${YEAR_PATTERN})?` + ")?" + "(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)", @@ -20,20 +20,16 @@ const YEAR_GROUP = 2; /** * The parser for parsing month name and year. - * - January, 2012 - * - January 2012 - * - January + * - januari, 2012 + * - januari 2012 + * - januari */ -export default class ENMonthNameParser extends AbstractParserWithWordBoundaryChecking { +export default class NLMonthNameParser extends AbstractParserWithWordBoundaryChecking { innerPattern(): RegExp { return PATTERN; } innerExtract(context: ParsingContext, match: RegExpMatchArray) { - if (match[0].length <= 3) { - return null; - } - const components = context.createParsingComponents(); components.imply("day", 1); diff --git a/src/locales/nl/parsers/NLSlashMonthFormatParser.ts b/src/locales/nl/parsers/NLSlashMonthFormatParser.ts index e36937cb..9ed6d650 100644 --- a/src/locales/nl/parsers/NLSlashMonthFormatParser.ts +++ b/src/locales/nl/parsers/NLSlashMonthFormatParser.ts @@ -12,7 +12,7 @@ const YEAR_GROUP = 2; * - 11/05 * - 06/2005 */ -export default class ENSlashMonthFormatParser extends AbstractParserWithWordBoundaryChecking { +export default class NLSlashMonthFormatParser extends AbstractParserWithWordBoundaryChecking { innerPattern(): RegExp { return PATTERN; } diff --git a/src/locales/nl/parsers/NLTimeExpressionParser.ts b/src/locales/nl/parsers/NLTimeExpressionParser.ts new file mode 100644 index 00000000..8146b11d --- /dev/null +++ b/src/locales/nl/parsers/NLTimeExpressionParser.ts @@ -0,0 +1,22 @@ +import { AbstractTimeExpressionParser } from "../../../common/parsers/AbstractTimeExpressionParser"; +import { ParsingComponents } from "../../../results"; +import { ParsingContext } from "../../../chrono"; + +export default class NLTimeExpressionParser extends AbstractTimeExpressionParser { + primaryPrefix(): string { + return "(?:(?:om)\\s*)?"; + } + + followingPhase(): string { + return "\\s*(?:\\-|\\–|\\~|\\〜|om|\\?)\\s*"; + } + + extractPrimaryTimeComponents(context: ParsingContext, match: RegExpMatchArray): ParsingComponents | null { + // This looks more like a year e.g. 2020 + if (match[0].match(/^\s*\d{4}\s*$/)) { + return null; + } + + return super.extractPrimaryTimeComponents(context, match); + } +} diff --git a/src/locales/nl/parsers/NLTimeUnitWithinFormatParser.ts b/src/locales/nl/parsers/NLTimeUnitWithinFormatParser.ts index babb774c..e92ecf6e 100644 --- a/src/locales/nl/parsers/NLTimeUnitWithinFormatParser.ts +++ b/src/locales/nl/parsers/NLTimeUnitWithinFormatParser.ts @@ -1,11 +1,11 @@ -import { TIME_UNITS_PATTERN, parseTimeUnits } from "../../en/constants"; +import { TIME_UNITS_PATTERN, parseTimeUnits } from "../constants"; import { ParsingContext } from "../../../chrono"; import { ParsingComponents } from "../../../results"; import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; -export default class ENTimeUnitWithinFormatParser extends AbstractParserWithWordBoundaryChecking { +export default class NLTimeUnitWithinFormatParser extends AbstractParserWithWordBoundaryChecking { innerPattern(): RegExp { - return new RegExp(`(?:binnen|in)\\s*` + "(" + TIME_UNITS_PATTERN + ")" + `(?=\\W|$)`, "i"); + return new RegExp(`(?:binnen|in|binnen de|voor)\\s*` + "(" + TIME_UNITS_PATTERN + ")" + `(?=\\W|$)`, "i"); } innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents { diff --git a/src/locales/nl/parsers/NLWeekdayParser.ts b/src/locales/nl/parsers/NLWeekdayParser.ts index cf890bb6..3904f922 100644 --- a/src/locales/nl/parsers/NLWeekdayParser.ts +++ b/src/locales/nl/parsers/NLWeekdayParser.ts @@ -1,17 +1,15 @@ import { ParsingContext } from "../../../chrono"; import { ParsingComponents } from "../../../results"; -import { WEEKDAY_DICTIONARY } from "../../en/constants"; +import { WEEKDAY_DICTIONARY } from "../../nl/constants"; import { matchAnyPattern } from "../../../utils/pattern"; import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; import { toDayJSWeekday } from "../../../calculation/weeks"; const PATTERN = new RegExp( "(?:(?:\\,|\\(|\\()\\s*)?" + - "(?:on\\s*?)?" + - "(?:(this|last|past|next)\\s*)?" + + "(?:op\\s*?)?" + + "(?:(deze|vorige|volgende)\\s*(?:week\\s*)?)?" + `(${matchAnyPattern(WEEKDAY_DICTIONARY)})` + - "(?:\\s*(?:\\,|\\)|\\)))?" + - "(?:\\s*(this|last|past|next)\\s*week)?" + "(?=\\W|$)", "i" ); @@ -20,7 +18,7 @@ const PREFIX_GROUP = 1; const WEEKDAY_GROUP = 2; const POSTFIX_GROUP = 3; -export default class ENWeekdayParser extends AbstractParserWithWordBoundaryChecking { +export default class NLWeekdayParser extends AbstractParserWithWordBoundaryChecking { innerPattern(): RegExp { return PATTERN; } @@ -35,11 +33,11 @@ export default class ENWeekdayParser extends AbstractParserWithWordBoundaryCheck modifierWord = modifierWord.toLowerCase(); let modifier = null; - if (modifierWord == "last" || modifierWord == "past") { + if (modifierWord == "vorige") { modifier = "last"; - } else if (modifierWord == "next") { + } else if (modifierWord == "volgende") { modifier = "next"; - } else if (modifierWord == "this") { + } else if (modifierWord == "deze") { modifier = "this"; } diff --git a/src/locales/nl/refiners/NLMergeDateTimeRefiner.ts b/src/locales/nl/refiners/NLMergeDateTimeRefiner.ts index d20093c3..2b3e14dc 100644 --- a/src/locales/nl/refiners/NLMergeDateTimeRefiner.ts +++ b/src/locales/nl/refiners/NLMergeDateTimeRefiner.ts @@ -8,6 +8,6 @@ import AbstractMergeDateTimeRefiner from "../../../common/refiners/AbstractMerge */ export default class NLMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner { patternBetween(): RegExp { - return new RegExp("^\\s*(om|na|voor|,|-)?\\s*$"); + return new RegExp("^\\s*(om|na|voor|in de|,|-)?\\s*$"); } } diff --git a/test/nl/nl_casual.test.ts b/test/nl/nl_casual.test.ts new file mode 100644 index 00000000..7bdfa0d0 --- /dev/null +++ b/test/nl/nl_casual.test.ts @@ -0,0 +1,408 @@ +import * as chrono from "../../src/"; +import { testSingleCase, testUnexpectedResult } from "../test_util"; +import { Meridiem } from "../../src/"; + +test("Test - Single Expression", () => { + testSingleCase(chrono.nl, "De deadline is nu", new Date(2012, 7, 10, 8, 9, 10, 11), (result) => { + expect(result.index).toBe(15); + expect(result.text).toBe("nu"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + expect(result.start.get("hour")).toBe(8); + expect(result.start.get("minute")).toBe(9); + expect(result.start.get("second")).toBe(10); + expect(result.start.get("millisecond")).toBe(11); + expect(result.start.get("timezoneOffset")).toBe(result.refDate.getTimezoneOffset() * -1); + + expect(result.start).toBeDate(result.refDate); + expect(result.start).toBeDate(new Date(2012, 7, 10, 8, 9, 10, 11)); + }); + + testSingleCase(chrono.nl, "De deadline is vandaag", new Date(2012, 7, 10, 14, 12), (result) => { + expect(result.index).toBe(15); + expect(result.text).toBe("vandaag"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + + expect(result.start).toBeDate(new Date(2012, 7, 10, 14, 12)); + }); + + testSingleCase(chrono.nl, "De deadline is morgen", new Date(2012, 7, 10, 17, 10), (result) => { + expect(result.index).toBe(15); + expect(result.text).toBe("morgen"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(11); + + expect(result.start).toBeDate(new Date(2012, 7, 11, 17, 10)); + }); + + testSingleCase(chrono.nl, "De deadline is morgen", new Date(2012, 7, 10, 1), (result) => { + expect(result.start).toBeDate(new Date(2012, 7, 11, 1)); + }); + + testSingleCase(chrono.nl, "De deadline was gisteren", new Date(2012, 7, 10, 12), (result) => { + expect(result.index).toBe(16); + expect(result.text).toBe("gisteren"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(9); + + expect(result.start).toBeDate(new Date(2012, 7, 9, 12)); + }); + + testSingleCase(chrono.nl, "De Deadline was deze ochtend", new Date(2012, 7, 10, 12), (result) => { + expect(result.index).toBe(16); + expect(result.text).toBe("deze ochtend"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + expect(result.start.get("hour")).toBe(6); + + expect(result.start).toBeDate(new Date(2012, 7, 10, 6)); + }); + + testSingleCase(chrono.nl, "De Deadline was deze namiddag ", new Date(2012, 7, 10, 12), (result) => { + expect(result.index).toBe(16); + expect(result.text).toBe("deze namiddag"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + expect(result.start.get("hour")).toBe(15); + + expect(result.start).toBeDate(new Date(2012, 7, 10, 15)); + }); + + testSingleCase(chrono.nl, "De Deadline was deze avond ", new Date(2012, 7, 10, 12), (result) => { + expect(result.index).toBe(16); + expect(result.text).toBe("deze avond"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + expect(result.start.get("hour")).toBe(20); + + expect(result.start).toBeDate(new Date(2012, 7, 10, 20)); + }); + + testSingleCase(chrono.nl, "De deadline is vanavond", new Date(2012, 7, 10, 12), (result) => { + expect(result.text).toBe("vanavond"); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + expect(result.start.get("hour")).toBe(20); + }); + + // "Midnight" at 0~1AM, assume it's the coming midnight of following day + // This is similar to "Tomorrow" at 0~1AM + testSingleCase(chrono.nl, "The Deadline is om middernacht ", new Date(2012, 7, 10, 1), (result) => { + expect(result.text).toBe("middernacht"); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(11); + expect(result.start.get("hour")).toBe(0); + }); +}); + +test("Test - Combined Expression", () => { + testSingleCase(chrono.nl, "De deadline is vandaag om 17:00", new Date(2012, 7, 10, 12), (result) => { + expect(result.index).toBe(15); + expect(result.text).toBe("vandaag om 17:00"); + + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + expect(result.start.get("hour")).toBe(17); + + expect(result.start).toBeDate(new Date(2012, 7, 10, 17)); + }); +}); + +test("Test - Casual combined datetime expressions", () => { + testSingleCase(chrono.nl, "gisterenochtend", new Date(2012, 8 - 1, 10, 14), (result) => { + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(9); + expect(result.start.get("hour")).toBe(6); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 9, 6)); + }); + + testSingleCase(chrono.nl, "gisterenmiddag", new Date(2012, 8 - 1, 10, 14), (result) => { + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(9); + expect(result.start.get("hour")).toBe(12); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 9, 12)); + }); + + testSingleCase(chrono.nl, "gisterenavond", new Date(2012, 8 - 1, 10, 14), (result) => { + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(9); + expect(result.start.get("hour")).toBe(20); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 9, 20)); + }); + + testSingleCase(chrono.nl, "vanochtend", new Date(2012, 8 - 1, 10, 14), (result) => { + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + expect(result.start.get("hour")).toBe(6); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 6)); + }); + + testSingleCase(chrono.nl, "vanmiddag", new Date(2012, 8 - 1, 10, 14), (result) => { + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + expect(result.start.get("hour")).toBe(12); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12)); + }); + + testSingleCase(chrono.nl, "vanavond", new Date(2012, 8 - 1, 10, 14), (result) => { + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + expect(result.start.get("hour")).toBe(20); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 20)); + }); + + testSingleCase(chrono.nl, "morgenochtend", new Date(2012, 8 - 1, 10, 14), (result) => { + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(11); + expect(result.start.get("hour")).toBe(6); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 11, 6)); + }); + + testSingleCase(chrono.nl, "morgenmiddag", new Date(2012, 8 - 1, 10, 14), (result) => { + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(11); + expect(result.start.get("hour")).toBe(12); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 11, 12)); + }); + + testSingleCase(chrono.nl, "morgenavond", new Date(2012, 8 - 1, 10, 14), (result) => { + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(11); + expect(result.start.get("hour")).toBe(20); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 11, 20)); + }); +}); + +test("Test - Casual date range", () => { + testSingleCase(chrono.nl, "Het evenement is vandaag - volgende vrijdag", new Date(2012, 7, 4, 12), (result) => { + expect(result.index).toBe(17); + expect(result.text).toBe("vandaag - volgende vrijdag"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(4); + expect(result.start.get("hour")).toBe(12); + + expect(result.start).toBeDate(new Date(2012, 7, 4, 12)); + + expect(result.end).not.toBeNull(); + expect(result.end.get("year")).toBe(2012); + expect(result.end.get("month")).toBe(8); + expect(result.end.get("day")).toBe(10); + expect(result.end.get("hour")).toBe(12); + + expect(result.end).toBeDate(new Date(2012, 7, 10, 12)); + }); + + testSingleCase(chrono.nl, "Het evenement is vandaag - volgende vrijdag", new Date(2012, 7, 10, 12), (result) => { + expect(result.index).toBe(17); + expect(result.text).toBe("vandaag - volgende vrijdag"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + expect(result.start.get("hour")).toBe(12); + + expect(result.start).toBeDate(new Date(2012, 7, 10, 12)); + + expect(result.end).not.toBeNull(); + expect(result.end.get("year")).toBe(2012); + expect(result.end.get("month")).toBe(8); + expect(result.end.get("day")).toBe(17); + expect(result.end.get("hour")).toBe(12); + + expect(result.end).toBeDate(new Date(2012, 7, 17, 12)); + }); +}); + +test("Test - Casual time implication", () => { + testSingleCase( + chrono.nl, + "jaarlijks verlof vanaf vandaag tot morgennamiddag", + new Date(2012, 8 - 1, 4, 12), + (result) => { + expect(result.text).toBe("vandaag tot morgennamiddag"); + + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(4); + expect(result.start.get("hour")).toBe(12); + expect(result.start.isCertain("hour")).toBe(false); + + expect(result.end.get("month")).toBe(8); + expect(result.end.get("day")).toBe(5); + expect(result.end.get("hour")).toBe(15); + expect(result.end.isCertain("hour")).toBe(false); + } + ); + + testSingleCase( + chrono.nl, + "jaarlijks verlof vanaf deze ochtend tot morgen", + new Date(2012, 8 - 1, 4, 12), + (result) => { + expect(result.text).toBe("deze ochtend tot morgen"); + + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(4); + expect(result.start.get("hour")).toBe(6); + expect(result.start.isCertain("hour")).toBe(false); + + expect(result.end.get("month")).toBe(8); + expect(result.end.get("day")).toBe(5); + expect(result.end.get("hour")).toBe(12); + expect(result.end.isCertain("hour")).toBe(false); + } + ); +}); + +test("Test - Random text", () => { + testSingleCase(chrono.nl, "vanavond", new Date(2012, 1 - 1, 1, 12), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(1); + expect(result.start.get("day")).toBe(1); + expect(result.start.get("hour")).toBe(20); + expect(result.start.get("meridiem")).toBe(Meridiem.PM); + }); + + testSingleCase(chrono.nl, "middag", new Date(2012, 1 - 1, 1, 12), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(1); + expect(result.start.get("day")).toBe(1); + expect(result.start.get("hour")).toBe(12); + expect(result.start.get("meridiem")).toBe(Meridiem.AM); + }); + + testSingleCase(chrono.nl, "vanavond 22:00", new Date(2012, 1 - 1, 1, 12), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("hour")).toBe(22); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(1); + expect(result.start.get("day")).toBe(1); + expect(result.start.get("meridiem")).toBe(Meridiem.PM); + }); + + testSingleCase(chrono.nl, "vanavond om 21:00", new Date(2012, 1 - 1, 1, 12), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("hour")).toBe(21); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(1); + expect(result.start.get("day")).toBe(1); + expect(result.start.get("meridiem")).toBe(Meridiem.PM); + }); + + testSingleCase(chrono.nl, "morgen voor 16:00", new Date(2012, 1 - 1, 1, 12), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("hour")).toBe(16); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(1); + expect(result.start.get("day")).toBe(2); + expect(result.start.get("meridiem")).toBe(Meridiem.PM); + }); + + testSingleCase(chrono.nl, "morgen na 16:00", new Date(2012, 1 - 1, 1, 12), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("hour")).toBe(16); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(1); + expect(result.start.get("day")).toBe(2); + expect(result.start.get("meridiem")).toBe(Meridiem.PM); + }); + + testSingleCase(chrono.nl, "donderdag", (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("weekday")).toBe(4); + }); + + testSingleCase(chrono.nl, "deze avond", new Date(2016, 10 - 1, 1), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(1); + expect(result.start.get("hour")).toBe(20); + }); + + testSingleCase(chrono.nl, "gisterennamiddag", new Date(2016, 10 - 1, 1), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(9); + expect(result.start.get("day")).toBe(30); + expect(result.start.get("hour")).toBe(15); + }); + + testSingleCase(chrono.nl, "morgenochtend", new Date(2016, 10 - 1, 1, 8), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(2); + expect(result.start.get("hour")).toBe(6); + }); + + testSingleCase(chrono.nl, "deze namiddag om 15:00", new Date(2016, 10 - 1, 1, 8), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(1); + expect(result.start.get("hour")).toBe(15); + }); +}); + +test("Test - Random negative text", () => { + testUnexpectedResult(chrono.nl, "notoday"); + + testUnexpectedResult(chrono.nl, "tdtmr"); + + testUnexpectedResult(chrono.nl, "xyesterday"); + + testUnexpectedResult(chrono.nl, "nowhere"); + + testUnexpectedResult(chrono.nl, "noway"); + + testUnexpectedResult(chrono.nl, "knowledge"); +}); diff --git a/test/nl/nl_month.test.ts b/test/nl/nl_month.test.ts new file mode 100644 index 00000000..49709d65 --- /dev/null +++ b/test/nl/nl_month.test.ts @@ -0,0 +1,180 @@ +import * as chrono from "../../src"; +import { testSingleCase } from "../test_util"; + +test("Test - Month-Year expression", function () { + testSingleCase(chrono.nl, "september 2012", (result) => { + expect(result.text).toBe("september 2012"); + + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(9); + expect(result.start.get("day")).toBe(1); + + expect(result.start.isCertain("year")).toBe(true); + expect(result.start.isCertain("month")).toBe(true); + expect(result.start.isCertain("day")).toBe(false); + + expect(result.start).toBeDate(new Date(2012, 9 - 1, 1, 12)); + }); + + testSingleCase(chrono.nl, "sept 2012", (result) => { + expect(result.text).toBe("sept 2012"); + + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(9); + expect(result.start.get("day")).toBe(1); + + expect(result.start.isCertain("year")).toBe(true); + expect(result.start.isCertain("month")).toBe(true); + expect(result.start.isCertain("day")).toBe(false); + + expect(result.start).toBeDate(new Date(2012, 9 - 1, 1, 12)); + }); + + testSingleCase(chrono.nl, "sep 2012", (result) => { + expect(result.text).toBe("sep 2012"); + + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(9); + expect(result.start.get("day")).toBe(1); + + expect(result.start.isCertain("year")).toBe(true); + expect(result.start.isCertain("month")).toBe(true); + expect(result.start.isCertain("day")).toBe(false); + + expect(result.start).toBeDate(new Date(2012, 9 - 1, 1, 12)); + }); + + testSingleCase(chrono.nl, "sep. 2012", (result) => { + expect(result.text).toBe("sep. 2012"); + + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(9); + expect(result.start.get("day")).toBe(1); + + expect(result.start.isCertain("year")).toBe(true); + expect(result.start.isCertain("month")).toBe(true); + expect(result.start.isCertain("day")).toBe(false); + + expect(result.start).toBeDate(new Date(2012, 9 - 1, 1, 12)); + }); + + testSingleCase(chrono.nl, "sep-2012", (result) => { + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(9); + + expect(result.index).toBe(0); + expect(result.text).toBe("sep-2012"); + + expect(result.start).toBeDate(new Date(2012, 9 - 1, 1, 12)); + }); +}); + +test("Test - Month-Only expression", function () { + testSingleCase(chrono.nl, "In januari", new Date(2020, 11 - 1, 22), (result) => { + expect(result.text).toContain("januari"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2021); + expect(result.start.get("month")).toBe(1); + expect(result.start.get("day")).toBe(1); + + expect(result.start.isCertain("year")).toBe(false); + expect(result.start.isCertain("month")).toBe(true); + expect(result.start.isCertain("day")).toBe(false); + + expect(result.start).toBeDate(new Date(2021, 1 - 1, 1, 12)); + }); + + testSingleCase(chrono.nl, "in jan", new Date(2020, 11 - 1, 22), (result) => { + expect(result.text).toContain("jan"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2021); + expect(result.start.get("month")).toBe(1); + expect(result.start.get("day")).toBe(1); + + expect(result.start.isCertain("year")).toBe(false); + expect(result.start.isCertain("month")).toBe(true); + expect(result.start.isCertain("day")).toBe(false); + + expect(result.start).toBeDate(new Date(2021, 1 - 1, 1, 12)); + }); + + testSingleCase(chrono.nl, "mei", new Date(2020, 11 - 1, 22), (result) => { + expect(result.text).toContain("mei"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2021); + expect(result.start.get("month")).toBe(5); + expect(result.start.get("day")).toBe(1); + + expect(result.start.isCertain("year")).toBe(false); + expect(result.start.isCertain("month")).toBe(true); + expect(result.start.isCertain("day")).toBe(false); + + expect(result.start).toBeDate(new Date(2021, 5 - 1, 1, 12)); + }); +}); + +test("Test - Month expression in context", function () { + testSingleCase(chrono.nl, "The date is sep 2012 is the date", (result) => { + expect(result.index).toBe(12); + expect(result.text).toBe("sep 2012"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(9); + + expect(result.start).toBeDate(new Date(2012, 9 - 1, 1, 12)); + }); + + testSingleCase(chrono.nl, "By Angie ja november 2019", (result) => { + expect(result.text).toBe("november 2019"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2019); + expect(result.start.get("month")).toBe(11); + + expect(result.start).toBeDate(new Date(2019, 11 - 1, 1, 12)); + }); +}); + +test("Test - Month slash expression", function () { + testSingleCase(chrono.nl, "9/2012", new Date(2012, 7, 10), (result) => { + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(9); + + expect(result.index).toBe(0); + expect(result.text).toBe("9/2012"); + + expect(result.start).toBeDate(new Date(2012, 9 - 1, 1, 12)); + }); + + testSingleCase(chrono.nl, "09/2012", new Date(2012, 7, 10), (result) => { + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(9); + + expect(result.index).toBe(0); + expect(result.text).toBe("09/2012"); + + expect(result.start).toBeDate(new Date(2012, 9 - 1, 1, 12)); + }); +}); + +test("Test - year 90's parsing", () => { + testSingleCase(chrono.nl, "aug 96", new Date(2012, 7, 10), (result) => { + expect(result.text).toBe("aug 96"); + + expect(result.start.get("year")).toBe(1996); + expect(result.start.get("month")).toBe(8); + }); + + testSingleCase(chrono.nl, "96 aug 96", new Date(2012, 7, 10), (result) => { + expect(result.text).toBe("aug 96"); + + expect(result.start.get("year")).toBe(1996); + expect(result.start.get("month")).toBe(8); + }); +}); diff --git a/test/nl/nl_month_name_little_endian.test.ts b/test/nl/nl_month_name_little_endian.test.ts new file mode 100644 index 00000000..dc451d2e --- /dev/null +++ b/test/nl/nl_month_name_little_endian.test.ts @@ -0,0 +1,358 @@ +import * as chrono from "../../src"; +import { testSingleCase } from "../test_util"; + +test("Test - Single expression", () => { + testSingleCase(chrono.nl, "10 augustus 2012", new Date(2012, 7, 10), (result) => { + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + + expect(result.index).toBe(0); + expect(result.text).toBe("10 augustus 2012"); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12)); + }); + + testSingleCase(chrono.nl, "3 februari 82", new Date(2012, 7, 10), (result) => { + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(1982); + expect(result.start.get("month")).toBe(2); + expect(result.start.get("day")).toBe(3); + + expect(result.index).toBe(0); + expect(result.text).toBe("3 februari 82"); + + expect(result.start).toBeDate(new Date(1982, 2 - 1, 3, 12)); + }); + + testSingleCase(chrono.nl, "10 augustus 234 voor Christus", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("10 augustus 234 voor Christus"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(-234); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + + expect(result.start).toBeDate(new Date(-234, 8 - 1, 10, 12)); + }); + + testSingleCase(chrono.nl, "10 augustus 88 na Christus", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("10 augustus 88 na Christus"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(88); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + + const resultDate = result.start.date(); + const expectDate = new Date(88, 8 - 1, 10, 12); + expectDate.setFullYear(88); + expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime()); + }); + + testSingleCase(chrono.nl, "Zon 15 Sept", new Date(2013, 7, 10), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("Zon 15 Sept"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2013); + expect(result.start.get("month")).toBe(9); + expect(result.start.get("day")).toBe(15); + + expect(result.start).toBeDate(new Date(2013, 9 - 1, 15, 12)); + }); + + testSingleCase(chrono.nl, "ZON 15 SEPT", new Date(2013, 7, 10), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("ZON 15 SEPT"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2013); + expect(result.start.get("month")).toBe(9); + expect(result.start.get("day")).toBe(15); + + expect(result.start).toBeDate(new Date(2013, 9 - 1, 15, 12)); + }); + + testSingleCase(chrono.nl, "De deadline is 10 augustus", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(15); + expect(result.text).toBe("10 augustus"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12)); + }); + + testSingleCase(chrono.nl, "De deadline is dinsdag, 10 januari", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(15); + expect(result.text).toBe("dinsdag, 10 januari"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2013); + expect(result.start.get("month")).toBe(1); + expect(result.start.get("day")).toBe(10); + expect(result.start.get("weekday")).toBe(2); + + expect(result.start).toBeDate(new Date(2013, 1 - 1, 10, 12)); + }); + + testSingleCase(chrono.nl, "De deadline is di, 10 januari", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(15); + expect(result.text).toBe("di, 10 januari"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2013); + expect(result.start.get("month")).toBe(1); + expect(result.start.get("day")).toBe(10); + expect(result.start.get("weekday")).toBe(2); + + expect(result.start).toBeDate(new Date(2013, 1 - 1, 10, 12)); + }); + + testSingleCase(chrono.nl, "31ste maart 2016", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("31ste maart 2016"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(3); + expect(result.start.get("day")).toBe(31); + + expect(result.start).toBeDate(new Date(2016, 3 - 1, 31, 12)); + }); + + testSingleCase(chrono.nl, "23ste februari 2016", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("23ste februari 2016"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(2); + expect(result.start.get("day")).toBe(23); + + expect(result.start).toBeDate(new Date(2016, 2 - 1, 23, 12)); + }); +}); + +test("Test - Range expression", () => { + testSingleCase(chrono.nl, "10 - 22 augustus 2012", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("10 - 22 augustus 2012"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12)); + + expect(result.end).not.toBeNull(); + expect(result.end.get("year")).toBe(2012); + expect(result.end.get("month")).toBe(8); + expect(result.end.get("day")).toBe(22); + + expect(result.end).toBeDate(new Date(2012, 8 - 1, 22, 12)); + }); + + testSingleCase(chrono.nl, "10 tot 22 augustus 2012", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("10 tot 22 augustus 2012"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12)); + + expect(result.end).not.toBeNull(); + expect(result.end.get("year")).toBe(2012); + expect(result.end.get("month")).toBe(8); + expect(result.end.get("day")).toBe(22); + + expect(result.end).toBeDate(new Date(2012, 8 - 1, 22, 12)); + }); + + testSingleCase(chrono.nl, "10 augustus - 12 september", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("10 augustus - 12 september"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12)); + + expect(result.end).not.toBeNull(); + expect(result.end.get("year")).toBe(2012); + expect(result.end.get("month")).toBe(9); + expect(result.end.get("day")).toBe(12); + + expect(result.end).toBeDate(new Date(2012, 9 - 1, 12, 12)); + }); + + testSingleCase(chrono.nl, "10 augustus - 12 september 2013", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("10 augustus - 12 september 2013"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2013); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + + expect(result.start).toBeDate(new Date(2013, 8 - 1, 10, 12)); + + expect(result.end).not.toBeNull(); + expect(result.end.get("year")).toBe(2013); + expect(result.end.get("month")).toBe(9); + expect(result.end.get("day")).toBe(12); + + expect(result.end).toBeDate(new Date(2013, 9 - 1, 12, 12)); + }); +}); + +test("Test - Combined expression", () => { + testSingleCase(chrono.nl, "12de juli om 19:00", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("12de juli om 19:00"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(7); + expect(result.start.get("day")).toBe(12); + + expect(result.start).toBeDate(new Date(2012, 7 - 1, 12, 19, 0)); + }); + + testSingleCase(chrono.nl, "5 mei 12:00", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("5 mei 12:00"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(5); + expect(result.start.get("day")).toBe(5); + + expect(result.start).toBeDate(new Date(2012, 5 - 1, 5, 12, 0)); + }); + + testSingleCase(chrono.nl, "7 mei 11:00", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("7 mei 11:00"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(5); + expect(result.start.get("day")).toBe(7); + expect(result.start.get("hour")).toBe(11); + + expect(result.start).toBeDate(new Date(2012, 5 - 1, 7, 11, 0)); + }); +}); + +test("Test - Ordinal Words", () => { + testSingleCase(chrono.nl, "vierentwintigste mei", new Date(2012, 7, 10), (result) => { + expect(result.text).toBe("vierentwintigste mei"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(5); + expect(result.start.get("day")).toBe(24); + }); + + testSingleCase(chrono.nl, "achtste tot elfde mei 2010", new Date(2012, 7, 10), (result) => { + expect(result.text).toBe("achtste tot elfde mei 2010"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2010); + expect(result.start.get("month")).toBe(5); + expect(result.start.get("day")).toBe(8); + + expect(result.end).not.toBeNull(); + expect(result.end.get("year")).toBe(2010); + expect(result.end.get("month")).toBe(5); + expect(result.end.get("day")).toBe(11); + }); +}); + +test("Test - little endian date followed by time", () => { + testSingleCase(chrono.nl, "24ste oktober, 9:00", new Date(2017, 7 - 1, 7, 15), (result) => { + expect(result.text).toBe("24ste oktober, 9:00"); + expect(result.start.get("day")).toBe(24); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("hour")).toBe(9); + }); + + testSingleCase(chrono.nl, "24ste oktober, 21:00", new Date(2017, 7 - 1, 7, 15), (result) => { + expect(result.text).toBe("24ste oktober, 21:00"); + expect(result.start.get("day")).toBe(24); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("hour")).toBe(21); + }); + + testSingleCase(chrono.nl, "24 oktober, 21:00", new Date(2017, 7 - 1, 7, 15), (result) => { + expect(result.text).toBe("24 oktober, 21:00"); + expect(result.start.get("day")).toBe(24); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("hour")).toBe(21); + }); +}); + +test("Test - year 90's parsing", () => { + testSingleCase(chrono.nl, "03 aug 96", new Date(2012, 7, 10), (result) => { + expect(result.text).toBe("03 aug 96"); + + expect(result.start.get("year")).toBe(1996); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(3); + }); + + testSingleCase(chrono.nl, "3 aug 96", new Date(2012, 7, 10), (result) => { + expect(result.text).toBe("3 aug 96"); + + expect(result.start.get("year")).toBe(1996); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(3); + }); + + testSingleCase(chrono.nl, "9 aug 96", new Date(2012, 7, 10), (result) => { + expect(result.text).toBe("9 aug 96"); + + expect(result.start.get("year")).toBe(1996); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(9); + }); +}); + +test("Test - Forward Option", () => { + testSingleCase(chrono.nl, "22-23 februari om 19:00", new Date(2016, 3 - 1, 15), (result) => { + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(2); + expect(result.start.get("day")).toBe(22); + expect(result.start.get("hour")).toBe(19); + + expect(result.end.get("year")).toBe(2016); + expect(result.end.get("month")).toBe(2); + expect(result.end.get("day")).toBe(23); + expect(result.end.get("hour")).toBe(19); + }); + + testSingleCase(chrono.nl, "22-23 februari om 19:00", new Date(2016, 3 - 1, 15), { forwardDate: true }, (result) => { + expect(result.start.get("year")).toBe(2017); + expect(result.start.get("month")).toBe(2); + expect(result.start.get("day")).toBe(22); + expect(result.start.get("hour")).toBe(19); + + expect(result.end.get("year")).toBe(2017); + expect(result.end.get("month")).toBe(2); + expect(result.end.get("day")).toBe(23); + expect(result.end.get("hour")).toBe(19); + }); +}); diff --git a/test/nl/nl_slash.test.ts b/test/nl/nl_slash.test.ts new file mode 100644 index 00000000..7a7f9c94 --- /dev/null +++ b/test/nl/nl_slash.test.ts @@ -0,0 +1,206 @@ +import * as chrono from "../../src"; +import { testSingleCase, testUnexpectedResult, testWithExpectedDate } from "../test_util"; + +test("Test - Parsing Offset Expression", function () { + testSingleCase(chrono.nl, " 04/2016 ", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(4); + expect(result.text).toBe("04/2016"); + }); +}); + +test("Test - Single Expression", function () { + testSingleCase(chrono.nl, "Het evenement gaat door (04/2016)", new Date(2012, 7, 10), (result) => { + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(4); + expect(result.start.get("day")).toBe(1); + + expect(result.index).toBe(25); + expect(result.text).toBe("04/2016"); + + expect(result.start).toBeDate(new Date(2016, 4 - 1, 1, 12)); + }); + + testSingleCase(chrono.nl, "Gepubliceerd: 06/2004", new Date(2012, 7, 10), (result) => { + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2004); + expect(result.start.get("month")).toBe(6); + expect(result.start.get("day")).toBe(1); + + expect(result.index).toBe(14); + expect(result.text).toBe("06/2004"); + + expect(result.start).toBeDate(new Date(2004, 6 - 1, 1, 12)); + }); + + testSingleCase(chrono.nl, "8/10/2012", new Date(2012, 9, 8), (result) => { + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(8); + + expect(result.index).toBe(0); + expect(result.text).toBe("8/10/2012"); + + expect(result.start.isCertain("day")).toBe(true); + expect(result.start.isCertain("month")).toBe(true); + expect(result.start.isCertain("year")).toBe(true); + + expect(result.start).toBeDate(new Date(2012, 10 - 1, 8, 12)); + }); + + testSingleCase(chrono.nl, ": 8/1/2012", new Date(2012, 0, 8), (result) => { + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(1); + expect(result.start.get("day")).toBe(8); + + expect(result.index).toBe(2); + expect(result.text).toBe("8/1/2012"); + + expect(result.start).toBeDate(new Date(2012, 0, 8, 12)); + }); + + testSingleCase(chrono.nl, "8/10", new Date(2012, 10 - 1, 8), (result) => { + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(8); + + expect(result.index).toBe(0); + expect(result.text).toBe("8/10"); + + expect(result.start.isCertain("day")).toBe(true); + expect(result.start.isCertain("month")).toBe(true); + expect(result.start.isCertain("year")).toBe(false); + + expect(result.start).toBeDate(new Date(2012, 10 - 1, 8, 12)); + }); + + testSingleCase(chrono.nl, "De deadline is 8/10/2012", new Date(2012, 10 - 1, 8), (result) => { + expect(result.index).toBe(15); + expect(result.text).toBe("8/10/2012"); + + expect(result.start).toBeDate(new Date(2012, 10 - 1, 8, 12)); + }); + + testSingleCase(chrono.nl, "De deadline is dinsdag 11/3/2015", new Date(2015, 10, 3), (result) => { + expect(result.index).toBe(15); + expect(result.text).toBe("dinsdag 11/3/2015"); + + expect(result.start).toBeDate(new Date(2015, 2, 11, 12)); + }); + + testSingleCase(chrono.nl, "28/2/2014", (result) => { + expect(result.text).toBe("28/2/2014"); + }); + + testWithExpectedDate(chrono.nl, "30-12-16", new Date(2016, 12 - 1, 30, 12)); + + testSingleCase(chrono.nl, "vrijdag 30-12-16", (result) => { + expect(result.text).toBe("vrijdag 30-12-16"); + expect(result).toBeDate(new Date(2016, 12 - 1, 30, 12)); + }); +}); + +test("Test - Single Expression Little-Endian", function () { + testSingleCase(chrono.nl, "8/10/2012", new Date(2012, 7, 10), (result) => { + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(8); + + expect(result.index).toBe(0); + expect(result.text).toBe("8/10/2012"); + + expect(result.start).toBeDate(new Date(2012, 10 - 1, 8, 12)); + }); + + testWithExpectedDate(chrono.nl, "30-12-16", new Date(2016, 12 - 1, 30, 12)); + + testSingleCase(chrono.nl, "vrijdag 30-12-16", (result) => { + expect(result.text).toBe("vrijdag 30-12-16"); + expect(result).toBeDate(new Date(2016, 12 - 1, 30, 12)); + }); +}); + +test("Test - Single Expression Little-Endian with Month name", function () { + testSingleCase(chrono.nl, "8 oktober 2012", new Date(2012, 10 - 1, 8), (result) => { + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(8); + + expect(result.index).toBe(0); + expect(result.text).toBe("8 oktober 2012"); + + expect(result.start).toBeDate(new Date(2012, 10 - 1, 8, 12)); + }); +}); + +test("Test - Range Expression", function () { + testSingleCase(chrono.nl, "10/8/2012 - 15/8/2012", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("10/8/2012 - 15/8/2012"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12)); + + expect(result.end).not.toBeNull(); + expect(result.end.get("year")).toBe(2012); + expect(result.end.get("month")).toBe(8); + expect(result.end.get("day")).toBe(15); + + expect(result.end).toBeDate(new Date(2012, 8 - 1, 15, 12)); + }); +}); + +test("Test - Splitter variances patterns", function () { + const expectDate = new Date(2015, 5 - 1, 25, 12, 0); + + testWithExpectedDate(chrono.nl, "2015-05-25", expectDate); + testWithExpectedDate(chrono.nl, "2015/05/25", expectDate); + testWithExpectedDate(chrono.nl, "2015.05.25", expectDate); + testWithExpectedDate(chrono.nl, "25-05-2015", expectDate); + testWithExpectedDate(chrono.nl, "25/05/2015", expectDate); + testWithExpectedDate(chrono.nl, "25.05.2015", expectDate); + + // Also, guessing ambiguous date + testWithExpectedDate(chrono.nl, "25/05/2015", expectDate); +}); + +test("Test - Impossible Dates and Unexpected Results", function () { + testUnexpectedResult(chrono.nl, "8/32/2014", new Date(2012, 7, 10)); + + testUnexpectedResult(chrono.nl, "8/32", new Date(2012, 7, 10)); + + testUnexpectedResult(chrono.nl, "2/29/2014", new Date(2012, 7, 10)); + + testUnexpectedResult(chrono.nl, "2014/22/29", new Date(2012, 7, 10)); + + testUnexpectedResult(chrono.nl, "2014/13/22", new Date(2012, 7, 10)); + + testUnexpectedResult(chrono.nl, "80-32-89-89", new Date(2012, 7, 10)); +}); + +test("Test - forward dates only option", function () { + testSingleCase(chrono, "31/5", new Date(1999, 6 - 1, 1), { forwardDate: true }, (result) => { + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2000); + expect(result.start.get("month")).toBe(5); + expect(result.start.get("day")).toBe(31); + + expect(result.index).toBe(0); + expect(result.text).toBe("31/5"); + + expect(result.start.isCertain("day")).toBe(true); + expect(result.start.isCertain("month")).toBe(true); + expect(result.start.isCertain("year")).toBe(false); + + expect(result.start).toBeDate(new Date(2000, 5 - 1, 31, 12)); + }); +}); diff --git a/test/nl/nl_time_exp.test.ts b/test/nl/nl_time_exp.test.ts new file mode 100644 index 00000000..099a1f04 --- /dev/null +++ b/test/nl/nl_time_exp.test.ts @@ -0,0 +1,79 @@ +import * as chrono from "../../src"; +import { testSingleCase, testUnexpectedResult } from "../test_util"; +import { Meridiem } from "../../src"; + +test("Test - Parsing text offset", function () { + testSingleCase(chrono.nl, " 11:00 ", new Date(2016, 10 - 1, 1, 8), (result, text) => { + expect(result.index).toBe(2); + expect(result.text).toBe("11:00"); + }); + + testSingleCase(chrono.nl, "2020 om 11:00 ", new Date(2016, 10 - 1, 1, 8), (result, text) => { + expect(result.index).toBe(5); + expect(result.text).toBe("om 11:00"); + }); +}); + +test("Test - Time expression", function () { + testSingleCase(chrono.nl, "20:32:13", new Date(2016, 10 - 1, 1, 8), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("hour")).toBe(20); + expect(result.start.get("minute")).toBe(32); + expect(result.start.get("second")).toBe(13); + expect(result.start.get("meridiem")).toBe(Meridiem.PM); + }); +}); + +test("Test - Time range expression", function () { + testSingleCase(chrono.nl, "10:00:00 - 21:45:00", new Date(2016, 10 - 1, 1, 8), (result, text) => { + expect(result.text).toBe(text); + + expect(result.start.get("hour")).toBe(10); + expect(result.start.get("minute")).toBe(0); + expect(result.start.get("second")).toBe(0); + expect(result.start.get("meridiem")).toBe(Meridiem.AM); + + expect(result.end.get("hour")).toBe(21); + expect(result.end.get("minute")).toBe(45); + expect(result.end.get("second")).toBe(0); + expect(result.end.get("meridiem")).toBe(Meridiem.PM); + }); +}); + +test("Test - Casual time number expression", function () { + testSingleCase(chrono.nl, "23:00 's avonds", new Date(2016, 10 - 1, 1, 8), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(1); + expect(result.start.get("hour")).toBe(23); + }); + + testSingleCase(chrono.nl, "23:00 vanavond", new Date(2016, 10 - 1, 1, 8), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(1); + expect(result.start.get("hour")).toBe(23); + }); + + testSingleCase(chrono.nl, "6:00 's ochtends", new Date(2016, 10 - 1, 1, 8), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(1); + expect(result.start.get("hour")).toBe(6); + expect(result.start.get("minute")).toBe(0); + expect(result.start.get("meridiem")).toBe(Meridiem.AM); + }); + + testSingleCase(chrono.nl, "6:00 in de namiddag", new Date(2016, 10 - 1, 1, 8), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(1); + expect(result.start.get("hour")).toBe(18); + expect(result.start.get("minute")).toBe(0); + expect(result.start.get("meridiem")).toBe(Meridiem.PM); + }); +}); diff --git a/test/nl/nl_time_units_within.test.ts b/test/nl/nl_time_units_within.test.ts new file mode 100644 index 00000000..eb74a9a8 --- /dev/null +++ b/test/nl/nl_time_units_within.test.ts @@ -0,0 +1,225 @@ +import * as chrono from "../../src"; +import { testSingleCase } from "../test_util"; + +test("Test - The normal within expression", () => { + testSingleCase(chrono.nl, "we have to make something binnen 5 dagen.", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(26); + expect(result.text).toBe("binnen 5 dagen"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(15); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 15)); + }); + + testSingleCase(chrono.nl, "we have to make something binnen vijf dagen.", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(26); + expect(result.text).toBe("binnen vijf dagen"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(15); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 15)); + }); + + testSingleCase(chrono.nl, "we have to make something binnen de 10 dagen", new Date(2012, 7, 10), (result) => { + expect(result.index).toBe(26); + expect(result.text).toBe("binnen de 10 dagen"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(20); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 20)); + }); + + testSingleCase(chrono.nl, "binnen 5 minuten", new Date(2012, 7, 10, 12, 14), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("binnen 5 minuten"); + + expect(result.start).toBeDate(new Date(2012, 7, 10, 12, 19)); + }); + + testSingleCase(chrono.nl, "wait voor 5 minuten", new Date(2012, 7, 10, 12, 14), (result) => { + expect(result.index).toBe(5); + expect(result.text).toBe("voor 5 minuten"); + + expect(result.start).toBeDate(new Date(2012, 7, 10, 12, 19)); + }); + + testSingleCase(chrono.nl, "binnen 1 uur", new Date(2012, 7, 10, 12, 14), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("binnen 1 uur"); + + expect(result.start).toBeDate(new Date(2012, 7, 10, 13, 14)); + }); + + testSingleCase(chrono.nl, "Binnen 5 minuten ben ik thuis", new Date(2012, 7, 10, 12, 14), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("Binnen 5 minuten"); + + expect(result.start).toBeDate(new Date(2012, 7, 10, 12, 19)); + }); + + testSingleCase( + chrono.nl, + "Binnen de 5 minuten moet een auto zich verzetten", + new Date(2012, 7, 10, 12, 14), + (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("Binnen de 5 minuten"); + + expect(result.start).toBeDate(new Date(2012, 7, 10, 12, 19)); + } + ); + + testSingleCase( + chrono.nl, + "Binnen 5 seconden moet een auto zich verzetten", + new Date(2012, 7, 10, 12, 14), + (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("Binnen 5 seconden"); + + expect(result.start).toBeDate(new Date(2012, 7, 10, 12, 14, 5)); + } + ); + + testSingleCase(chrono.nl, "Binnen de 2 weken", new Date(2012, 7, 10, 12, 14), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("Binnen de 2 weken"); + + expect(result.start).toBeDate(new Date(2012, 7, 24, 12, 14)); + }); + + testSingleCase(chrono.nl, "Binnen een maand", new Date(2012, 7, 10, 12, 14), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("Binnen een maand"); + + expect(result.start).toBeDate(new Date(2012, 8, 10, 12, 14)); + }); + + testSingleCase(chrono.nl, "Binnen een jaar", new Date(2012, 7, 10, 12, 14), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("Binnen een jaar"); + + expect(result.start).toBeDate(new Date(2013, 7, 10, 12, 14)); + }); + + testSingleCase(chrono.nl, "Binnen 5 minuten A car need to move", new Date(2012, 7, 10, 12, 14), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("Binnen 5 minuten"); + + expect(result.start).toBeDate(new Date(2012, 7, 10, 12, 19)); + }); + + testSingleCase(chrono.nl, "Binnen 5 min a car need to move", new Date(2012, 7, 10, 12, 14), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("Binnen 5 min"); + + expect(result.start).toBeDate(new Date(2012, 7, 10, 12, 19)); + }); + + testSingleCase(chrono.nl, "binnen een week", new Date(2016, 10 - 1, 1), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(8); + }); +}); + +test("Test - Single Expression (Implied)", () => { + testSingleCase(chrono.nl, "Binnen de 30 dagen", new Date(2012, 7, 10, 12, 14), (result) => { + expect(!result.start.isCertain("year")).not.toBeNull(); + expect(!result.start.isCertain("month")).not.toBeNull(); + expect(!result.start.isCertain("day")).not.toBeNull(); + expect(!result.start.isCertain("hour")).not.toBeNull(); + expect(!result.start.isCertain("minute")).not.toBeNull(); + expect(!result.start.isCertain("second")).not.toBeNull(); + }); +}); + +test("Test - Implied time values", () => { + testSingleCase(chrono.nl, "Binnen 24 uur", new Date(2020, 7 - 1, 10, 12, 14), (result) => { + expect(result.start.get("hour")).toBe(12); + expect(result.start.get("minute")).toBe(14); + expect(result.start.get("day")).toBe(11); + expect(result.start.get("month")).toBe(7); + expect(result.start.get("year")).toBe(2020); + }); + + testSingleCase(chrono.nl, "binnen een dag", new Date(2020, 7 - 1, 10, 12, 14), (result) => { + expect(result.start.get("hour")).toBe(12); + expect(result.start.get("minute")).toBe(14); + expect(result.start.get("day")).toBe(11); + expect(result.start.get("month")).toBe(7); + expect(result.start.get("year")).toBe(2020); + }); +}); + +test("Test - Time units' certainty", () => { + testSingleCase(chrono.nl, "binnen 2 minuten", new Date(2016, 10 - 1, 1, 14, 52), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(1); + expect(result.start.get("hour")).toBe(14); + expect(result.start.get("minute")).toBe(54); + + expect(result.start.isCertain("year")).toBeTruthy(); + expect(result.start.isCertain("month")).toBeTruthy(); + expect(result.start.isCertain("day")).toBeTruthy(); + expect(result.start.isCertain("hour")).toBeTruthy(); + expect(result.start.isCertain("minute")).toBeTruthy(); + }); + + testSingleCase(chrono.nl, "binnen 2 uur", new Date(2016, 10 - 1, 1, 14, 52), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(1); + expect(result.start.get("hour")).toBe(16); + expect(result.start.get("minute")).toBe(52); + + expect(result.start.isCertain("year")).toBeTruthy(); + expect(result.start.isCertain("month")).toBeTruthy(); + expect(result.start.isCertain("day")).toBeTruthy(); + expect(result.start.isCertain("hour")).toBeTruthy(); + expect(result.start.isCertain("minute")).toBeTruthy(); + }); + + testSingleCase(chrono.nl, "binnen de 12 maand", new Date(2016, 10 - 1, 1, 14, 52), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("year")).toBe(2017); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(1); + expect(result.start.get("hour")).toBe(14); + expect(result.start.get("minute")).toBe(52); + + expect(result.start.isCertain("year")).toBeTruthy(); + expect(result.start.isCertain("month")).toBeTruthy(); + expect(result.start.isCertain("day")).toBeFalsy(); + expect(result.start.isCertain("hour")).toBeFalsy(); + expect(result.start.isCertain("minute")).toBeFalsy(); + }); + + testSingleCase(chrono.nl, "binnen de 3 dagen", new Date(2016, 10 - 1, 1, 14, 52), (result, text) => { + expect(result.text).toBe(text); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(10); + expect(result.start.get("day")).toBe(4); + expect(result.start.get("hour")).toBe(14); + expect(result.start.get("minute")).toBe(52); + + expect(result.start.isCertain("year")).toBeTruthy(); + expect(result.start.isCertain("month")).toBeTruthy(); + expect(result.start.isCertain("day")).toBeTruthy(); + expect(result.start.isCertain("hour")).toBeFalsy(); + expect(result.start.isCertain("minute")).toBeFalsy(); + }); +}); diff --git a/test/nl/nl_weekday.test.ts b/test/nl/nl_weekday.test.ts new file mode 100644 index 00000000..6d98713a --- /dev/null +++ b/test/nl/nl_weekday.test.ts @@ -0,0 +1,216 @@ +import * as chrono from "../../src"; +import { testSingleCase } from "../test_util"; + +test("Test - Single Expression", function () { + testSingleCase(chrono.nl, "maandag", new Date(2012, 7, 9), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("maandag"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(6); + expect(result.start.get("weekday")).toBe(1); + + expect(result.start.isCertain("day")).toBe(false); + expect(result.start.isCertain("month")).toBe(false); + expect(result.start.isCertain("year")).toBe(false); + expect(result.start.isCertain("weekday")).toBe(true); + + expect(result.start).toBeDate(new Date(2012, 7, 6, 12)); + }); + + testSingleCase(chrono.nl, "maandag (forward dates only)", new Date(2012, 7, 9), { forwardDate: true }, (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("maandag"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(13); + expect(result.start.get("weekday")).toBe(1); + + expect(result.start.isCertain("day")).toBe(false); + expect(result.start.isCertain("month")).toBe(false); + expect(result.start.isCertain("year")).toBe(false); + expect(result.start.isCertain("weekday")).toBe(true); + + expect(result.start).toBeDate(new Date(2012, 7, 13, 12)); + }); + + testSingleCase(chrono.nl, "donderdag", new Date(2012, 7, 9), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("donderdag"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(9); + expect(result.start.get("weekday")).toBe(4); + + expect(result.start).toBeDate(new Date(2012, 7, 9, 12)); + }); + + testSingleCase(chrono.nl, "zondag", new Date(2012, 7, 9), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("zondag"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(12); + expect(result.start.get("weekday")).toBe(0); + + expect(result.start).toBeDate(new Date(2012, 7, 12, 12)); + }); + + testSingleCase(chrono.nl, "De deadline is vorige vrijdag...", new Date(2012, 7, 9), (result) => { + expect(result.index).toBe(15); + expect(result.text).toBe("vorige vrijdag"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(3); + expect(result.start.get("weekday")).toBe(5); + + expect(result.start).toBeDate(new Date(2012, 7, 3, 12)); + }); + + testSingleCase(chrono.nl, "De deadline is vorige vrijdag...", new Date(2012, 7, 12), (result) => { + expect(result.index).toBe(15); + expect(result.text).toBe("vorige vrijdag"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + expect(result.start.get("weekday")).toBe(5); + + expect(result.start).toBeDate(new Date(2012, 7, 10, 12)); + }); + + testSingleCase( + chrono.nl, + "Laten we een meeting hebben op volgende week vrijdag", + new Date(2015, 3, 16), + (result) => { + expect(result.index).toBe(28); + expect(result.text).toBe("op volgende week vrijdag"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2015); + expect(result.start.get("month")).toBe(4); + expect(result.start.get("day")).toBe(24); + expect(result.start.get("weekday")).toBe(5); + + expect(result.start).toBeDate(new Date(2015, 3, 24, 12)); + } + ); + + testSingleCase(chrono.nl, "Ik plan een vrije dag op volgende week dinsdag", new Date(2015, 3, 18), (result) => { + expect(result.index).toBe(22); + expect(result.text).toBe("op volgende week dinsdag"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2015); + expect(result.start.get("month")).toBe(4); + expect(result.start.get("day")).toBe(21); + expect(result.start.get("weekday")).toBe(2); + + expect(result.start).toBeDate(new Date(2015, 3, 21, 12)); + }); +}); + +test("Test - Weekday With Casual Time", function () { + testSingleCase(chrono.nl, "Laten we op dinsdag ochtend afspreken", new Date(2015, 3, 18), (result) => { + expect(result.index).toBe(9); + expect(result.text).toBe("op dinsdag ochtend"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2015); + expect(result.start.get("month")).toBe(4); + expect(result.start.get("day")).toBe(21); + expect(result.start.get("weekday")).toBe(2); + expect(result.start.get("hour")).toBe(6); + + expect(result.start).toBeDate(new Date(2015, 3, 21, 6)); + }); +}); + +test("Test - Weekday Overlap", function () { + testSingleCase(chrono.nl, "zondag, 7 december 2014", new Date(2012, 7, 9), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("zondag, 7 december 2014"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2014); + expect(result.start.get("month")).toBe(12); + expect(result.start.get("day")).toBe(7); + expect(result.start.get("weekday")).toBe(0); + + expect(result.start.isCertain("day")).toBe(true); + expect(result.start.isCertain("month")).toBe(true); + expect(result.start.isCertain("year")).toBe(true); + expect(result.start.isCertain("weekday")).toBe(true); + + expect(result.start).toBeDate(new Date(2014, 12 - 1, 7, 12)); + }); + + testSingleCase(chrono.nl, "zondag 7/12/2014", new Date(2012, 7, 9), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("zondag 7/12/2014"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2014); + expect(result.start.get("month")).toBe(12); + expect(result.start.get("day")).toBe(7); + expect(result.start.get("weekday")).toBe(0); + + expect(result.start.isCertain("day")).toBe(true); + expect(result.start.isCertain("month")).toBe(true); + expect(result.start.isCertain("year")).toBe(true); + expect(result.start.isCertain("weekday")).toBe(true); + + expect(result.start).toBeDate(new Date(2014, 12 - 1, 7, 12)); + }); +}); + +test("Test - forward dates only option", function () { + testSingleCase( + chrono.nl, + "deze vrijdag tot deze maandag", + new Date(2016, 8 - 1, 4), + { forwardDate: true }, + (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe("deze vrijdag tot deze maandag"); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2016); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(5); + expect(result.start.get("weekday")).toBe(5); + + expect(result.start.isCertain("day")).toBe(false); + expect(result.start.isCertain("month")).toBe(false); + expect(result.start.isCertain("year")).toBe(false); + expect(result.start.isCertain("weekday")).toBe(true); + + expect(result.start).toBeDate(new Date(2016, 8 - 1, 5, 12)); + + expect(result.end).not.toBeNull(); + expect(result.end.get("year")).toBe(2016); + expect(result.end.get("month")).toBe(8); + expect(result.end.get("day")).toBe(8); + expect(result.end.get("weekday")).toBe(1); + + expect(result.end.isCertain("day")).toBe(false); + expect(result.end.isCertain("month")).toBe(false); + expect(result.end.isCertain("year")).toBe(false); + expect(result.end.isCertain("weekday")).toBe(true); + + expect(result.end).toBeDate(new Date(2016, 8 - 1, 8, 12)); + } + ); +});