chrono-node 2.3.7 → 2.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/common/refiners/ExtractTimezoneAbbrRefiner.js +1 -1
  2. package/dist/locales/de/constants.d.ts +3 -3
  3. package/dist/locales/de/constants.js +38 -20
  4. package/dist/locales/de/index.js +4 -0
  5. package/dist/locales/de/parsers/DESpecificTimeExpressionParser.d.ts +7 -0
  6. package/dist/locales/de/parsers/DESpecificTimeExpressionParser.js +114 -0
  7. package/dist/locales/de/parsers/DETimeExpressionParser.d.ts +0 -1
  8. package/dist/locales/de/parsers/DETimeExpressionParser.js +3 -21
  9. package/dist/locales/de/parsers/DETimeUnitRelativeFormatParser.d.ts +8 -0
  10. package/dist/locales/de/parsers/DETimeUnitRelativeFormatParser.js +34 -0
  11. package/dist/locales/en/constants.d.ts +2 -2
  12. package/dist/locales/en/constants.js +3 -0
  13. package/dist/results.d.ts +1 -1
  14. package/dist/results.js +1 -2
  15. package/dist/timezone.d.ts +1 -1
  16. package/dist/timezone.js +2 -2
  17. package/package.json +1 -1
  18. package/src/common/refiners/ExtractTimezoneAbbrRefiner.ts +3 -1
  19. package/src/locales/de/constants.ts +42 -22
  20. package/src/locales/de/index.ts +4 -0
  21. package/src/locales/de/parsers/DESpecificTimeExpressionParser.ts +150 -0
  22. package/src/locales/de/parsers/DETimeExpressionParser.ts +4 -23
  23. package/src/locales/de/parsers/DETimeUnitRelativeFormatParser.ts +42 -0
  24. package/src/locales/en/constants.ts +5 -2
  25. package/src/results.ts +2 -3
  26. package/src/timezone.ts +3 -3
  27. package/test/de/de_month_name_little_endian.test.ts +12 -0
  28. package/test/de/de_time_exp.test.ts +59 -0
  29. package/test/de/de_time_units_casual_relative.test.ts +108 -0
  30. package/test/de/de_year.test.ts +147 -0
  31. package/test/en/en_relative.test.ts +41 -2
  32. package/test/en/en_time_units_ago.test.ts +3 -3
  33. package/test/en/en_time_units_within.test.ts +2 -2
  34. package/test/en/en_timezone_exp.test.ts +3 -3
  35. package/test/fr/fr_time_units_ago.test.ts +3 -3
  36. package/test/fr/fr_time_units_within.test.ts +2 -2
  37. package/test/nl/nl_relative.test.ts +2 -2
  38. package/test/nl/nl_time_units_ago.test.ts +3 -3
  39. package/test/system_timezone.test.ts +22 -0
