chrono-node 2.9.1 → 2.10.0

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 (211) hide show
  1. package/dist/cjs/locales/de/parsers/DECasualTimeParser.js +7 -0
  2. package/dist/cjs/locales/de/parsers/DECasualTimeParser.js.map +1 -1
  3. package/dist/cjs/locales/en/configuration.js +2 -0
  4. package/dist/cjs/locales/en/configuration.js.map +1 -1
  5. package/dist/cjs/locales/en/parsers/ENMonthNameLittleEndianParser.js +1 -1
  6. package/dist/cjs/locales/en/parsers/ENMonthNameLittleEndianParser.js.map +1 -1
  7. package/dist/cjs/locales/en/parsers/ENYearMonthNameParser.d.ts +6 -0
  8. package/dist/cjs/locales/en/parsers/ENYearMonthNameParser.js +31 -0
  9. package/dist/cjs/locales/en/parsers/ENYearMonthNameParser.js.map +1 -0
  10. package/dist/cjs/locales/fi/parsers/FICasualTimeParser.js +7 -0
  11. package/dist/cjs/locales/fi/parsers/FICasualTimeParser.js.map +1 -1
  12. package/dist/cjs/locales/fr/parsers/FRCasualTimeParser.js +5 -0
  13. package/dist/cjs/locales/fr/parsers/FRCasualTimeParser.js.map +1 -1
  14. package/dist/cjs/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js +2 -1
  15. package/dist/cjs/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js.map +1 -1
  16. package/dist/cjs/locales/it/parsers/ITCasualTimeParser.js +5 -0
  17. package/dist/cjs/locales/it/parsers/ITCasualTimeParser.js.map +1 -1
  18. package/dist/cjs/locales/uk/parsers/UKTimeUnitWithinFormatParser.js +1 -1
  19. package/dist/cjs/locales/uk/parsers/UKTimeUnitWithinFormatParser.js.map +1 -1
  20. package/dist/cjs/locales/zh/hans/index.js +2 -0
  21. package/dist/cjs/locales/zh/hans/index.js.map +1 -1
  22. package/dist/cjs/locales/zh/hans/parsers/ZHHansAgoFormatParser.d.ts +6 -0
  23. package/dist/cjs/locales/zh/hans/parsers/ZHHansAgoFormatParser.js +80 -0
  24. package/dist/cjs/locales/zh/hans/parsers/ZHHansAgoFormatParser.js.map +1 -0
  25. package/dist/cjs/locales/zh/hant/index.js +2 -0
  26. package/dist/cjs/locales/zh/hant/index.js.map +1 -1
  27. package/dist/cjs/locales/zh/hant/parsers/ZHHantAgoFormatParser.d.ts +6 -0
  28. package/dist/cjs/locales/zh/hant/parsers/ZHHantAgoFormatParser.js +80 -0
  29. package/dist/cjs/locales/zh/hant/parsers/ZHHantAgoFormatParser.js.map +1 -0
  30. package/dist/cjs/results.js +15 -9
  31. package/dist/cjs/results.js.map +1 -1
  32. package/dist/esm/locales/de/parsers/DECasualTimeParser.js +7 -0
  33. package/dist/esm/locales/de/parsers/DECasualTimeParser.js.map +1 -1
  34. package/dist/esm/locales/en/configuration.js +2 -0
  35. package/dist/esm/locales/en/configuration.js.map +1 -1
  36. package/dist/esm/locales/en/parsers/ENMonthNameLittleEndianParser.js +1 -1
  37. package/dist/esm/locales/en/parsers/ENMonthNameLittleEndianParser.js.map +1 -1
  38. package/dist/esm/locales/en/parsers/ENYearMonthNameParser.d.ts +6 -0
  39. package/dist/esm/locales/en/parsers/ENYearMonthNameParser.js +28 -0
  40. package/dist/esm/locales/en/parsers/ENYearMonthNameParser.js.map +1 -0
  41. package/dist/esm/locales/fi/parsers/FICasualTimeParser.js +7 -0
  42. package/dist/esm/locales/fi/parsers/FICasualTimeParser.js.map +1 -1
  43. package/dist/esm/locales/fr/parsers/FRCasualTimeParser.js +5 -0
  44. package/dist/esm/locales/fr/parsers/FRCasualTimeParser.js.map +1 -1
  45. package/dist/esm/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js +2 -1
  46. package/dist/esm/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js.map +1 -1
  47. package/dist/esm/locales/it/parsers/ITCasualTimeParser.js +5 -0
  48. package/dist/esm/locales/it/parsers/ITCasualTimeParser.js.map +1 -1
  49. package/dist/esm/locales/uk/parsers/UKTimeUnitWithinFormatParser.js +1 -1
  50. package/dist/esm/locales/uk/parsers/UKTimeUnitWithinFormatParser.js.map +1 -1
  51. package/dist/esm/locales/zh/hans/index.js +2 -0
  52. package/dist/esm/locales/zh/hans/index.js.map +1 -1
  53. package/dist/esm/locales/zh/hans/parsers/ZHHansAgoFormatParser.d.ts +6 -0
  54. package/dist/esm/locales/zh/hans/parsers/ZHHansAgoFormatParser.js +77 -0
  55. package/dist/esm/locales/zh/hans/parsers/ZHHansAgoFormatParser.js.map +1 -0
  56. package/dist/esm/locales/zh/hant/index.js +2 -0
  57. package/dist/esm/locales/zh/hant/index.js.map +1 -1
  58. package/dist/esm/locales/zh/hant/parsers/ZHHantAgoFormatParser.d.ts +6 -0
  59. package/dist/esm/locales/zh/hant/parsers/ZHHantAgoFormatParser.js +77 -0
  60. package/dist/esm/locales/zh/hant/parsers/ZHHantAgoFormatParser.js.map +1 -0
  61. package/dist/esm/results.js +14 -9
  62. package/dist/esm/results.js.map +1 -1
  63. package/package.json +5 -1
  64. package/src/locales/de/parsers/DECasualTimeParser.ts +7 -0
  65. package/src/locales/en/configuration.ts +2 -0
  66. package/src/locales/en/parsers/ENMonthNameLittleEndianParser.ts +1 -1
  67. package/src/locales/en/parsers/ENYearMonthNameParser.ts +38 -0
  68. package/src/locales/fi/parsers/FICasualTimeParser.ts +7 -0
  69. package/src/locales/fr/parsers/FRCasualTimeParser.ts +5 -0
  70. package/src/locales/fr/parsers/FRTimeUnitRelativeFormatParser.ts +2 -1
  71. package/src/locales/it/parsers/ITCasualTimeParser.ts +5 -0
  72. package/src/locales/uk/parsers/UKTimeUnitWithinFormatParser.ts +1 -1
  73. package/src/locales/zh/hans/index.ts +2 -0
  74. package/src/locales/zh/hans/parsers/ZHHansAgoFormatParser.ts +87 -0
  75. package/src/locales/zh/hant/index.ts +2 -0
  76. package/src/locales/zh/hant/parsers/ZHHantAgoFormatParser.ts +87 -0
  77. package/src/results.ts +40 -9
  78. package/test/calculation_duration.test.ts +0 -165
  79. package/test/calculation_weekdays.test.ts +0 -133
  80. package/test/de/de_casual.test.ts +0 -322
  81. package/test/de/de_dash.test.ts +0 -32
  82. package/test/de/de_month_name_little_endian.test.ts +0 -273
  83. package/test/de/de_time_exp.test.ts +0 -223
  84. package/test/de/de_time_units_casual_relative.test.ts +0 -120
  85. package/test/de/de_time_units_within.test.ts +0 -119
  86. package/test/de/de_weekday.test.ts +0 -158
  87. package/test/de/de_year.test.ts +0 -147
  88. package/test/debugging.test.ts +0 -17
  89. package/test/en/en.test.ts +0 -191
  90. package/test/en/en_casual.test.ts +0 -425
  91. package/test/en/en_inter_std.test.ts +0 -118
  92. package/test/en/en_merging_relative_dates.test.ts +0 -50
  93. package/test/en/en_month.test.ts +0 -295
  94. package/test/en/en_month_name_little_endian.test.ts +0 -448
  95. package/test/en/en_month_name_middle_endian.test.ts +0 -386
  96. package/test/en/en_performance.test.ts +0 -26
  97. package/test/en/en_relative.test.ts +0 -393
  98. package/test/en/en_slash.test.ts +0 -284
  99. package/test/en/en_time_exp.test.ts +0 -535
  100. package/test/en/en_time_units_ago.test.ts +0 -357
  101. package/test/en/en_time_units_casual_relative.test.ts +0 -186
  102. package/test/en/en_time_units_later.test.ts +0 -361
  103. package/test/en/en_time_units_within.test.ts +0 -417
  104. package/test/en/en_timezone_exp.test.ts +0 -410
  105. package/test/en/en_weekday.test.ts +0 -573
  106. package/test/en/en_year.test.ts +0 -138
  107. package/test/en/en_year_month_day.test.ts +0 -101
  108. package/test/en/negative_cases.test.ts +0 -99
  109. package/test/es/es_casual.test.ts +0 -175
  110. package/test/es/es_month_name_little_endian.test.ts +0 -217
  111. package/test/es/es_slash.test.ts +0 -26
  112. package/test/es/es_time_exp.test.ts +0 -175
  113. package/test/es/es_time_units_within.test.ts +0 -119
  114. package/test/fi/fi_casual.test.ts +0 -85
  115. package/test/fi/fi_casual_time.test.ts +0 -56
  116. package/test/fi/fi_month_name_little_endian.test.ts +0 -50
  117. package/test/fi/fi_time_exp.test.ts +0 -39
  118. package/test/fi/fi_time_units_ago.test.ts +0 -93
  119. package/test/fi/fi_time_units_casual_relative.test.ts +0 -117
  120. package/test/fi/fi_time_units_within.test.ts +0 -74
  121. package/test/fi/fi_weekday.test.ts +0 -90
  122. package/test/fr/fr_casual.test.ts +0 -300
  123. package/test/fr/fr_little_endian.test.ts +0 -320
  124. package/test/fr/fr_slash.test.ts +0 -49
  125. package/test/fr/fr_time_exp.test.ts +0 -588
  126. package/test/fr/fr_time_units_ago.test.ts +0 -103
  127. package/test/fr/fr_time_units_casual_relative.test.ts +0 -108
  128. package/test/fr/fr_time_units_within.test.ts +0 -129
  129. package/test/fr/fr_weekday.test.ts +0 -130
  130. package/test/it/it_casual.test.ts +0 -44
  131. package/test/it/it_month_name_little_endian.test.ts +0 -28
  132. package/test/it/it_month_name_middle_endian.test.ts +0 -39
  133. package/test/it/it_time_exp.test.ts +0 -84
  134. package/test/it/it_weekday.test.ts +0 -37
  135. package/test/it/it_year_month_day.test.ts +0 -41
  136. package/test/ja/ja_casual.test.ts +0 -73
  137. package/test/ja/ja_slash_date_format.test.ts +0 -60
  138. package/test/ja/ja_standard.test.ts +0 -235
  139. package/test/ja/ja_time_exp.test.ts +0 -305
  140. package/test/ja/ja_weekday.test.ts +0 -183
  141. package/test/nl/nl_casual.test.ts +0 -408
  142. package/test/nl/nl_month.test.ts +0 -205
  143. package/test/nl/nl_month_name_little_endian.test.ts +0 -358
  144. package/test/nl/nl_relative.test.ts +0 -242
  145. package/test/nl/nl_slash.test.ts +0 -206
  146. package/test/nl/nl_time_exp.test.ts +0 -79
  147. package/test/nl/nl_time_units_ago.test.ts +0 -243
  148. package/test/nl/nl_time_units_casual_relative.test.ts +0 -130
  149. package/test/nl/nl_time_units_later.test.ts +0 -250
  150. package/test/nl/nl_time_units_within.test.ts +0 -225
  151. package/test/nl/nl_weekday.test.ts +0 -216
  152. package/test/pt/pt_casual.test.ts +0 -175
  153. package/test/pt/pt_month_name_little_endian.test.ts +0 -217
  154. package/test/pt/pt_slash.test.ts +0 -26
  155. package/test/pt/pt_time_exp.test.ts +0 -175
  156. package/test/result.test.ts +0 -283
  157. package/test/ru/ru_casual.test.ts +0 -159
  158. package/test/ru/ru_month.test.ts +0 -70
  159. package/test/ru/ru_month_name_little_endian.test.ts +0 -145
  160. package/test/ru/ru_relative.test.ts +0 -107
  161. package/test/ru/ru_time_exp.test.ts +0 -111
  162. package/test/ru/ru_time_units_ago.test.ts +0 -48
  163. package/test/ru/ru_time_units_casual_relative.test.ts +0 -190
  164. package/test/ru/ru_time_units_within.test.ts +0 -16
  165. package/test/ru/ru_weekday.test.ts +0 -52
  166. package/test/sv/sv_casual.test.ts +0 -87
  167. package/test/sv/sv_month_name_little_endian.test.ts +0 -48
  168. package/test/sv/sv_time_units_casual_relative.test.ts +0 -143
  169. package/test/sv/sv_weekday.test.ts +0 -68
  170. package/test/system.test.ts +0 -247
  171. package/test/system_timezone.test.ts +0 -284
  172. package/test/test_util.ts +0 -135
  173. package/test/uk/uk_casual.test.ts +0 -153
  174. package/test/uk/uk_month.test.ts +0 -70
  175. package/test/uk/uk_month_name_little_endian.test.ts +0 -148
  176. package/test/uk/uk_relative.test.ts +0 -107
  177. package/test/uk/uk_time_exp.test.ts +0 -111
  178. package/test/uk/uk_time_units_ago.test.ts +0 -48
  179. package/test/uk/uk_time_units_casual_relative.test.ts +0 -142
  180. package/test/uk/uk_time_units_within.test.ts +0 -16
  181. package/test/uk/uk_weekday.test.ts +0 -52
  182. package/test/vi/vi_casual.test.ts +0 -84
  183. package/test/vi/vi_casual_time.test.ts +0 -77
  184. package/test/vi/vi_date_range.test.ts +0 -61
  185. package/test/vi/vi_forward_date.test.ts +0 -45
  186. package/test/vi/vi_month_year.test.ts +0 -40
  187. package/test/vi/vi_negative_cases.test.ts +0 -60
  188. package/test/vi/vi_slash.test.ts +0 -36
  189. package/test/vi/vi_standard.test.ts +0 -86
  190. package/test/vi/vi_strict.test.ts +0 -67
  191. package/test/vi/vi_time_exp.test.ts +0 -99
  192. package/test/vi/vi_time_units_ago.test.ts +0 -56
  193. package/test/vi/vi_time_units_casual_relative.test.ts +0 -56
  194. package/test/vi/vi_time_units_later.test.ts +0 -43
  195. package/test/vi/vi_time_units_within.test.ts +0 -24
  196. package/test/vi/vi_weekday.test.ts +0 -77
  197. package/test/vi/vi_year.test.ts +0 -42
  198. package/test/zh/hans/zh_hans_casual.test.ts +0 -242
  199. package/test/zh/hans/zh_hans_date.test.ts +0 -116
  200. package/test/zh/hans/zh_hans_deadline.test.ts +0 -175
  201. package/test/zh/hans/zh_hans_time_exp.test.ts +0 -508
  202. package/test/zh/hans/zh_hans_weekday.test.ts +0 -219
  203. package/test/zh/hant/zh_hant_casual.test.ts +0 -260
  204. package/test/zh/hant/zh_hant_date.test.ts +0 -116
  205. package/test/zh/hant/zh_hant_deadline.test.ts +0 -136
  206. package/test/zh/hant/zh_hant_time_exp.test.ts +0 -226
  207. package/test/zh/hant/zh_hant_weekday.test.ts +0 -175
  208. package/test/zh/zh.test.ts +0 -36
  209. package/tsconfig.build.esm.json +0 -8
  210. package/tsconfig.build.json +0 -10
  211. package/tsconfig.json +0 -29
