Skip to content

Commit

Permalink
[Fix] pattern year-month-day handling
Browse files Browse the repository at this point in the history
  • Loading branch information
Wanasit Tanakitrungruang committed Oct 25, 2020
1 parent 591e0a1 commit 76d493b
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 58 deletions.
4 changes: 2 additions & 2 deletions src/locales/en/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import ENTimeUnitWithinFormatParser from "./parsers/ENTimeUnitWithinFormatParser
import ENMonthNameLittleEndianParser from "./parsers/ENMonthNameLittleEndianParser";
import ENMonthNameMiddleEndianParser from "./parsers/ENMonthNameMiddleEndianParser";
import ENMonthNameParser from "./parsers/ENMonthNameParser";
import ENSlashDateFormatStartWithYearParser from "./parsers/ENSlashDateFormatStartWithYearParser";
import ENCasualYearMonthDayParser from "./parsers/ENCasualYearMonthDayParser";
import ENSlashMonthFormatParser from "./parsers/ENSlashMonthFormatParser";
import ENTimeExpressionParser from "./parsers/ENTimeExpressionParser";
import ENTimeUnitAgoFormatParser from "./parsers/ENTimeUnitAgoFormatParser";
Expand Down Expand Up @@ -54,7 +54,7 @@ export function createConfiguration(strictMode = true, littleEndian = false): Co
new ENMonthNameLittleEndianParser(),
new ENMonthNameMiddleEndianParser(),
new ENWeekdayParser(),
new ENSlashDateFormatStartWithYearParser(),
new ENCasualYearMonthDayParser(),
new ENSlashMonthFormatParser(),
new ENTimeExpressionParser(),
new ENTimeUnitAgoFormatParser(strictMode),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,9 @@ import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/
- YYYY.MM.DD
*/
const PATTERN = new RegExp(
"([0-9]{4})[\\.\\/]" +
"(?:(" +
matchAnyPattern(MONTH_DICTIONARY) +
")|([0-9]{1,2}))[\\.\\/]" +
"([0-9]{1,2})" +
`([0-9]{4})[\\.\\/\\s]` +
`(?:(${matchAnyPattern(MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]` +
`([0-9]{1,2})` +
"(?=\\W|$)",
"i"
);
Expand All @@ -25,7 +23,7 @@ const MONTH_NAME_GROUP = 2;
const MONTH_NUMBER_GROUP = 3;
const DATE_NUMBER_GROUP = 4;

export default class ENSlashDateFormatStartWithYearParser extends AbstractParserWithWordBoundaryChecking {
export default class ENCasualYearMonthDayParser extends AbstractParserWithWordBoundaryChecking {
innerPattern(): RegExp {
return PATTERN;
}
Expand All @@ -35,6 +33,10 @@ export default class ENSlashDateFormatStartWithYearParser extends AbstractParser
? 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]);

Expand Down
80 changes: 80 additions & 0 deletions test/en/en_casual_year_month_day.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import { testSingleCase, testUnexpectedResult } from "../test_util";
import * as chrono from "../../src";

test("Test - Single Expression Start with Year", function () {
testSingleCase(chrono, "2012/8/10", 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("2012/8/10");

expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12));
});

testSingleCase(chrono, "The Deadline is 2012/8/10", new Date(2012, 7, 10), (result) => {
expect(result.index).toBe(16);
expect(result.text).toBe("2012/8/10");

expect(result.start).toBeDate(new Date(2012, 7, 10, 12));
});

testSingleCase(chrono.strict, "2014/2/28", (result) => {
expect(result.text).toBe("2014/2/28");
});

testSingleCase(chrono.strict, "2014/12/28", (result) => {
expect(result.text).toBe("2014/12/28");
expect(result).toBeDate(new Date(2014, 12 - 1, 28, 12));
});

testSingleCase(chrono.strict, "2014.12.28", (result) => {
expect(result.text).toBe("2014.12.28");
expect(result).toBeDate(new Date(2014, 12 - 1, 28, 12));
});

testSingleCase(chrono.strict, "2014 12 28", (result) => {
expect(result.text).toBe("2014 12 28");
expect(result).toBeDate(new Date(2014, 12 - 1, 28, 12));
});
});

test("Test - Single Expression Start with Year and Month Name", function () {
testSingleCase(chrono, "2012/Aug/10", 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("2012/Aug/10");

expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12));
});

testSingleCase(chrono, "The Deadline is 2012/aug/10", new Date(2012, 7, 10), (result) => {
expect(result.index).toBe(16);
expect(result.text).toBe("2012/aug/10");

expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12));
});

testSingleCase(chrono, "The Deadline is 2018 March 18", new Date(2012, 7, 10), (result) => {
expect(result.index).toBe(16);
expect(result.text).toBe("2018 March 18");

expect(result.start.get("year")).toBe(2018);
expect(result.start.get("month")).toBe(3);
expect(result.start.get("day")).toBe(18);

expect(result).toBeDate(new Date(2018, 3 - 1, 18, 12));
});
});

test("Test - Negative year-month-day like pattern", function () {
testUnexpectedResult(chrono, "2012-80-10", new Date(2012, 7, 10));

testUnexpectedResult(chrono, "2012 80 10", new Date(2012, 7, 10));
});
50 changes: 0 additions & 50 deletions test/en/en_slash.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,56 +138,6 @@ test("Test - Single Expression Little-Endian with Month name", function () {
});
});

test("Test - Single Expression Start with Year", function () {
testSingleCase(chrono, "2012/8/10", 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("2012/8/10");

expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12));
});

testSingleCase(chrono, "The Deadline is 2012/8/10", new Date(2012, 7, 10), (result) => {
expect(result.index).toBe(16);
expect(result.text).toBe("2012/8/10");

expect(result.start).toBeDate(new Date(2012, 7, 10, 12));
});

testSingleCase(chrono.strict, "2014/2/28", (result) => {
expect(result.text).toBe("2014/2/28");
});

testSingleCase(chrono.strict, "2014/12/28", (result) => {
expect(result.text).toBe("2014/12/28");
});
});

test("Test - Single Expression Start with Year and Month Name", function () {
testSingleCase(chrono, "2012/Aug/10", 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("2012/Aug/10");

expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12));
});

testSingleCase(chrono, "The Deadline is 2012/aug/10", new Date(2012, 7, 10), (result) => {
expect(result.index).toBe(16);
expect(result.text).toBe("2012/aug/10");

expect(result.start).toBeDate(new Date(2012, 7, 10, 12));
});
});

test("Test - Range Expression", function () {
testSingleCase(chrono.en, "8/10/2012 - 8/15/2012", new Date(2012, 7, 10), (result) => {
expect(result.index).toBe(0);
Expand Down

0 comments on commit 76d493b

Please sign in to comment.