@@ -0,0 +1,150 @@
1
+ import { Parser, ParsingContext } from "../../../chrono";
2
+ import { ParsingComponents, ParsingResult } from "../../../results";
3
+ import { Meridiem } from "../../../index";
4
+
5
+ /**
6
+ * 8h10m00s
7
+ * 8h10m00
8
+ * 8h10
9
+ * 8 Uhr
10
+ * 8h10m00s Uhr
11
+ * 8:10 Uhr
12
+ */
13
+ const FIRST_REG_PATTERN = new RegExp(
14
+ "(^|\\s|T)" +
15
+ "(?:(?:um|von)\\s*)?" +
16
+ "(\\d{1,2})(?:h|:)?" +
17
+ "(?:(\\d{1,2})(?:m|:)?)?" +
18
+ "(?:(\\d{1,2})(?:s)?)?" +
19
+ "(?:\\s*Uhr)?" +
20
+ "(?:\\s*(morgens|vormittags|nachmittags|abends|nachts|am\\s+(?:Morgen|Vormittag|Nachmittag|Abend)|in\\s+der\\s+Nacht))?" +
21
+ "(?=\\W|$)",
22
+ "i"
23
+ );
24
+
25
+ const SECOND_REG_PATTERN = new RegExp(
26
+ "^\\s*(\\-|\\–|\\~|\\〜|bis(?:\\s+um)?|\\?)\\s*" +
27
+ "(\\d{1,2})(?:h|:)?" +
28
+ "(?:(\\d{1,2})(?:m|:)?)?" +
29
+ "(?:(\\d{1,2})(?:s)?)?" +
30
+ "(?:\\s*Uhr)?" +
31
+ "(?:\\s*(morgens|vormittags|nachmittags|abends|nachts|am\\s+(?:Morgen|Vormittag|Nachmittag|Abend)|in\\s+der\\s+Nacht))?" +
32
+ "(?=\\W|$)",
33
+ "i"
34
+ );
35
+
36
+ const HOUR_GROUP = 2;
37
+ const MINUTE_GROUP = 3;
38
+ const SECOND_GROUP = 4;
39
+ const AM_PM_HOUR_GROUP = 5;
40
+
41
+ export default class DESpecificTimeExpressionParser implements Parser {
42
+ pattern(context): RegExp {
43
+ return FIRST_REG_PATTERN;
44
+ }
45
+
46
+ extract(context: ParsingContext, match: RegExpMatchArray): ParsingResult | null {
47
+ const result = context.createParsingResult(match.index + match[1].length, match[0].substring(match[1].length));
48
+
49
+ // This looks more like a year e.g. 2020
50
+ if (result.text.match(/^\d{4}$/)) {
51
+ match.index += match[0].length;
52
+ return null;
53
+ }
54
+
55
+ result.start = DESpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), match);
56
+ if (!result.start) {
57
+ match.index += match[0].length;
58
+ return null;
59
+ }
60
+
61
+ const remainingText = context.text.substring(match.index + match[0].length);
62
+ const secondMatch = SECOND_REG_PATTERN.exec(remainingText);
63
+ if (secondMatch) {
64
+ result.end = DESpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), secondMatch);
65
+ if (result.end) {
66
+ result.text += secondMatch[0];
67
+ }
68
+ }
69
+
70
+ return result;
71
+ }
72
+
73
+ private static extractTimeComponent(
74
+ extractingComponents: ParsingComponents,
75
+ match: RegExpMatchArray
76
+ ): ParsingComponents | null {
77
+ let hour = 0;
78
+ let minute = 0;
79
+ let meridiem = null;
80
+
81
+ // ----- Hours
82
+ hour = parseInt(match[HOUR_GROUP]);
83
+
84
+ // ----- Minutes
85
+ if (match[MINUTE_GROUP] != null) {
86
+ minute = parseInt(match[MINUTE_GROUP]);
87
+ }
88
+
89
+ if (minute >= 60 || hour > 24) {
90
+ return null;
91
+ }
92
+
93
+ if (hour >= 12) {
94
+ meridiem = Meridiem.PM;
95
+ }
96
+
97
+ // ----- AM & PM
98
+ if (match[AM_PM_HOUR_GROUP] != null) {
99
+ if (hour > 12) return null;
100
+ const ampm = match[AM_PM_HOUR_GROUP].toLowerCase();
101
+ if (ampm.match(/morgen|vormittag/)) {
102
+ meridiem = Meridiem.AM;
103
+ if (hour == 12) {
104
+ hour = 0;
105
+ }
106
+ }
107
+
108
+ if (ampm.match(/nachmittag|abend/)) {
109
+ meridiem = Meridiem.PM;
110
+ if (hour != 12) {
111
+ hour += 12;
112
+ }
113
+ }
114
+
115
+ if (ampm.match(/nacht/)) {
116
+ if (hour == 12) {
117
+ meridiem = Meridiem.AM;
118
+ hour = 0;
119
+ } else if (hour < 6) {
120
+ meridiem = Meridiem.AM;
121
+ } else {
122
+ meridiem = Meridiem.PM;
123
+ hour += 12;
124
+ }
125
+ }
126
+ }
127
+
128
+ extractingComponents.assign("hour", hour);
129
+ extractingComponents.assign("minute", minute);
130
+ if (meridiem !== null) {
131
+ extractingComponents.assign("meridiem", meridiem);
132
+ } else {
133
+ if (hour < 12) {
134
+ extractingComponents.imply("meridiem", Meridiem.AM);
135
+ } else {
136
+ extractingComponents.imply("meridiem", Meridiem.PM);
137
+ }
138
+ }
139
+
140
+ // ----- Second
141
+ if (match[SECOND_GROUP] != null) {
142
+ const second = parseInt(match[SECOND_GROUP]);
143
+ if (second >= 60) return null;
144
+
145
+ extractingComponents.assign("second", second);
146
+ }
147
+
148
+ return extractingComponents;
149
+ }
150
+ }
@@ -1,7 +1,6 @@
1
1
  import { AbstractTimeExpressionParser } from "../../../common/parsers/AbstractTimeExpressionParser";