@@ -1,84 +0,0 @@
1
- import * as chrono from "../../src/";
2
- import { testSingleCase } from "../test_util";
3
-
4
- test("Test - h\u00f4m nay (today)", () => {
5
- testSingleCase(chrono.vi, "Cu\u1ed9c h\u1ecdn h\u00f4m nay.", new Date(2012, 7, 10, 12), (r) => {
6
- expect(r.index).toBe(9);
7
- expect(r.text).toBe("h\u00f4m nay");
8
- expect(r.start.get("year")).toBe(2012);
9
- expect(r.start.get("month")).toBe(8);
10
- expect(r.start.get("day")).toBe(10);
11
- expect(r.start).toBeDate(new Date(2012, 7, 10, 12));
12
- });
13
- });
14
-
15
- test("Test - h\u00f4m qua (yesterday)", () => {
16
- testSingleCase(chrono.vi, "H\u1ed9i ngh\u1ecb h\u00f4m qua.", new Date(2012, 7, 10, 12), (r) => {
17
- expect(r.index).toBe(9);
18
- expect(r.text).toBe("h\u00f4m qua");
19
- expect(r.start.get("year")).toBe(2012);
20
- expect(r.start.get("month")).toBe(8);
21
- expect(r.start.get("day")).toBe(9);
22
- expect(r.start).toBeDate(new Date(2012, 7, 9, 12));
23
- });
24
-
25
- testSingleCase(chrono.vi, "h\u00f4m qua", new Date(2012, 7, 1, 12), (r) => {
26
- expect(r.start.get("month")).toBe(7); // July — crosses month boundary
27
- expect(r.start.get("day")).toBe(31);
28
- });
29
- });
30
-
31
- test("Test - ng\u00e0y mai (tomorrow)", () => {
32
- testSingleCase(chrono.vi, "L\u1ecbch ng\u00e0y mai.", new Date(2012, 7, 10, 12), (r) => {
33
- expect(r.index).toBe(5);
34
- expect(r.text).toBe("ng\u00e0y mai");
35
- expect(r.start.get("day")).toBe(11);
36
- expect(r.start.get("month")).toBe(8);
37
- expect(r.start).toBeDate(new Date(2012, 7, 11, 12));
38
- });
39
-
40
- testSingleCase(chrono.vi, "ng\u00e0y mai", new Date(2012, 7, 31, 12), (r) => {
41
- expect(r.start.get("month")).toBe(9); // Sept — crosses month boundary
42
- expect(r.start.get("day")).toBe(1);
43
- });
44
- });
45
-
46
- test("Test - ng\u00e0y kia (day after tomorrow)", () => {
47
- testSingleCase(chrono.vi, "ng\u00e0y kia", new Date(2012, 7, 10, 12), (r) => {
48
- expect(r.text).toBe("ng\u00e0y kia");
49
- expect(r.start.get("day")).toBe(12);
50
- });
51
- });
52
-
53
- test("Test - b\u00e2y gi\u1edd / l\u00fac n\u00e0y (now)", () => {
54
- testSingleCase(chrono.vi, "b\u00e2y gi\u1edd", new Date(2012, 7, 10, 8, 9, 10, 11), (r) => {
55
- expect(r.start.get("year")).toBe(2012);
56
- expect(r.start.get("month")).toBe(8);
57
- expect(r.start.get("day")).toBe(10);
58
- expect(r.start.get("hour")).toBe(8);
59
- expect(r.start.get("minute")).toBe(9);
60
- expect(r.start.get("second")).toBe(10);
61
- expect(r.start).toBeDate(new Date(2012, 7, 10, 8, 9, 10, 11));
62
- });
63
-
64
- testSingleCase(chrono.vi, "l\u00fac n\u00e0y", new Date(2012, 7, 10, 8, 9, 10, 11), (r) => {
65
- expect(r.start.get("hour")).toBe(8);
66
- });
67
- });
68
-
69
- test("Test - hôm kia (day before yesterday, -2)", () => {
70
- testSingleCase(chrono.vi, "hôm kia", new Date(2012, 7, 10, 12), (r) => {
71
- expect(r.start.get("year")).toBe(2012);
72
- expect(r.start.get("month")).toBe(8);
73
- expect(r.start.get("day")).toBe(8); // 10 - 2
74
- });
75
- });
76
-
77
- test("Test - isCertain: casual date sets day/month/year certain, hour not", () => {
78
- testSingleCase(chrono.vi, "hôm nay", new Date(2012, 7, 10, 12), (r) => {
79
- expect(r.start.isCertain("day")).toBe(true);
80
- expect(r.start.isCertain("month")).toBe(true);
81
- expect(r.start.isCertain("year")).toBe(true);
82
- expect(r.start.isCertain("hour")).toBe(false);
83
- });
84
- });
@@ -1,77 +0,0 @@
1
- import * as chrono from "../../src/";
2
- import { testSingleCase } from "../test_util";
3
-
4
- const REF = new Date(2012, 7, 10, 12); // 2012-08-10 noon
5
-
6
- test("Test - sáng (morning, AM)", () => {
7
- // "buổi sáng" is a time-of-day modifier; test it with an explicit time expression
8
- testSingleCase(chrono.vi, "7 giờ sáng", REF, (r) => {
9
- expect(r.start.get("hour")).toBe(7);
10
- expect(r.start.get("meridiem")).toBe(0); // AM
11
- });
12
- // standalone "sáng" sets implied hour=9, AM
13
- testSingleCase(chrono.vi, "hôm nay buổi sáng", new Date(2012, 7, 10, 6), (r) => {
14
- expect(r.start.get("hour")).toBe(9);
15
- expect(r.start.get("meridiem")).toBe(0); // AM
16
- });
17
- });
18
-
19
- test("Test - trưa (noon, PM)", () => {
20
- testSingleCase(chrono.vi, "buổi trưa", REF, (r) => {
21
- expect(r.start.get("hour")).toBe(12);
22
- expect(r.start.get("meridiem")).toBe(1); // PM — noon is 12:00 PM
23
- });
24
- });
25
-
26
- test("Test - chiều (afternoon, PM)", () => {
27
- testSingleCase(chrono.vi, "buổi chiều", REF, (r) => {
28
- expect(r.start.get("hour")).toBe(15);
29
- expect(r.start.get("meridiem")).toBe(1); // PM
30
- });
31
- });
32
-
33
- test("Test - tối (evening, PM)", () => {
34
- testSingleCase(chrono.vi, "buổi tối", REF, (r) => {
35
- expect(r.start.get("hour")).toBe(19);
36
- expect(r.start.get("meridiem")).toBe(1); // PM
37
- });
38
- });
39
-
40
- test("Test - đêm (late night, PM)", () => {
41
- testSingleCase(chrono.vi, "buổi đêm", REF, (r) => {
42
- expect(r.start.get("hour")).toBe(22);
43
- expect(r.start.get("meridiem")).toBe(1); // PM
44
- });
45
-
46
- // Standalone "đêm" without "buổi" prefix — works after removing \b from pattern
47
- testSingleCase(chrono.vi, "đêm", REF, (r) => {
48
- expect(r.start.get("hour")).toBe(22);
49
- expect(r.start.get("meridiem")).toBe(1); // PM
50
- });
51
- });
52
-
53
- test("Test - nửa đêm (midnight, AM)", () => {
54
- testSingleCase(chrono.vi, "nửa đêm", REF, (r) => {
55
- expect(r.start.get("hour")).toBe(0);
56
- expect(r.start.get("meridiem")).toBe(0); // AM
57
- });
58
- });
59
-
60
- test("Test - bình minh / sáng sớm (dawn)", () => {
61
- testSingleCase(chrono.vi, "bình minh", REF, (r) => {
62
- expect(r.start.get("hour")).toBe(6);
63
- expect(r.start.get("meridiem")).toBe(0); // AM
64
- });
65
-
66
- testSingleCase(chrono.vi, "sáng sớm", REF, (r) => {
67
- expect(r.start.get("hour")).toBe(6);
68
- expect(r.start.get("meridiem")).toBe(0); // AM
69
- });
70
- });
71
-
72
- test("Test - time keyword merges with date", () => {
73
- testSingleCase(chrono.vi, "hôm nay buổi chiều", REF, (r) => {
74
- expect(r.start.get("day")).toBe(10);
75
- expect(r.start.get("hour")).toBe(15);
76
- });
77
- });
@@ -1,61 +0,0 @@
1
- import * as chrono from "../../src/";
2
- import { testSingleCase } from "../test_util";
3
-
4
- const REF = new Date(2012, 7, 10, 12); // 2012-08-10 noon
5
-
6
- test("Test - từ ngày X đến ngày Y (đến connector)", () => {
7
- testSingleCase(chrono.vi, "từ ngày 5 tháng 8 đến ngày 10 tháng 8 năm 2012", REF, (r) => {
8
- expect(r.start.get("day")).toBe(5);
9
- expect(r.start.get("month")).toBe(8);
10
- expect(r.start.get("year")).toBe(2012);
11
-
12
- expect(r.end).not.toBeNull();
13
- expect(r.end.get("day")).toBe(10);
14
- expect(r.end.get("month")).toBe(8);
15
- expect(r.end.get("year")).toBe(2012);
16
- });
17
- });
18
-
19
- test("Test - em dash separator (–)", () => {
20
- testSingleCase(chrono.vi, "ngày 1 tháng 4 – ngày 30 tháng 4 năm 2000", REF, (r) => {
21
- expect(r.start.get("day")).toBe(1);
22
- expect(r.start.get("month")).toBe(4);
23
-
24
- expect(r.end).not.toBeNull();
25
- expect(r.end.get("day")).toBe(30);
26
- expect(r.end.get("month")).toBe(4);
27
- expect(r.end.get("year")).toBe(2000);
28
- });
29
- });
30
-
31
- test("Test - hyphen separator (-)", () => {
32
- testSingleCase(chrono.vi, "ngày 3 tháng 9 - ngày 5 tháng 9 năm 1945", REF, (r) => {
33
- expect(r.start.get("day")).toBe(3);
34
- expect(r.start.get("month")).toBe(9);
35
- expect(r.start.get("year")).toBe(1945);
36
-
37
- expect(r.end).not.toBeNull();
38
- expect(r.end.get("day")).toBe(5);
39
- expect(r.end.get("month")).toBe(9);
40
- expect(r.end.get("year")).toBe(1945);
41
- });
42
- });
43
-
44
- test("Test - tới connector", () => {
45
- testSingleCase(chrono.vi, "tháng 3 tới tháng 5 năm 1975", REF, (r) => {
46
- expect(r.start.get("month")).toBe(3);
47
-
48
- expect(r.end).not.toBeNull();
49
- expect(r.end.get("month")).toBe(5);
50
- expect(r.end.get("year")).toBe(1975);
51
- });
52
- });
53
-
54
- test("Test - start is before end", () => {
55
- testSingleCase(chrono.vi, "ngày 1 tháng 1 đến ngày 31 tháng 12 năm 2020", REF, (r) => {
56
- expect(r.end).not.toBeNull();
57
- const startDate = r.start.date();
58
- const endDate = r.end.date();
59
- expect(startDate.getTime()).toBeLessThan(endDate.getTime());
60
- });
61
- });
@@ -1,45 +0,0 @@
1
- import * as chrono from "../../src/";
2
- import { testSingleCase } from "../test_util";
3
-
4
- test("Test - forwardDate: time-only rolls to next day when ref is past", () => {
5
- // "7 gi\u1edd s\u00e1ng" = 7:00 AM; ref is 8:00 AM same day \u2192 next day
6
- testSingleCase(chrono.vi, "7 gi\u1edd s\u00e1ng", new Date(2012, 7, 10, 8, 0), { forwardDate: true }, (r) => {
7
- expect(r.start.get("day")).toBe(11);
8
- expect(r.start.get("hour")).toBe(7);
9
- });
10
- });
11
-
12
- test("Test - forwardDate: weekday rolls to next occurrence", () => {
13
- // REF = Tuesday Aug 14, 2012; "th\u1ee9 hai" (Monday) last was Aug 13 \u2192 next Monday = Aug 20
14
- testSingleCase(chrono.vi, "th\u1ee9 hai", new Date(2012, 7, 14, 12), { forwardDate: true }, (r) => {
15
- expect(r.start.get("weekday")).toBe(1);
16
- expect(r.start.get("day")).toBe(20);
17
- expect(r.start.get("month")).toBe(8);
18
- });
19
- });
20
-
21
- test("Test - forwardDate: slash date without year rolls to next year", () => {
22
- // "15/3" = March 15; ref is Aug 10 (past March) \u2192 year 2013
23
- testSingleCase(chrono.vi, "15/3", new Date(2012, 7, 10, 12), { forwardDate: true }, (r) => {
24
- expect(r.start.get("day")).toBe(15);
25
- expect(r.start.get("month")).toBe(3);
26
- expect(r.start.get("year")).toBe(2013);
27
- });
28
- });
29
-
30
- test("Test - forwardDate: same weekday as ref stays on same day", () => {
31
- // REF = Thursday Aug 9, 2012; "thứ năm" (Thursday) = same day → stays on Aug 9 (not past)
32
- testSingleCase(chrono.vi, "th\u1ee9 n\u0103m", new Date(2012, 7, 9, 12), { forwardDate: true }, (r) => {
33
- expect(r.start.get("weekday")).toBe(4);
34
- expect(r.start.get("day")).toBe(9);
35
- expect(r.start.get("month")).toBe(8);
36
- });
37
- });
38
-
39
- test("Test - forwardDate: month without year rolls to next year", () => {
40
- // "th\u00e1ng 3" = March; ref is Aug 10 \u2192 next March = 2013
41
- testSingleCase(chrono.vi, "th\u00e1ng 3", new Date(2012, 7, 10, 12), { forwardDate: true }, (r) => {
42
- expect(r.start.get("month")).toBe(3);
43
- expect(r.start.get("year")).toBe(2013);
44
- });
45
- });
@@ -1,40 +0,0 @@
1
- import * as chrono from "../../src/";
2
- import { testSingleCase, testUnexpectedResult } from "../test_util";
3
-
4
- const REF = new Date(2012, 7, 10, 12); // 2012-08-10
5
-
6
- test("Test - tháng M năm YYYY", () => {
7
- testSingleCase(chrono.vi, "tháng 4 năm 1975", REF, (r) => {
8
- expect(r.text).toBe("tháng 4 năm 1975");
9
- expect(r.start.get("month")).toBe(4);
10
- expect(r.start.get("year")).toBe(1975);
11
- expect(r.start.isCertain("month")).toBe(true);
12
- expect(r.start.isCertain("year")).toBe(true);
13
- expect(r.start.isCertain("day")).toBe(false); // day is implied
14
- });
15
-
16
- testSingleCase(chrono.vi, "tháng 1 năm 1863", REF, (r) => {
17
- expect(r.start.get("month")).toBe(1);
18
- expect(r.start.get("year")).toBe(1863);
19
- });
20
- });
21
-
22
- test("Test - tháng M/YYYY (slash separator)", () => {
23
- testSingleCase(chrono.vi, "tháng 3/1975", REF, (r) => {
24
- expect(r.start.get("month")).toBe(3);
25
- expect(r.start.get("year")).toBe(1975);
26
- });
27
- });
28
-
29
- test("Test - tháng M only (implies current year)", () => {
30
- testSingleCase(chrono.vi, "tháng 3", REF, (r) => {
31
- expect(r.start.get("month")).toBe(3);
32
- expect(r.start.isCertain("year")).toBe(false); // year implied from reference
33
- expect(r.start.get("year")).toBe(2012);
34
- });
35
- });
36
-
37
- test("Test - negative: month > 12 rejected", () => {
38
- testUnexpectedResult(chrono.vi, "tháng 13", REF);
39
- testUnexpectedResult(chrono.vi, "tháng 0", REF);
40
- });
@@ -1,60 +0,0 @@
1
- import * as chrono from "../../src/";
2
- import { testUnexpectedResult } from "../test_util";
3
-
4
- const REF = new Date(2012, 7, 10, 12); // 2012-08-10
5
-
6
- test("Test - invalid day rejected", () => {
7
- testUnexpectedResult(chrono.vi, "ngày 0 tháng 4 năm 2000", REF);
8
- // "ngày 32 tháng 4" — VIStandardParser skips "ngày 3" and sub-matches "2 tháng 4"
9
- // (day bounds are not pre-validated in the regex). This is known parser behaviour.
10
- });
11
-
12
- test("Test - invalid month rejected", () => {
13
- testUnexpectedResult(chrono.vi, "tháng 0", REF);
14
- testUnexpectedResult(chrono.vi, "tháng 13", REF);
15
- testUnexpectedResult(chrono.vi, "ngày 1 tháng 13", REF);
16
- });
17
-
18
- test("Test - invalid slash date rejected", () => {
19
- testUnexpectedResult(chrono.vi, "32/13/2020", REF);
20
- });
21
-
22
- test("Test - bare 4-digit number without năm prefix is not a year", () => {
23
- testUnexpectedResult(chrono.vi, "Có 1975 người tham gia.", REF);
24
- });
25
-
26
- test("Test - phone number not parsed as date", () => {
27
- testUnexpectedResult(chrono.vi, "0912345678", REF);
28
- });
29
-
30
- test("Test - bare numbers not parsed as dates", () => {
31
- testUnexpectedResult(chrono.vi, "3", REF);
32
- testUnexpectedResult(chrono.vi, "11", REF);
33
- testUnexpectedResult(chrono.vi, "0.5", REF);
34
- testUnexpectedResult(chrono.vi, "35.49", REF);
35
- testUnexpectedResult(chrono.vi, "12.53%", REF);
36
- });
37
-
38
- test("Test - currency and measurement not parsed as dates", () => {
39
- testUnexpectedResult(chrono.vi, "$1,194.09", REF);
40
- testUnexpectedResult(chrono.vi, "at 6.5 kilograms", REF);
41
- });
42
-
43
- test("Test - version numbers not parsed as dates", () => {
44
- testUnexpectedResult(chrono.vi, "1.1.3", REF);
45
- testUnexpectedResult(chrono.vi, "1.10.30", REF);
46
- });
47
-
48
- test("Test - hyphenated number ranges not parsed as dates", () => {
49
- testUnexpectedResult(chrono.vi, "1-2", REF);
50
- testUnexpectedResult(chrono.vi, "1-2-3", REF);
51
- });
52
-
53
- test("Test - URL-encoded strings not parsed as dates", () => {
54
- testUnexpectedResult(chrono.vi, "%e7%b7%8a", REF);
55
- });
56
-
57
- test("Test - impossible minute rejected", () => {
58
- testUnexpectedResult(chrono.vi, "7 giờ 61 phút", REF);
59
- testUnexpectedResult(chrono.vi, "7 giờ 99 phút", REF);
60
- });
@@ -1,36 +0,0 @@
1
- import * as chrono from "../../src/";
2
- import { testSingleCase } from "../test_util";
3
-
4
- const REF = new Date(2012, 7, 10, 12);
5
-
6
- test("Test - DD/MM/YYYY (little-endian)", () => {
7
- testSingleCase(chrono.vi, "Ng\u00e0y 30/04/1975.", REF, (r) => {
8
- expect(r.index).toBe(5);
9
- expect(r.start.get("day")).toBe(30);
10
- expect(r.start.get("month")).toBe(4);
11
- expect(r.start.get("year")).toBe(1975);
12
- });
13
-
14
- testSingleCase(chrono.vi, "H\u1ed9i ngh\u1ecb 01/01/1954", REF, (r) => {
15
- expect(r.index).toBe(9);
16
- expect(r.start.get("day")).toBe(1);
17
- expect(r.start.get("month")).toBe(1);
18
- expect(r.start.get("year")).toBe(1954);
19
- });
20
- });
21
-
22
- test("Test - D/M/YYYY (no zero padding)", () => {
23
- testSingleCase(chrono.vi, "3/5/1968", REF, (r) => {
24
- expect(r.start.get("day")).toBe(3);
25
- expect(r.start.get("month")).toBe(5);
26
- expect(r.start.get("year")).toBe(1968);
27
- });
28
- });
29
-
30
- test("Test - ISO 2024-03-15 also parses", () => {
31
- testSingleCase(chrono.vi, "Ng\u00e0y 2024-03-15 l\u00e0 quan tr\u1ecdng.", REF, (r) => {
32
- expect(r.start.get("year")).toBe(2024);
33
- expect(r.start.get("month")).toBe(3);
34
- expect(r.start.get("day")).toBe(15);
35
- });
36
- });
@@ -1,86 +0,0 @@
1
- import * as chrono from "../../src/";
2
- import { testSingleCase, testUnexpectedResult } from "../test_util";
3
-
4
- const REF = new Date(2012, 7, 10, 12, 0, 0); // 2012-08-10
5
-
6
- test("Test - ng\u00e0y D th\u00e1ng M n\u0103m YYYY (full with ng\u00e0y prefix)", () => {
7
- testSingleCase(
8
- chrono.vi,
9
- "Ng\u00e0y 30 th\u00e1ng 4 n\u0103m 1975 l\u00e0 ng\u00e0y gi\u1ea3i ph\u00f3ng.",
10
- REF,
11
- (r) => {
12
- expect(r.start.get("year")).toBe(1975);
13
- expect(r.start.get("month")).toBe(4);
14
- expect(r.start.get("day")).toBe(30);
15
- expect(r.start.isCertain("year")).toBe(true);
16
- expect(r.start.isCertain("month")).toBe(true);
17
- expect(r.start.isCertain("day")).toBe(true);
18
- }
19
- );
20
-
21
- testSingleCase(
22
- chrono.vi,
23
- "Hi\u1ec7p \u0111\u1ecbnh \u0111\u01b0\u1ee3c k\u00fd ng\u00e0y 27 th\u00e1ng 1 n\u0103m 1973.",
24
- REF,
25
- (r) => {
26
- expect(r.text).toBe("ng\u00e0y 27 th\u00e1ng 1 n\u0103m 1973");
27
- expect(r.start.get("year")).toBe(1973);
28
- expect(r.start.get("month")).toBe(1);
29
- expect(r.start.get("day")).toBe(27);
30
- }
31
- );
32
-
33
- testSingleCase(chrono.vi, "ng\u00e0y 2 th\u00e1ng 9 n\u0103m 1945", REF, (r) => {
34
- expect(r.start.get("year")).toBe(1945);
35
- expect(r.start.get("month")).toBe(9);
36
- expect(r.start.get("day")).toBe(2);
37
- });
38
- });
39
-
40
- test("Test - D th\u00e1ng M n\u0103m YYYY (no ng\u00e0y prefix)", () => {
41
- testSingleCase(
42
- chrono.vi,
43
- "7 th\u00e1ng 5 n\u0103m 1954 l\u00e0 ng\u00e0y ch\u1ea5m d\u1ee9t tr\u1eadn \u0110i\u1ec7n Bi\u00ean Ph\u1ee7.",
44
- REF,
45
- (r) => {
46
- expect(r.start.get("day")).toBe(7);
47
- expect(r.start.get("month")).toBe(5);
48
- expect(r.start.get("year")).toBe(1954);
49
- }
50
- );
51
-
52
- testSingleCase(chrono.vi, "1 th\u00e1ng 1 n\u0103m 1863", REF, (r) => {
53
- expect(r.start.get("day")).toBe(1);
54
- expect(r.start.get("month")).toBe(1);
55
- expect(r.start.get("year")).toBe(1863);
56
- });
57
- });
58
-
59
- test("Test - Date without year implies closest year", () => {
60
- testSingleCase(chrono.vi, "ng\u00e0y 15 th\u00e1ng 3", REF, (r) => {
61
- expect(r.start.get("day")).toBe(15);
62
- expect(r.start.get("month")).toBe(3);
63
- expect(r.start.isCertain("year")).toBe(false);
64
- expect(r.start.isCertain("day")).toBe(true);
65
- expect(r.start.isCertain("month")).toBe(true);
66
- });
67
- });
68
-
69
- test("Test - index position is correct", () => {
70
- testSingleCase(
71
- chrono.vi,
72
- "S\u1ef1 ki\u1ec7n ng\u00e0y 30 th\u00e1ng 4 n\u0103m 1975 quan tr\u1ecdng.",
73
- REF,
74
- (r) => {
75
- expect(r.index).toBe(8);
76
- expect(r.text).toBe("ng\u00e0y 30 th\u00e1ng 4 n\u0103m 1975");
77
- expect(r.start.get("year")).toBe(1975);
78
- }
79
- );
80
- });
81
-
82
- test("Test - negative: invalid month rejected", () => {
83
- // tháng 13 is rejected; without a year, no other parser fires
84
- testUnexpectedResult(chrono.vi, "ngày 1 tháng 13", REF);
85
- // "ngày 32 tháng 4" partially matches as "2 tháng 4" — day bounds enforced by VIStandardParser (day > 31)
86
- });
@@ -1,67 +0,0 @@
1
- import * as chrono from "../../src/";
2
- import { testSingleCase, testUnexpectedResult } from "../test_util";
3
-
4
- const REF = new Date(2012, 7, 10, 12); // 2012-08-10
5
-
6
- test("Test - Strict rejects casual date expressions", () => {
7
- testUnexpectedResult(chrono.vi.strict, "h\u00f4m nay", REF);
8
- testUnexpectedResult(chrono.vi.strict, "h\u00f4m qua", REF);
9
- testUnexpectedResult(chrono.vi.strict, "ng\u00e0y mai", REF);
10
- testUnexpectedResult(chrono.vi.strict, "ng\u00e0y kia", REF);
11
- });
12
-
13
- test("Test - Strict rejects casual time-of-day expressions", () => {
14
- testUnexpectedResult(chrono.vi.strict, "bu\u1ed5i s\u00e1ng", REF);
15
- testUnexpectedResult(chrono.vi.strict, "bu\u1ed5i tr\u01b0a", REF);
16
- testUnexpectedResult(chrono.vi.strict, "bu\u1ed5i chi\u1ec1u", REF);
17
- testUnexpectedResult(chrono.vi.strict, "bu\u1ed5i t\u1ed1i", REF);
18
- });
19
-
20
- test("Test - Strict rejects casual relative expressions", () => {
21
- testUnexpectedResult(chrono.vi.strict, "tu\u1ea7n n\u00e0y", REF);
22
- testUnexpectedResult(chrono.vi.strict, "th\u00e1ng tr\u01b0\u1edbc", REF);
23
- testUnexpectedResult(chrono.vi.strict, "n\u0103m sau", REF);
24
- });
25
-
26
- test("Test - Strict rejects weekday-only expressions", () => {
27
- testUnexpectedResult(chrono.vi.strict, "th\u1ee9 hai", REF);
28
- testUnexpectedResult(chrono.vi.strict, "ch\u1ee7 nh\u1eadt", REF);
29
- });
30
-
31
- test("Test - Strict accepts standard full dates and times", () => {
32
- testSingleCase(chrono.vi.strict, "ng\u00e0y 30 th\u00e1ng 4 n\u0103m 1975", REF, (r) => {
33
- expect(r.start.get("year")).toBe(1975);
34
- expect(r.start.get("month")).toBe(4);
35
- expect(r.start.get("day")).toBe(30);
36
- });
37
-
38
- testSingleCase(chrono.vi.strict, "l\u00fac 7 gi\u1edd 30 ph\u00fat", REF, (r) => {
39
- expect(r.start.get("hour")).toBe(7);
40
- expect(r.start.get("minute")).toBe(30);
41
- });
42
- });
43
-
44
- test("Test - Strict accepts slash dates", () => {
45
- testSingleCase(chrono.vi.strict, "30/4/1975", REF, (r) => {
46
- expect(r.start.get("day")).toBe(30);
47
- expect(r.start.get("month")).toBe(4);
48
- expect(r.start.get("year")).toBe(1975);
49
- });
50
-
51
- testSingleCase(chrono.vi.strict, "15/3", REF, (r) => {
52
- expect(r.start.get("day")).toBe(15);
53
- expect(r.start.get("month")).toBe(3);
54
- });
55
- });
56
-
57
- test("Test - Strict accepts explicit time unit expressions", () => {
58
- testSingleCase(chrono.vi.strict, "3 ng\u00e0y tr\u01b0\u1edbc", REF, (r) => {
59
- expect(r.start.get("day")).toBe(7);
60
- expect(r.start.get("month")).toBe(8);
61
- });
62
-
63
- testSingleCase(chrono.vi.strict, "2 tu\u1ea7n sau", REF, (r) => {
64
- expect(r.start.get("day")).toBe(24);
65
- expect(r.start.get("month")).toBe(8);
66
- });
67
- });
@@ -1,99 +0,0 @@
1
- import * as chrono from "../../src/";
2
- import { testSingleCase } from "../test_util";
3
-
4
- const REF = new Date(2012, 7, 10, 12);
5
-
6
- test("Test - X gi\u1edd", () => {
7
- testSingleCase(chrono.vi, "Cu\u1ed9c h\u1ecdn l\u00fac 7 gi\u1edd.", REF, (r) => {
8
- expect(r.index).toBe(9);
9
- expect(r.text).toBe("l\u00fac 7 gi\u1edd");
10
- expect(r.start.get("hour")).toBe(7);
11
- expect(r.start.get("minute")).toBe(0);
12
- });
13
-
14
- testSingleCase(chrono.vi, "7 gi\u1edd s\u00e1ng", REF, (r) => {
15
- expect(r.start.get("hour")).toBe(7);
16
- expect(r.start.get("meridiem")).toBe(0); // AM
17
- });
18
-
19
- testSingleCase(chrono.vi, "7 gi\u1edd t\u1ed1i", REF, (r) => {
20
- expect(r.start.get("hour")).toBe(19);
21
- });
22
- });
23
-
24
- test("Test - X gi\u1edd Y ph\u00fat", () => {
25
- testSingleCase(chrono.vi, "l\u00fac 7 gi\u1edd 30 ph\u00fat", REF, (r) => {
26
- expect(r.start.get("hour")).toBe(7);
27
- expect(r.start.get("minute")).toBe(30);
28
- });
29
-
30
- testSingleCase(chrono.vi, "v\u00e0o 15 gi\u1edd 45 ph\u00fat", REF, (r) => {
31
- expect(r.start.get("hour")).toBe(15);
32
- expect(r.start.get("minute")).toBe(45);
33
- });
34
- });
35
-
36
- test("Test - colon format HH:MM", () => {
37
- testSingleCase(chrono.vi, "H\u1ecdn l\u00fac 15:30.", REF, (r) => {
38
- expect(r.start.get("hour")).toBe(15);
39
- expect(r.start.get("minute")).toBe(30);
40
- });
41
- });
42
-
43
- test("Test - date + time combined", () => {
44
- testSingleCase(chrono.vi, "ng\u00e0y 30 th\u00e1ng 4 n\u0103m 1975 l\u00fac 11 gi\u1edd", REF, (r) => {
45
- expect(r.start.get("day")).toBe(30);
46
- expect(r.start.get("month")).toBe(4);
47
- expect(r.start.get("year")).toBe(1975);
48
- expect(r.start.get("hour")).toBe(11);
49
- });
50
- });
51
-
52
- test("Test - meridiem: s\u00e1ng/chi\u1ec1u/t\u1ed1i/\u0111\u00eam", () => {
53
- testSingleCase(chrono.vi, "9 gi\u1edd s\u00e1ng", REF, (r) => {
54
- expect(r.start.get("hour")).toBe(9);
55
- expect(r.start.get("meridiem")).toBe(0); // AM
56
- });
57
- testSingleCase(chrono.vi, "3 gi\u1edd chi\u1ec1u", REF, (r) => {
58
- expect(r.start.get("hour")).toBe(15);
59
- });
60
- testSingleCase(chrono.vi, "10 gi\u1edd \u0111\u00eam", REF, (r) => {
61
- expect(r.start.get("hour")).toBe(22);
62
- });
63
- });
64
-
65
- test("Test - trưa meridiem: X giờ trưa → PM (hour + 12)", () => {
66
- // trưa = noon/midday — times expressed with trưa are PM
67
- testSingleCase(chrono.vi, "1 giờ trưa", REF, (r) => {
68
- expect(r.start.get("hour")).toBe(13);
69
- expect(r.start.get("meridiem")).toBe(1); // PM
70
- });
71
- testSingleCase(chrono.vi, "11 giờ trưa", REF, (r) => {
72
- expect(r.start.get("hour")).toBe(11);
73
- expect(r.start.get("meridiem")).toBe(0); // AM — 11 giờ trưa = approaching noon
74
- });
75
- // 12 giờ trưa = noon, no offset applied (12 < 12 is false)
76
- testSingleCase(chrono.vi, "12 giờ trưa", REF, (r) => {
77
- expect(r.start.get("hour")).toBe(12);
78
- expect(r.start.get("meridiem")).toBe(1); // PM
79
- });
80
- });
81
-
82
- test("Test - 12 giờ sáng = midnight (00:00)", () => {
83
- testSingleCase(chrono.vi, "12 giờ sáng", REF, (r) => {
84
- expect(r.start.get("hour")).toBe(0);
85
- expect(r.start.get("meridiem")).toBe(0); // AM
86
- });
87
- });
88
-
89
- test("Test - isCertain: hour and meridiem certainty", () => {
90
- testSingleCase(chrono.vi, "lúc 7 giờ", REF, (r) => {
91
- expect(r.start.isCertain("hour")).toBe(true);
92
- expect(r.start.isCertain("meridiem")).toBe(false);
93
- });
94
-
95
- testSingleCase(chrono.vi, "7 giờ sáng", REF, (r) => {
96
- expect(r.start.isCertain("hour")).toBe(true);
97
- expect(r.start.isCertain("meridiem")).toBe(true);
98
- });
99
- });