2
2
  import { ParsingComponents } from "../../../results";
3
3
  import { ParsingContext } from "../../../chrono";
4
- import { Meridiem } from "../../../index";
5
4
 
6
5
  export default class DETimeExpressionParser extends AbstractTimeExpressionParser {
7
6
  primaryPrefix(): string {
@@ -12,30 +11,12 @@ export default class DETimeExpressionParser extends AbstractTimeExpressionParser
12
11
  return "\\s*(?:\\-|\\–|\\~|\\〜|bis)\\s*";
13
12
  }
14
13
 
15
- primarySuffix(): string {
16
- return "(?:\\s*uhr)?(?:\\s*(?:morgens|vormittags|nachmittags|abends|nachts))?(?=\\W|$)";
17
- }
18
-
19
14
  extractPrimaryTimeComponents(context: ParsingContext, match: RegExpMatchArray): ParsingComponents | null {
20
- const components = super.extractPrimaryTimeComponents(context, match);
21
- if (components) {
22
- if (match[0].endsWith("morgens") || match[0].endsWith("vormittags")) {
23
- components.assign("meridiem", Meridiem.AM);
24
- const hour = components.get("hour");
25
- if (hour < 12) {
26
- components.assign("hour", components.get("hour"));
27
- }
28
- }
29
-
30
- if (match[0].endsWith("nachmittags") || match[0].endsWith("abends") || match[0].endsWith("nachts")) {
31
- components.assign("meridiem", Meridiem.PM);
32
- const hour = components.get("hour");
33
- if (hour < 12) {
34
- components.assign("hour", components.get("hour") + 12);
35
- }
36
- }
15
+ // This looks more like a year e.g. 2020
16
+ if (match[0].match(/^\s*\d{4}\s*$/)) {
17
+ return null;
37
18
  }
38
19
 
39
- return components;
20
+ return super.extractPrimaryTimeComponents(context, match);
40
21
  }
41
22
  }
@@ -0,0 +1,42 @@
1
+ import { ParsingContext } from "../../../chrono";
2
+ import { NUMBER_PATTERN, parseNumberPattern, TIME_UNIT_DICTIONARY } from "../constants";
3
+ import { ParsingComponents } from "../../../results";
4
+ import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary";
5
+ import { reverseTimeUnits } from "../../../utils/timeunits";
6
+ import { matchAnyPattern } from "../../../utils/pattern";
7
+
8
+ export default class DETimeUnitAgoFormatParser extends AbstractParserWithWordBoundaryChecking {
9
+ constructor() {
10
+ super();
11
+ }
12
+
13
+ innerPattern(): RegExp {
14
+ return new RegExp(
15
+ `(?:\\s*((?:nächste|kommende|folgende|letzte|vergangene|vorige|vor(?:her|an)gegangene)(?:s|n|m|r)?|vor|in)\\s*)?` +
16
+ `(${NUMBER_PATTERN})?` +
17
+ `(?:\\s*(nächste|kommende|folgende|letzte|vergangene|vorige|vor(?:her|an)gegangene)(?:s|n|m|r)?)?` +
18
+ `\\s*(${matchAnyPattern(TIME_UNIT_DICTIONARY)})`,
19
+ "i"
20
+ );
21
+ }
22
+
23
+ innerExtract(context: ParsingContext, match: RegExpMatchArray) {
24
+ const num = match[2] ? parseNumberPattern(match[2]) : 1;
25
+ const unit = TIME_UNIT_DICTIONARY[match[4].toLowerCase()];
26
+ let timeUnits = {};
27
+ timeUnits[unit] = num;
28
+
29
+ // Modifier
30
+ let modifier = match[1] || match[3] || "";
31
+ modifier = modifier.toLowerCase();
32
+ if (!modifier) {
33
+ return;
34
+ }
35
+
36
+ if (/vor/.test(modifier) || /letzte/.test(modifier) || /vergangen/.test(modifier)) {
37
+ timeUnits = reverseTimeUnits(timeUnits);
38
+ }
39
+
40
+ return ParsingComponents.createRelativeFromReference(context.reference, timeUnits);
41
+ }
42
+ }
@@ -1,4 +1,4 @@
1
- import { OpUnitType } from "dayjs";
1
+ import { OpUnitType, QUnitType } from "dayjs";
2
2
  import { matchAnyPattern, repeatedTimeunitPattern } from "../../utils/pattern";
3
3
  import { findMostLikelyADYear } from "../../calculation/years";
4
4
  import { TimeUnits } from "../../utils/timeunits";
@@ -133,7 +133,7 @@ export const ORDINAL_WORD_DICTIONARY: { [word: string]: number } = {
133
133
  "thirty-first": 31,
134
134
  };
135
135
 
136
- export const TIME_UNIT_DICTIONARY: { [word: string]: OpUnitType } = {
136
+ export const TIME_UNIT_DICTIONARY: { [word: string]: OpUnitType | QUnitType } = {
137
137
  sec: "second",
138
138
  second: "second",
139
139
  seconds: "second",
@@ -152,6 +152,9 @@ export const TIME_UNIT_DICTIONARY: { [word: string]: OpUnitType } = {
152
152
  weeks: "week",
153
153
  month: "month",
154
154
  months: "month",
155
+ qtr: "quarter",
156
+ quarter: "quarter",
157
+ quarters: "quarter",
155
158
  y: "year",
156
159
  yr: "year",
157
160
  year: "year",
package/src/results.ts CHANGED
@@ -8,13 +8,12 @@ dayjs.extend(quarterOfYear);
8
8
 
9
9
  export class ReferenceWithTimezone {
10
10
  readonly instant: Date;
11
- readonly timezoneOffset?: number;
11
+ readonly timezoneOffset?: number | null;
12
12
 
13
13
  constructor(input?: ParsingReference | Date) {
14
14
  input = input ?? new Date();
15
15
  if (input instanceof Date) {
16
16
  this.instant = input;
17
- this.timezoneOffset = -input.getTimezoneOffset();
18
17
  } else {
19
18
  this.instant = input.instant ?? new Date();
20
19
  this.timezoneOffset = toTimezoneOffset(input.timezone);
@@ -133,7 +132,7 @@ export class ParsingComponents implements ParsedComponents {
133
132
  toString() {
134
133
  return `[ParsingComponents {knownValues: ${JSON.stringify(this.knownValues)}, impliedValues: ${JSON.stringify(
135
134
  this.impliedValues
136
- )}}]`;
135
+ )}}, reference: ${JSON.stringify(this.reference)}]`;
137
136
  }
138
137
 
139
138
  dayjs() {
package/src/timezone.ts CHANGED
@@ -192,8 +192,8 @@ export const TIMEZONE_ABBR_MAP = {
192
192
  YEKT: 360,
193
193
  };
194
194
 
195
- export function toTimezoneOffset(timezoneInput: string | number): number | null {
196
- if (timezoneInput === null) {
195
+ export function toTimezoneOffset(timezoneInput?: string | number): number | null {
196
+ if (timezoneInput === null || timezoneInput === undefined) {
197
197
  return null;
198
198
  }
199
199
 
@@ -201,5 +201,5 @@ export function toTimezoneOffset(timezoneInput: string | number): number | null
201
201
  return timezoneInput;
202
202
  }
203
203
 
204
- return TIMEZONE_ABBR_MAP[timezoneInput] ?? 0;
204
+ return TIMEZONE_ABBR_MAP[timezoneInput] ?? null;
205
205
  }
@@ -204,6 +204,18 @@ test("Test - Range expression", function () {
204
204
 
205
205
  expect(result.end).toBeDate(new Date(2013, 10 - 1, 12, 12));
206
206
  });
207
+
208
+ testSingleCase(chrono.de, "10. jänner 2012", new Date(2012, 7, 10), (result) => {
209
+ expect(result.start).not.toBeNull();
210
+ expect(result.start.get("year")).toBe(2012);
211
+ expect(result.start.get("month")).toBe(1);
212
+ expect(result.start.get("day")).toBe(10);
213
+
214
+ expect(result.index).toBe(0);
215
+ expect(result.text).toBe("10. jänner 2012");
216
+
217
+ expect(result.start).toBeDate(new Date(2012, 1 - 1, 10, 12));
218
+ });
207
219
  });
208
220
 
209
221
  test("Test - Combined expression", function () {
@@ -27,6 +27,11 @@ test("Test - Simple Expression", function () {
27
27
  expect(result.start.get("minute")).toBe(0);
28
28
  });
29
29
 
30
+ testSingleCase(chrono.de, "um 16h", new Date(2012, 7, 10), (result) => {
31
+ expect(result.start.get("hour")).toBe(16);
32
+ expect(result.start.get("minute")).toBe(0);
33
+ });
34
+
30
35
  testSingleCase(chrono.de, "um 7 morgens", new Date(2012, 7, 10), (result) => {
31
36
  expect(result.start.get("hour")).toBe(7);
32
37
  expect(result.start.get("minute")).toBe(0);
@@ -64,6 +69,22 @@ test("Test - Simple Expression", function () {
64
69
  expect(result.start.get("meridiem")).toBe(Meridiem.PM);
65
70
  expect(result.start.isCertain("meridiem")).toBeTruthy();
66
71
  });
72
+
73
+ testSingleCase(chrono.de, "um 8 Uhr in der Nacht", new Date(2012, 7, 10), (result, text) => {
74
+ expect(result.text).toBe(text);
75
+ expect(result.start.get("hour")).toBe(20);
76
+ expect(result.start.get("minute")).toBe(0);
77
+ expect(result.start.get("meridiem")).toBe(Meridiem.PM);
78
+ expect(result.start.isCertain("meridiem")).toBeTruthy();
79
+ });
80
+
81
+ testSingleCase(chrono.de, "um 5 Uhr in der Nacht", new Date(2012, 7, 10), (result, text) => {
82
+ expect(result.text).toBe(text);
83
+ expect(result.start.get("hour")).toBe(5);
84
+ expect(result.start.get("minute")).toBe(0);
85
+ expect(result.start.get("meridiem")).toBe(Meridiem.AM);
86
+ expect(result.start.isCertain("meridiem")).toBeTruthy();
87
+ });
67
88
  });
68
89
 
69
90
  test("Test - Range Expression", function () {
@@ -118,6 +139,44 @@ test("Test - Range Expression", function () {
118
139
 
119
140
  expect(result.end).toBeDate(new Date(2012, 7, 10, 23, 0));
120
141
  });
142
+
143
+ testSingleCase(chrono.de, " von 6h30 bis 23h00 ", new Date(2012, 7, 10), (result) => {
144
+ expect(result.index).toBe(1);
145
+ expect(result.text).toBe("von 6h30 bis 23h00");
146
+
147
+ expect(result.start).not.toBeNull();
148
+ expect(result.start.get("hour")).toBe(6);
149
+ expect(result.start.get("minute")).toBe(30);
150
+ expect(result.start.get("meridiem")).toBe(0);
151
+
152
+ expect(result.start).toBeDate(new Date(2012, 7, 10, 6, 30));
153
+
154
+ expect(result.end).not.toBeNull();
155
+ expect(result.end.get("hour")).toBe(23);
156
+ expect(result.end.get("minute")).toBe(0);
157
+ expect(result.end.get("meridiem")).toBe(1);
158
+
159
+ expect(result.end).toBeDate(new Date(2012, 7, 10, 23, 0));
160
+ });
161
+
162
+ testSingleCase(chrono.de, " von 6h30 morgens bis 11 am Abend", new Date(2012, 7, 10), (result) => {
163
+ expect(result.index).toBe(1);
164
+ expect(result.text).toBe("von 6h30 morgens bis 11 am Abend");
165
+
166
+ expect(result.start).not.toBeNull();
167
+ expect(result.start.get("hour")).toBe(6);
168
+ expect(result.start.get("minute")).toBe(30);
169
+ expect(result.start.get("meridiem")).toBe(0);
170
+
171
+ expect(result.start).toBeDate(new Date(2012, 7, 10, 6, 30));
172
+
173
+ expect(result.end).not.toBeNull();
174
+ expect(result.end.get("hour")).toBe(23);
175
+ expect(result.end.get("minute")).toBe(0);
176
+ expect(result.end.get("meridiem")).toBe(1);
177
+
178
+ expect(result.end).toBeDate(new Date(2012, 7, 10, 23, 0));
179
+ });
121
180
  });
122
181
 
123
182
  test("Test - Timezone extraction", function () {
@@ -0,0 +1,108 @@
1
+ import * as chrono from "../../src";
2
+ import { testSingleCase, testUnexpectedResult } from "../test_util";
3
+
4
+ // test("Test - fr - modifier mandatory just after", function () {
5
+ // testUnexpectedResult(chrono.de, "le mois d'avril");
6
+ //
7
+ // testUnexpectedResult(chrono.de, "le mois d'avril prochain");
8
+ // });
9
+
10
+ test("Test - de - relative date", function () {
11
+ testSingleCase(chrono.de, "kommende Woche", new Date(2017, 5 - 1, 12), (result, text) => {
12
+ expect(result.text).toBe(text);
13
+ expect(result.start.get("year")).toBe(2017);
14
+ expect(result.start.get("month")).toBe(5);
15
+ expect(result.start.get("day")).toBe(19);
16
+ });
17
+
18
+ testSingleCase(chrono.de, "in 2 Wochen", new Date(2017, 5 - 1, 12, 18, 11), (result, text) => {
19
+ expect(result.text).toBe(text);
20
+ expect(result.start.get("year")).toBe(2017);
21
+ expect(result.start.get("month")).toBe(5);
22
+ expect(result.start.get("day")).toBe(26);
23
+ expect(result.start.get("hour")).toBe(18);
24
+ expect(result.start.get("minute")).toBe(11);
25
+ });
26
+
27
+ testSingleCase(chrono.de, "in drei Wochen", new Date(2017, 5 - 1, 12), (result, text) => {
28
+ expect(result.text).toBe(text);
29
+ expect(result.start.get("year")).toBe(2017);
30
+ expect(result.start.get("month")).toBe(6);
31
+ expect(result.start.get("day")).toBe(2);
32
+ });
33
+
34
+ testSingleCase(chrono.de, "letzten Monat", new Date(2017, 5 - 1, 12), (result, text) => {
35
+ expect(result.text).toBe(text);
36
+ expect(result.start.get("year")).toBe(2017);
37
+ expect(result.start.get("month")).toBe(4);
38
+ expect(result.start.get("day")).toBe(12);
39
+ });
40
+
41
+ testSingleCase(chrono.de, "in den 30 vorangegangenen Tagen", new Date(2017, 5 - 1, 12), (result, text) => {
42
+ expect(result.text).toBe("30 vorangegangenen Tagen");
43
+ expect(result.start.get("year")).toBe(2017);
44
+ expect(result.start.get("month")).toBe(4);
45
+ expect(result.start.get("day")).toBe(12);
46
+ });
47
+
48
+ testSingleCase(chrono.de, "die vergangenen 24 Stunden", new Date(2017, 5 - 1, 12, 11, 27), (result, text) => {
49
+ expect(result.text).toBe("vergangenen 24 Stunden");
50
+ expect(result.start.get("year")).toBe(2017);
51
+ expect(result.start.get("month")).toBe(5);
52
+ expect(result.start.get("day")).toBe(11);
53
+ expect(result.start.get("hour")).toBe(11);
54
+ expect(result.start.get("minute")).toBe(27);
55
+ });
56
+
57
+ testSingleCase(chrono.de, "in den folgenden 90 sekunden", new Date(2017, 5 - 1, 12, 11, 27, 3), (result, text) => {
58
+ expect(result.text).toBe("folgenden 90 sekunden");
59
+ expect(result.start.get("year")).toBe(2017);
60
+ expect(result.start.get("month")).toBe(5);
61
+ expect(result.start.get("day")).toBe(12);
62
+ expect(result.start.get("hour")).toBe(11);
63
+ expect(result.start.get("minute")).toBe(28);
64
+ expect(result.start.get("second")).toBe(33);
65
+ });
66
+
67
+ testSingleCase(chrono.de, "die letzten acht Minuten", new Date(2017, 5 - 1, 12, 11, 27), (result, text) => {
68
+ expect(result.text).toBe("letzten acht Minuten");
69
+ expect(result.start.get("year")).toBe(2017);
70
+ expect(result.start.get("month")).toBe(5);
71
+ expect(result.start.get("day")).toBe(12);
72
+ expect(result.start.get("hour")).toBe(11);
73
+ expect(result.start.get("minute")).toBe(19);
74
+ expect(result.start.get("second")).toBe(0);
75
+ });
76
+
77
+ testSingleCase(chrono.de, "letztes Quartal", new Date(2017, 5 - 1, 12, 11, 27), (result, text) => {
78
+ expect(result.text).toBe(text);
79
+ expect(result.start.get("year")).toBe(2017);
80
+ expect(result.start.get("month")).toBe(2);
81
+ expect(result.start.get("day")).toBe(12);
82
+ expect(result.start.get("hour")).toBe(11);
83
+ expect(result.start.get("minute")).toBe(27);
84
+ expect(result.start.get("second")).toBe(0);
85
+
86
+ expect(result.start.isCertain("month")).toBeFalsy();
87
+ expect(result.start.isCertain("day")).toBeFalsy();
88
+ expect(result.start.isCertain("hour")).toBeFalsy();
89
+ expect(result.start.isCertain("minute")).toBeFalsy();
90
+ expect(result.start.isCertain("second")).toBeFalsy();
91
+ });
92
+
93
+ testSingleCase(chrono.de, "kommendes Jahr", new Date(2017, 5 - 1, 12, 11, 27), (result, text) => {
94
+ expect(result.text).toBe(text);
95
+ expect(result.start.get("year")).toBe(2018);
96
+ expect(result.start.get("month")).toBe(5);
97
+ expect(result.start.get("day")).toBe(12);
98
+ expect(result.start.get("hour")).toBe(11);
99
+ expect(result.start.get("minute")).toBe(27);
100
+ expect(result.start.get("second")).toBe(0);
101
+
102
+ expect(result.start.isCertain("month")).toBeFalsy();
103
+ expect(result.start.isCertain("day")).toBeFalsy();
104
+ expect(result.start.isCertain("hour")).toBeFalsy();
105
+ expect(result.start.isCertain("minute")).toBeFalsy();
106
+ expect(result.start.isCertain("second")).toBeFalsy();
107
+ });
108
+ });
@@ -0,0 +1,147 @@
1
+ import * as chrono from "../../src";
2
+ import { testSingleCase } from "../test_util";
3
+ //import DETimeExpressionParser from "../../src/locales/de/parsers/DETimeExpressionParser";
4
+
5
+ test("Test - Year numbers with v/nuZ Era label", () => {
6
+ testSingleCase(chrono.de, "10. August 234 v.u.Z.", new Date(2012, 7, 10), (result) => {
7
+ expect(result.index).toBe(0);
8
+ expect(result.text).toBe("10. August 234 v.u.Z."); // fails since text is `10 August 234`
9
+
10
+ expect(result.start).not.toBeNull();
11
+ expect(result.start.get("year")).toBe(-234);
12
+ expect(result.start.get("month")).toBe(8);
13
+ expect(result.start.get("day")).toBe(10);
14
+
15
+ //expect(result.start).toBeDate(new Date(-234, 8 - 1, 10, 12));
16
+ });
17
+
18
+ testSingleCase(chrono.de, "10. August 88 nuZ", new Date(2012, 7, 10), (result) => {
19
+ expect(result.index).toBe(0);
20
+ expect(result.text).toBe("10. August 88 nuZ");
21
+
22
+ expect(result.start).not.toBeNull();
23
+ expect(result.start.get("year")).toBe(88);
24
+ expect(result.start.get("month")).toBe(8);
25
+ expect(result.start.get("day")).toBe(10);
26
+
27
+ //const resultDate = result.start.date();
28
+ const expectDate = new Date(88, 8 - 1, 10, 12);
29
+ expectDate.setFullYear(88);
30
+ //expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime());
31
+ });
32
+
33
+ testSingleCase(chrono.de, "10. August 88 uZ", new Date(2012, 7, 10), (result) => {
34
+ expect(result.index).toBe(0);
35
+ expect(result.text).toBe("10. August 88 uZ");
36
+
37
+ expect(result.start).not.toBeNull();
38
+ expect(result.start.get("year")).toBe(88);
39
+ expect(result.start.get("month")).toBe(8);
40
+ expect(result.start.get("day")).toBe(10);
41
+
42
+ //const resultDate = result.start.date();
43
+ const expectDate = new Date(88, 8 - 1, 10, 12);
44
+ expectDate.setFullYear(88);
45
+ //expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime());
46
+ });
47
+
48
+ testSingleCase(chrono.de, "10. August 88 d.g.Z.", new Date(2012, 7, 10), (result) => {
49
+ expect(result.index).toBe(0);
50
+ expect(result.text).toBe("10. August 88 d.g.Z.");
51
+
52
+ expect(result.start).not.toBeNull();
53
+ expect(result.start.get("year")).toBe(88);
54
+ expect(result.start.get("month")).toBe(8);
55
+ expect(result.start.get("day")).toBe(10);
56
+
57
+ //const resultDate = result.start.date();
58
+ const expectDate = new Date(88, 8 - 1, 10, 12);
59
+ expectDate.setFullYear(88);
60
+ //expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime());
61
+ });
62
+ });
63
+
64
+ test("Test - Year numbers with v/nChr Era label", () => {
65
+ testSingleCase(chrono.de, "10. August 234 v.Chr.", new Date(2012, 7, 10), (result) => {
66
+ expect(result.index).toBe(0);
67
+ expect(result.text).toBe("10. August 234 v.Chr.");
68
+
69
+ expect(result.start).not.toBeNull();
70
+ expect(result.start.get("year")).toBe(-234);
71
+ expect(result.start.get("month")).toBe(8);
72
+ expect(result.start.get("day")).toBe(10);
73
+
74
+ //expect(result.start).toBeDate(new Date(-234, 8 - 1, 10, 12));
75
+ });
76
+
77
+ testSingleCase(chrono.de, "10. August 88 nC", new Date(2012, 7, 10), (result) => {
78
+ expect(result.index).toBe(0);
79
+ expect(result.text).toBe("10. August 88 nC");
80
+
81
+ expect(result.start).not.toBeNull();
82
+ expect(result.start.get("year")).toBe(88);
83
+ expect(result.start.get("month")).toBe(8);
84
+ expect(result.start.get("day")).toBe(10);
85
+
86
+ //const resultDate = result.start.date();
87
+ const expectDate = new Date(88, 8 - 1, 10, 12);
88
+ expectDate.setFullYear(88);
89
+ //expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime());
90
+ });
91
+ });
92
+
93
+ test("Test - Year numbers with v/ndgZ Era label", () => {
94
+ testSingleCase(chrono.de, "10. August 234 v.d.Z.", new Date(2012, 7, 10), (result) => {
95
+ expect(result.index).toBe(0);
96
+ expect(result.text).toBe("10. August 234 v.d.Z.");
97
+
98
+ expect(result.start).not.toBeNull();
99
+ expect(result.start.get("year")).toBe(-234);
100
+ expect(result.start.get("month")).toBe(8);
101
+ expect(result.start.get("day")).toBe(10);
102
+
103
+ //expect(result.start).toBeDate(new Date(-234, 8 - 1, 10, 12));
104
+ });
105
+
106
+ testSingleCase(chrono.de, "10. August 88 ndZ", new Date(2012, 7, 10), (result) => {
107
+ expect(result.index).toBe(0);
108
+ expect(result.text).toBe("10. August 88 ndZ");
109
+
110
+ expect(result.start).not.toBeNull();
111
+ expect(result.start.get("year")).toBe(88);
112
+ expect(result.start.get("month")).toBe(8);
113
+ expect(result.start.get("day")).toBe(10);
114
+
115
+ //const resultDate = result.start.date();
116
+ const expectDate = new Date(88, 8 - 1, 10, 12);
117
+ expectDate.setFullYear(88);
118
+ //expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime());
119
+ });
120
+
121
+ testSingleCase(chrono.de, "10. August 234 v.d.g.Z.", new Date(2012, 7, 10), (result) => {
122
+ expect(result.index).toBe(0);
123
+ expect(result.text).toBe("10. August 234 v.d.g.Z.");
124
+
125
+ expect(result.start).not.toBeNull();
126
+ expect(result.start.get("year")).toBe(-234);
127
+ expect(result.start.get("month")).toBe(8);
128
+ expect(result.start.get("day")).toBe(10);
129
+
130
+ //expect(result.start).toBeDate(new Date(-234, 8 - 1, 10, 12));
131
+ });
132
+
133
+ testSingleCase(chrono.de, "10. August 88 ndgZ", new Date(2012, 7, 10), (result) => {
134
+ expect(result.index).toBe(0);
135
+ expect(result.text).toBe("10. August 88 ndgZ");
136
+
137
+ expect(result.start).not.toBeNull();
138
+ expect(result.start.get("year")).toBe(88);
139
+ expect(result.start.get("month")).toBe(8);
140
+ expect(result.start.get("day")).toBe(10);
141
+
142
+ //const resultDate = result.start.date();
143
+ const expectDate = new Date(88, 8 - 1, 10, 12);
144
+ expectDate.setFullYear(88);
145
+ //expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime());
146
+ });
147
+ });