@ohos-ports/flowbite-datepicker 2.0.0-beta.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.
- package/.eslintignore +2 -0
- package/.eslintrc.js +73 -0
- package/.stylelintrc +12 -0
- package/CHANGELOG.md +72 -0
- package/LICENSE +21 -0
- package/README.md +71 -0
- package/demo/index.html +582 -0
- package/demo/live-demo.js +471 -0
- package/dist/DateRangePicker.cjs.js +2996 -0
- package/dist/DateRangePicker.esm.js +2994 -0
- package/dist/DateRangePicker.umd.js +3002 -0
- package/dist/Datepicker.cjs.js +2778 -0
- package/dist/Datepicker.esm.js +2776 -0
- package/dist/Datepicker.umd.js +2784 -0
- package/dist/css/datepicker-bs4.css +276 -0
- package/dist/css/datepicker-bs4.min.css +1 -0
- package/dist/css/datepicker-bs5.css +276 -0
- package/dist/css/datepicker-bs5.min.css +1 -0
- package/dist/css/datepicker-bulma.css +258 -0
- package/dist/css/datepicker-bulma.min.css +1 -0
- package/dist/css/datepicker-foundation.css +262 -0
- package/dist/css/datepicker-foundation.min.css +1 -0
- package/dist/css/datepicker.css +306 -0
- package/dist/css/datepicker.min.css +1403 -0
- package/dist/js/datepicker-full.js +2777 -0
- package/dist/js/datepicker-full.min.js +1 -0
- package/dist/js/datepicker.js +2569 -0
- package/dist/js/datepicker.min.js +1 -0
- package/dist/js/locales/ar-tn.js +15 -0
- package/dist/js/locales/ar.js +15 -0
- package/dist/js/locales/az.js +14 -0
- package/dist/js/locales/bg.js +14 -0
- package/dist/js/locales/bm.js +18 -0
- package/dist/js/locales/bn.js +19 -0
- package/dist/js/locales/br.js +18 -0
- package/dist/js/locales/bs.js +15 -0
- package/dist/js/locales/ca.js +18 -0
- package/dist/js/locales/cs.js +19 -0
- package/dist/js/locales/cy.js +14 -0
- package/dist/js/locales/da.js +19 -0
- package/dist/js/locales/de.js +18 -0
- package/dist/js/locales/el.js +16 -0
- package/dist/js/locales/en-AU.js +18 -0
- package/dist/js/locales/en-CA.js +18 -0
- package/dist/js/locales/en-GB.js +18 -0
- package/dist/js/locales/en-IE.js +17 -0
- package/dist/js/locales/en-NZ.js +17 -0
- package/dist/js/locales/en-ZA.js +17 -0
- package/dist/js/locales/eo.js +17 -0
- package/dist/js/locales/es.js +18 -0
- package/dist/js/locales/et.js +18 -0
- package/dist/js/locales/eu.js +18 -0
- package/dist/js/locales/fa.js +17 -0
- package/dist/js/locales/fi.js +17 -0
- package/dist/js/locales/fo.js +15 -0
- package/dist/js/locales/fr-CH.js +21 -0
- package/dist/js/locales/fr.js +18 -0
- package/dist/js/locales/gl.js +16 -0
- package/dist/js/locales/he.js +15 -0
- package/dist/js/locales/hi.js +18 -0
- package/dist/js/locales/hr.js +13 -0
- package/dist/js/locales/hu.js +18 -0
- package/dist/js/locales/hy.js +18 -0
- package/dist/js/locales/id.js +15 -0
- package/dist/js/locales/is.js +14 -0
- package/dist/js/locales/it-CH.js +20 -0
- package/dist/js/locales/it.js +18 -0
- package/dist/js/locales/ja.js +17 -0
- package/dist/js/locales/ka.js +17 -0
- package/dist/js/locales/kk.js +15 -0
- package/dist/js/locales/km.js +15 -0
- package/dist/js/locales/ko.js +18 -0
- package/dist/js/locales/lt.js +19 -0
- package/dist/js/locales/lv.js +18 -0
- package/dist/js/locales/me.js +17 -0
- package/dist/js/locales/mk.js +15 -0
- package/dist/js/locales/mn.js +17 -0
- package/dist/js/locales/mr.js +18 -0
- package/dist/js/locales/ms.js +15 -0
- package/dist/js/locales/nl-BE.js +18 -0
- package/dist/js/locales/nl.js +18 -0
- package/dist/js/locales/no.js +18 -0
- package/dist/js/locales/oc.js +17 -0
- package/dist/js/locales/pl.js +17 -0
- package/dist/js/locales/pt-BR.js +17 -0
- package/dist/js/locales/pt.js +18 -0
- package/dist/js/locales/ro.js +17 -0
- package/dist/js/locales/ru.js +18 -0
- package/dist/js/locales/si.js +18 -0
- package/dist/js/locales/sk.js +18 -0
- package/dist/js/locales/sl.js +15 -0
- package/dist/js/locales/sq.js +18 -0
- package/dist/js/locales/sr-latn.js +16 -0
- package/dist/js/locales/sr.js +16 -0
- package/dist/js/locales/sv.js +17 -0
- package/dist/js/locales/sw.js +15 -0
- package/dist/js/locales/ta.js +18 -0
- package/dist/js/locales/tg.js +19 -0
- package/dist/js/locales/th.js +14 -0
- package/dist/js/locales/tk.js +18 -0
- package/dist/js/locales/tr.js +17 -0
- package/dist/js/locales/uk.js +17 -0
- package/dist/js/locales/uz-cyrl.js +18 -0
- package/dist/js/locales/uz-latn.js +18 -0
- package/dist/js/locales/vi.js +16 -0
- package/dist/js/locales/zh-CN.js +19 -0
- package/dist/js/locales/zh-TW.js +18 -0
- package/dist/locales/index.cjs.js +1028 -0
- package/dist/locales/index.esm.js +1028 -0
- package/dist/main.cjs.js +2999 -0
- package/dist/main.esm.js +2994 -0
- package/dist/main.umd.js +3005 -0
- package/docs/.nojekyll +0 -0
- package/docs/README.md +266 -0
- package/docs/_sidebar.md +6 -0
- package/docs/api.md +284 -0
- package/docs/date-string+format.md +90 -0
- package/docs/i18n.md +99 -0
- package/docs/images/datepicker-inline.jpg +0 -0
- package/docs/images/datepicker.jpg +0 -0
- package/docs/images/multidate.jpg +0 -0
- package/docs/images/picker-structure.jpg +0 -0
- package/docs/images/rangepicker.jpg +0 -0
- package/docs/images/view-days.jpg +0 -0
- package/docs/images/view-decades.jpg +0 -0
- package/docs/images/view-months.jpg +0 -0
- package/docs/images/view-years.jpg +0 -0
- package/docs/index.html +26 -0
- package/docs/options.md +354 -0
- package/docs/overview.md +174 -0
- package/extras/twoDigitToFullYear/test/twoDigitToFullYear.js +58 -0
- package/extras/twoDigitToFullYear/twoDigitToFullYear.js +26 -0
- package/js/DateRangePicker.js +210 -0
- package/js/Datepicker.js +487 -0
- package/js/datepicker-full.js +5 -0
- package/js/events/functions.js +48 -0
- package/js/events/inputFieldListeners.js +206 -0
- package/js/events/otherListeners.js +15 -0
- package/js/events/pickerListeners.js +70 -0
- package/js/i18n/base-locales.js +13 -0
- package/js/i18n/locales/ar-tn.js +15 -0
- package/js/i18n/locales/ar.js +15 -0
- package/js/i18n/locales/az.js +14 -0
- package/js/i18n/locales/bg.js +14 -0
- package/js/i18n/locales/bm.js +18 -0
- package/js/i18n/locales/bn.js +19 -0
- package/js/i18n/locales/br.js +18 -0
- package/js/i18n/locales/bs.js +15 -0
- package/js/i18n/locales/ca.js +18 -0
- package/js/i18n/locales/cs.js +19 -0
- package/js/i18n/locales/cy.js +14 -0
- package/js/i18n/locales/da.js +19 -0
- package/js/i18n/locales/de.js +18 -0
- package/js/i18n/locales/el.js +16 -0
- package/js/i18n/locales/en-AU.js +18 -0
- package/js/i18n/locales/en-CA.js +18 -0
- package/js/i18n/locales/en-GB.js +18 -0
- package/js/i18n/locales/en-IE.js +17 -0
- package/js/i18n/locales/en-NZ.js +17 -0
- package/js/i18n/locales/en-ZA.js +17 -0
- package/js/i18n/locales/eo.js +17 -0
- package/js/i18n/locales/es.js +18 -0
- package/js/i18n/locales/et.js +18 -0
- package/js/i18n/locales/eu.js +18 -0
- package/js/i18n/locales/fa.js +17 -0
- package/js/i18n/locales/fi.js +17 -0
- package/js/i18n/locales/fo.js +15 -0
- package/js/i18n/locales/fr-CH.js +21 -0
- package/js/i18n/locales/fr.js +18 -0
- package/js/i18n/locales/gl.js +16 -0
- package/js/i18n/locales/he.js +15 -0
- package/js/i18n/locales/hi.js +18 -0
- package/js/i18n/locales/hr.js +13 -0
- package/js/i18n/locales/hu.js +18 -0
- package/js/i18n/locales/hy.js +18 -0
- package/js/i18n/locales/id.js +15 -0
- package/js/i18n/locales/is.js +14 -0
- package/js/i18n/locales/it-CH.js +20 -0
- package/js/i18n/locales/it.js +18 -0
- package/js/i18n/locales/ja.js +17 -0
- package/js/i18n/locales/ka.js +17 -0
- package/js/i18n/locales/kk.js +15 -0
- package/js/i18n/locales/km.js +15 -0
- package/js/i18n/locales/ko.js +18 -0
- package/js/i18n/locales/lt.js +19 -0
- package/js/i18n/locales/lv.js +18 -0
- package/js/i18n/locales/me.js +17 -0
- package/js/i18n/locales/mk.js +15 -0
- package/js/i18n/locales/mn.js +17 -0
- package/js/i18n/locales/mr.js +18 -0
- package/js/i18n/locales/ms.js +15 -0
- package/js/i18n/locales/nl-BE.js +18 -0
- package/js/i18n/locales/nl.js +18 -0
- package/js/i18n/locales/no.js +18 -0
- package/js/i18n/locales/oc.js +17 -0
- package/js/i18n/locales/pl.js +17 -0
- package/js/i18n/locales/pt-BR.js +17 -0
- package/js/i18n/locales/pt.js +18 -0
- package/js/i18n/locales/ro.js +17 -0
- package/js/i18n/locales/ru.js +18 -0
- package/js/i18n/locales/si.js +18 -0
- package/js/i18n/locales/sk.js +18 -0
- package/js/i18n/locales/sl.js +15 -0
- package/js/i18n/locales/sq.js +18 -0
- package/js/i18n/locales/sr-latn.js +16 -0
- package/js/i18n/locales/sr.js +16 -0
- package/js/i18n/locales/sv.js +17 -0
- package/js/i18n/locales/sw.js +15 -0
- package/js/i18n/locales/ta.js +18 -0
- package/js/i18n/locales/tg.js +19 -0
- package/js/i18n/locales/th.js +14 -0
- package/js/i18n/locales/tk.js +18 -0
- package/js/i18n/locales/tr.js +17 -0
- package/js/i18n/locales/uk.js +17 -0
- package/js/i18n/locales/uz-cyrl.js +18 -0
- package/js/i18n/locales/uz-latn.js +18 -0
- package/js/i18n/locales/vi.js +16 -0
- package/js/i18n/locales/zh-CN.js +19 -0
- package/js/i18n/locales/zh-TW.js +18 -0
- package/js/lib/date-format.js +185 -0
- package/js/lib/date.js +82 -0
- package/js/lib/dom.js +55 -0
- package/js/lib/event.js +68 -0
- package/js/lib/utils.js +61 -0
- package/js/main.js +4 -0
- package/js/options/defaultOptions.js +38 -0
- package/js/options/processOptions.js +263 -0
- package/js/picker/Picker.js +334 -0
- package/js/picker/templates/calendarWeeksTemplate.js +8 -0
- package/js/picker/templates/daysTemplate.js +8 -0
- package/js/picker/templates/pickerTemplate.js +23 -0
- package/js/picker/views/DaysView.js +250 -0
- package/js/picker/views/MonthsView.js +198 -0
- package/js/picker/views/View.js +55 -0
- package/js/picker/views/YearsView.js +170 -0
- package/package.json +81 -0
- package/postcss.config.js +5 -0
- package/rollup.config.js +75 -0
- package/sass/_mixins.scss +12 -0
- package/sass/datepicker-bs4.scss +91 -0
- package/sass/datepicker-bs5.scss +91 -0
- package/sass/datepicker-bulma.scss +69 -0
- package/sass/datepicker-foundation.scss +66 -0
- package/sass/datepicker.scss +436 -0
- package/sass/index-bs4.scss +5 -0
- package/sass/index-bs5.scss +5 -0
- package/sass/index-bulma.scss +6 -0
- package/sass/index-foundation.scss +3 -0
- package/scripts/build-css.js +39 -0
- package/scripts/build-locales.js +57 -0
- package/scripts/convert-bsdp-locales.js +65 -0
- package/scripts/minify-css.js +31 -0
- package/scripts/minify-js.js +17 -0
- package/style.css +10 -0
- package/tailwind.config.js +16 -0
- package/tailwind.css +1389 -0
- package/test/DateRangePicker/DateRangePicker.js +547 -0
- package/test/DateRangePicker/api-methods.js +415 -0
- package/test/DateRangePicker/date-selection.js +472 -0
- package/test/DateRangePicker/options.js +308 -0
- package/test/Datepicker/Datepicker-object.js +236 -0
- package/test/Datepicker/api-methods.js +328 -0
- package/test/_utils/date.js +102 -0
- package/test/_utils/dom.js +70 -0
- package/test/events.js +785 -0
- package/test/inline-mode.js +45 -0
- package/test/keyboard-operation/arrow-down.js +293 -0
- package/test/keyboard-operation/arrow-left.js +255 -0
- package/test/keyboard-operation/arrow-right.js +215 -0
- package/test/keyboard-operation/arrow-up.js +461 -0
- package/test/keyboard-operation/edit-mode.js +458 -0
- package/test/keyboard-operation/keyboard-operation.js +146 -0
- package/test/mouse-operation.js +580 -0
- package/test/options/before-show.js +635 -0
- package/test/options/bulma-datepicker.sublime-workspace +1280 -0
- package/test/options/buttons.js +383 -0
- package/test/options/date-restrictions.js +802 -0
- package/test/options/format.js +281 -0
- package/test/options/multidate.js +380 -0
- package/test/options/options.js +727 -0
- package/test/options/orientation.js +410 -0
- package/test/options/pick-levle+view.js +357 -0
- package/test/test.html +94 -0
- package/test/unit/DateRangePicker.js +192 -0
- package/test/unit/Datepicker.js +307 -0
- package/test/unit/_setup.js +28 -0
- package/test/unit/lib/date-format.js +310 -0
- package/test/unit/lib/date.js +211 -0
- package/test/unit/lib/dom.js +142 -0
- package/test/unit/lib/event.js +207 -0
- package/test/unit/lib/utils.js +135 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import './_setup.js';
|
|
2
|
+
import Datepicker from '../../js/Datepicker.js';
|
|
3
|
+
import defaultOptions from '../../js/options/defaultOptions.js';
|
|
4
|
+
import {locales} from '../../js/i18n/base-locales.js';
|
|
5
|
+
import {dateValue, today} from '../../js/lib/date.js';
|
|
6
|
+
|
|
7
|
+
const esLocale = {
|
|
8
|
+
months: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
|
|
9
|
+
monthsShort: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"],
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
describe('Datepicker', function () {
|
|
13
|
+
it('has locales attribute with "en" locale', function () {
|
|
14
|
+
expect(Datepicker.locales, 'to be an object');
|
|
15
|
+
expect(Datepicker.locales.en, 'to equal', locales.en);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
describe('constructor', function () {
|
|
19
|
+
let input;
|
|
20
|
+
|
|
21
|
+
beforeEach(function () {
|
|
22
|
+
input = document.createElement('input');
|
|
23
|
+
testContainer.appendChild(input);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
after(function () {
|
|
27
|
+
document.querySelectorAll('.datepicker').forEach((el) => {
|
|
28
|
+
el.parentElement.removeChild(el);
|
|
29
|
+
});
|
|
30
|
+
delete input.datepicker;
|
|
31
|
+
testContainer.removeChild(input);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('attachs the created instance to the bound element', function () {
|
|
35
|
+
const dp = new Datepicker(input);
|
|
36
|
+
expect(input.datepicker, 'to be', dp);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('adds datepicker-input class to the bound element', function () {
|
|
40
|
+
new Datepicker(input);
|
|
41
|
+
expect(input.classList.contains('datepicker-input'), 'to be true');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('configures the instance with the default options', function () {
|
|
45
|
+
const dp = new Datepicker(input);
|
|
46
|
+
// config items should be options + container, locale, multidate and weekEnd
|
|
47
|
+
const numOfOptions = Object.keys(defaultOptions).length;
|
|
48
|
+
expect(Object.keys(dp.config), 'to have length', numOfOptions + 5);
|
|
49
|
+
|
|
50
|
+
expect(dp.config.autohide, 'to be false');
|
|
51
|
+
expect(dp.config.beforeShowDay, 'to be null');
|
|
52
|
+
expect(dp.config.beforeShowDecade, 'to be null');
|
|
53
|
+
expect(dp.config.beforeShowMonth, 'to be null');
|
|
54
|
+
expect(dp.config.beforeShowYear, 'to be null');
|
|
55
|
+
expect(dp.config.buttonClass, 'to be', 'button');
|
|
56
|
+
expect(dp.config.calendarWeeks, 'to be false');
|
|
57
|
+
expect(dp.config.clearBtn, 'to be false');
|
|
58
|
+
expect(dp.config.container, 'to be', document.body);
|
|
59
|
+
expect(dp.config.dateDelimiter, 'to be', ',');
|
|
60
|
+
expect(dp.config.datesDisabled, 'to equal', []);
|
|
61
|
+
expect(dp.config.daysOfWeekDisabled, 'to equal', []);
|
|
62
|
+
expect(dp.config.daysOfWeekHighlighted, 'to equal', []);
|
|
63
|
+
expect(dp.config.defaultViewDate, 'to be', today());
|
|
64
|
+
expect(dp.config.disableTouchKeyboard, 'to be false');
|
|
65
|
+
expect(dp.config.format, 'to be', 'mm/dd/yyyy');
|
|
66
|
+
expect(dp.config.language, 'to be', 'en');
|
|
67
|
+
expect(dp.config.locale, 'to equal', Object.assign({
|
|
68
|
+
format: defaultOptions.format,
|
|
69
|
+
weekStart: defaultOptions.weekStart,
|
|
70
|
+
}, locales.en));
|
|
71
|
+
expect(dp.config.maxDate, 'to be undefined');
|
|
72
|
+
expect(dp.config.maxNumberOfDates, 'to be', 1);
|
|
73
|
+
expect(dp.config.maxView, 'to be', 3);
|
|
74
|
+
expect(dp.config.minDate, 'to be', dateValue(0, 0, 1));
|
|
75
|
+
expect(dp.config.multidate, 'to be false');
|
|
76
|
+
//
|
|
77
|
+
expect(dp.config.nextArrow, 'to be a', NodeList);
|
|
78
|
+
expect(dp.config.nextArrow.length, 'to be', 1);
|
|
79
|
+
expect(dp.config.nextArrow[0].wholeText, 'to be', '»');
|
|
80
|
+
//
|
|
81
|
+
expect(dp.config.orientation, 'to equal', {x: 'auto', y: 'auto'});
|
|
82
|
+
expect(dp.config.pickLevel, 'to be', 0);
|
|
83
|
+
//
|
|
84
|
+
expect(dp.config.prevArrow, 'to be a', NodeList);
|
|
85
|
+
expect(dp.config.prevArrow.length, 'to be', 1);
|
|
86
|
+
expect(dp.config.prevArrow[0].wholeText, 'to be', '«');
|
|
87
|
+
//
|
|
88
|
+
expect(dp.config.showDaysOfWeek, 'to be true');
|
|
89
|
+
expect(dp.config.showOnFocus, 'to be true');
|
|
90
|
+
expect(dp.config.startView, 'to be', 0);
|
|
91
|
+
expect(dp.config.title, 'to be', '');
|
|
92
|
+
expect(dp.config.todayBtn, 'to be false');
|
|
93
|
+
expect(dp.config.todayHighlight, 'to be false');
|
|
94
|
+
expect(dp.config.updateOnBlur, 'to be true');
|
|
95
|
+
expect(dp.config.weekStart, 'to be', 0);
|
|
96
|
+
expect(dp.config.weekEnd, 'to be', 6);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('append datepicker element to the container)', function () {
|
|
100
|
+
new Datepicker(input);
|
|
101
|
+
|
|
102
|
+
const dpElem = Array.from(document.body.children).find(el => el.matches('.datepicker'));
|
|
103
|
+
expect(dpElem, 'not to be undefined');
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('does not add the active class to the picker element', function () {
|
|
107
|
+
new Datepicker(input);
|
|
108
|
+
|
|
109
|
+
const dpElem = document.querySelector('.datepicker');
|
|
110
|
+
expect(dpElem.classList.contains('active'), 'to be false');
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('sets rangepicker properties if DateRangePicker to link is passed', function () {
|
|
114
|
+
const fakeRangepicker = {
|
|
115
|
+
inputs: [input],
|
|
116
|
+
datepickers: [],
|
|
117
|
+
};
|
|
118
|
+
const dp = new Datepicker(input, {}, fakeRangepicker);
|
|
119
|
+
|
|
120
|
+
expect(dp.rangepicker, 'to be', fakeRangepicker);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('adds itself to rangepicker.datepickers if DateRangePicker to link is passed', function () {
|
|
124
|
+
let fakeRangepicker = {
|
|
125
|
+
inputs: [input],
|
|
126
|
+
datepickers: [],
|
|
127
|
+
};
|
|
128
|
+
let dp = new Datepicker(input, {}, fakeRangepicker);
|
|
129
|
+
|
|
130
|
+
expect(fakeRangepicker.datepickers[0], 'to be', dp);
|
|
131
|
+
|
|
132
|
+
fakeRangepicker = {
|
|
133
|
+
inputs: [undefined, input],
|
|
134
|
+
datepickers: [],
|
|
135
|
+
};
|
|
136
|
+
dp = new Datepicker(input, {}, fakeRangepicker);
|
|
137
|
+
|
|
138
|
+
expect(fakeRangepicker.datepickers[1], 'to be', dp);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it('throws an error if invalid rangepicker is passed', function () {
|
|
142
|
+
const testFn = rangepicker => new Datepicker(input, {}, rangepicker);
|
|
143
|
+
const errMsg = 'Invalid rangepicker object.';
|
|
144
|
+
|
|
145
|
+
let fakeRangepicker = {
|
|
146
|
+
inputs: [],
|
|
147
|
+
datepickers: [],
|
|
148
|
+
};
|
|
149
|
+
expect(() => testFn(fakeRangepicker), 'to throw', errMsg);
|
|
150
|
+
|
|
151
|
+
fakeRangepicker = {
|
|
152
|
+
inputs: ['foo', 'bar', input],
|
|
153
|
+
datepickers: [],
|
|
154
|
+
};
|
|
155
|
+
expect(() => testFn(fakeRangepicker), 'to throw', errMsg);
|
|
156
|
+
|
|
157
|
+
fakeRangepicker = {
|
|
158
|
+
inputs: [input],
|
|
159
|
+
};
|
|
160
|
+
expect(() => testFn(fakeRangepicker), 'to throw', errMsg);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
describe('destroy()', function () {
|
|
165
|
+
let input;
|
|
166
|
+
let dp;
|
|
167
|
+
let spyHide;
|
|
168
|
+
let returnVal;
|
|
169
|
+
|
|
170
|
+
before(function () {
|
|
171
|
+
input = document.createElement('input');
|
|
172
|
+
testContainer.appendChild(input);
|
|
173
|
+
dp = new Datepicker(input);
|
|
174
|
+
spyHide = sinon.spy(dp, 'hide');
|
|
175
|
+
|
|
176
|
+
returnVal = dp.destroy();
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
after(function () {
|
|
180
|
+
spyHide.restore();
|
|
181
|
+
document.querySelectorAll('.datepicker').forEach((el) => {
|
|
182
|
+
el.parentElement.removeChild(el);
|
|
183
|
+
});
|
|
184
|
+
delete input.datepicker;
|
|
185
|
+
testContainer.removeChild(input);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('calls hide()', function () {
|
|
189
|
+
expect(spyHide.called, 'to be true');
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it('removes datepicker element from its container', function () {
|
|
193
|
+
expect(document.body.querySelectorAll('.datepicker').length, 'to be', 0);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it('removes the instance from the bound element', function () {
|
|
197
|
+
expect(Object.prototype.hasOwnProperty.call(input, 'datepicker'), 'to be false');
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it('removes datepicker-input class from the bound element', function () {
|
|
201
|
+
expect(input.classList.contains('datepicker-input'), 'to be false');
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it('returns the instance', function () {
|
|
205
|
+
expect(returnVal, 'to be', dp);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
describe('show()', function () {
|
|
210
|
+
let input;
|
|
211
|
+
let dp;
|
|
212
|
+
let dpElem;
|
|
213
|
+
|
|
214
|
+
before(function () {
|
|
215
|
+
input = document.createElement('input');
|
|
216
|
+
testContainer.appendChild(input);
|
|
217
|
+
dp = new Datepicker(input);
|
|
218
|
+
dpElem = document.querySelector('.datepicker');
|
|
219
|
+
dp.show();
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
after(function () {
|
|
223
|
+
dp.destroy();
|
|
224
|
+
testContainer.removeChild(input);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it('adds the "active" class to the datepicker element', function () {
|
|
228
|
+
expect(dpElem.classList.contains('active'), 'to be true');
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
it('sets true to the picker.active property', function () {
|
|
232
|
+
expect(dp.picker.active, 'to be true');
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
describe('hide()', function () {
|
|
237
|
+
let input;
|
|
238
|
+
let dp;
|
|
239
|
+
let dpElem;
|
|
240
|
+
|
|
241
|
+
before(function () {
|
|
242
|
+
input = document.createElement('input');
|
|
243
|
+
testContainer.appendChild(input);
|
|
244
|
+
dp = new Datepicker(input);
|
|
245
|
+
dpElem = document.querySelector('.datepicker');
|
|
246
|
+
dp.picker.active = true;
|
|
247
|
+
dpElem.classList.add('active', 'block');
|
|
248
|
+
|
|
249
|
+
dp.hide();
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
after(function () {
|
|
253
|
+
dp.destroy();
|
|
254
|
+
testContainer.removeChild(input);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
it('removes the "active" class from the datepicker element', function () {
|
|
258
|
+
expect(dpElem.classList.contains('active'), 'to be false');
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
it('deletes the "picker.active" property', function () {
|
|
262
|
+
expect(dp.picker, 'to have property', 'active');
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
describe('static formatDate()', function () {
|
|
267
|
+
it('formats a date or time value', function () {
|
|
268
|
+
Datepicker.locales.es = esLocale;
|
|
269
|
+
|
|
270
|
+
let date = new Date(2020, 0, 4);
|
|
271
|
+
expect(Datepicker.formatDate(date, 'y-m-d'), 'to be', '2020-1-4');
|
|
272
|
+
expect(Datepicker.formatDate(date.getTime(), 'dd M yy'), 'to be', '04 Jan 20');
|
|
273
|
+
expect(Datepicker.formatDate(date, 'dd M yy', 'es'), 'to be', '04 Ene 20');
|
|
274
|
+
expect(Datepicker.formatDate(date.getTime(), 'MM d, y', 'es'), 'to be', 'Enero 4, 2020');
|
|
275
|
+
|
|
276
|
+
delete Datepicker.locales.es;
|
|
277
|
+
|
|
278
|
+
// fallback to en
|
|
279
|
+
expect(Datepicker.formatDate(date, 'dd M yy', 'es'), 'to be', '04 Jan 20');
|
|
280
|
+
expect(Datepicker.formatDate(date.getTime(), 'MM d, y', 'es'), 'to be', 'January 4, 2020');
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
describe('static parseDate()', function () {
|
|
285
|
+
it('parses a date string and returnes the time value of the date', function () {
|
|
286
|
+
Datepicker.locales.es = esLocale;
|
|
287
|
+
|
|
288
|
+
let timeValue = new Date(2020, 0, 4).getTime();
|
|
289
|
+
expect(Datepicker.parseDate('2020-1-4', 'y-m-d'), 'to be', timeValue);
|
|
290
|
+
expect(Datepicker.parseDate('04 Jan 2020', 'dd M yy'), 'to be', timeValue);
|
|
291
|
+
expect(Datepicker.parseDate('04 Ene 2020', 'dd M yy', 'es'), 'to be', timeValue);
|
|
292
|
+
expect(Datepicker.parseDate('Enero 4, 2020', 'MM d, y', 'es'), 'to be', timeValue);
|
|
293
|
+
|
|
294
|
+
expect(Datepicker.parseDate('04/20/2022', 'mm/dd/yyyy'), 'to equal', new Date(2022, 3, 20).getTime());
|
|
295
|
+
expect(Datepicker.parseDate('5/3/1994', 'd/m/y'), 'to equal', new Date(1994, 2, 5).getTime());
|
|
296
|
+
|
|
297
|
+
delete Datepicker.locales.es;
|
|
298
|
+
|
|
299
|
+
// fallback to en
|
|
300
|
+
const fallbackDate = new Date(timeValue).setMonth(new Date().getMonth());
|
|
301
|
+
expect(Datepicker.parseDate('04 Ene 2020', 'dd M yy', 'es'), 'to be', fallbackDate);
|
|
302
|
+
expect(Datepicker.parseDate('Enero 4, 2020', 'MM d, y', 'es'), 'to be', fallbackDate);
|
|
303
|
+
expect(Datepicker.parseDate('04 Jan 2020', 'dd M yy', 'es'), 'to be', timeValue);
|
|
304
|
+
expect(Datepicker.parseDate('2020-1-4', 'y-m-d', 'es'), 'to be', timeValue);
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
global.expect = require('unexpected');
|
|
2
|
+
global.sinon = require('sinon');
|
|
3
|
+
|
|
4
|
+
const jsdom = require('jsdom');
|
|
5
|
+
const {JSDOM} = jsdom;
|
|
6
|
+
const {window} = new JSDOM('<body><div id="test-container"></div></body>', {
|
|
7
|
+
pretendToBeVisual: true
|
|
8
|
+
});
|
|
9
|
+
const document = window.document;
|
|
10
|
+
|
|
11
|
+
global.JSDOM = JSDOM;
|
|
12
|
+
global.window = window;
|
|
13
|
+
global.testContainer = document.getElementById('test-container');
|
|
14
|
+
|
|
15
|
+
const exposeToGlobal = [
|
|
16
|
+
'document',
|
|
17
|
+
'CustomEvent',
|
|
18
|
+
'DocumentFragment',
|
|
19
|
+
'Event',
|
|
20
|
+
'EventTarget',
|
|
21
|
+
'NodeList',
|
|
22
|
+
'Range',
|
|
23
|
+
];
|
|
24
|
+
exposeToGlobal.forEach((prop) => {
|
|
25
|
+
global[prop] = window[prop];
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
global.simulant = require('simulant');
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import '../_setup.js';
|
|
2
|
+
import {parseDate, formatDate} from '../../../js/lib/date-format.js';
|
|
3
|
+
|
|
4
|
+
describe('lib/date', function () {
|
|
5
|
+
const locales = {
|
|
6
|
+
en: {
|
|
7
|
+
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
|
|
8
|
+
daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
|
|
9
|
+
daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
|
|
10
|
+
months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
|
|
11
|
+
monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
|
|
12
|
+
today: "Today",
|
|
13
|
+
clear: "Clear",
|
|
14
|
+
titleFormat: "MM yyyy"
|
|
15
|
+
},
|
|
16
|
+
de: {
|
|
17
|
+
days: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"],
|
|
18
|
+
daysShort: ["Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam"],
|
|
19
|
+
months: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"],
|
|
20
|
+
monthsShort: ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"],
|
|
21
|
+
},
|
|
22
|
+
es: {
|
|
23
|
+
days: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"],
|
|
24
|
+
daysShort: ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"],
|
|
25
|
+
months: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
|
|
26
|
+
monthsShort: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"],
|
|
27
|
+
},
|
|
28
|
+
fr: {
|
|
29
|
+
days: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"],
|
|
30
|
+
daysShort: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."],
|
|
31
|
+
daysMin: ["d", "l", "ma", "me", "j", "v", "s"],
|
|
32
|
+
months: ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"],
|
|
33
|
+
monthsShort: ["janv.", "févr.", "mars", "avril", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."],
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
describe('parseDate()', function () {
|
|
38
|
+
const today = new Date().setHours(0, 0, 0, 0);
|
|
39
|
+
const thisYear = new Date().getFullYear();
|
|
40
|
+
|
|
41
|
+
it('return undefined if the given date is falsy value other than 0 or invalid date', function () {
|
|
42
|
+
expect(parseDate(), 'to be undefined');
|
|
43
|
+
expect(parseDate(''), 'to be undefined');
|
|
44
|
+
expect(parseDate(new Date('')), 'to be undefined');
|
|
45
|
+
expect(parseDate(0), 'not to be undefined');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('returns time value of the same day\'s 00:00:00 local time if the given date is a Date object or time value', function () {
|
|
49
|
+
const origDate = new Date().setHours(0, 0, 0, 0);
|
|
50
|
+
|
|
51
|
+
expect(parseDate(new Date()), 'to be', origDate);
|
|
52
|
+
expect(parseDate(Date.now()), 'to be', origDate);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('invokes custom parse fucntion and returns the result if it\'s given to format.toValue', function () {
|
|
56
|
+
const date = new Date();
|
|
57
|
+
const format = {toValue: sinon.stub()};
|
|
58
|
+
format.toValue.returns(date);
|
|
59
|
+
|
|
60
|
+
expect(parseDate('2020-01-01', format, locales.en), 'to be', date.setHours(0, 0, 0, 0));
|
|
61
|
+
expect(format.toValue.calledWith('2020-01-01', format, locales.en), 'to be true');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('returns the date that the word means if given date is "today"', function () {
|
|
65
|
+
expect(parseDate('today'), 'to be', today);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('uses format: "d" or "dd" as day of month to parse date string', function () {
|
|
69
|
+
expect(parseDate('2012-03-5', 'yyyy-mm-d'), 'to be', new Date(2012, 2, 5).getTime());
|
|
70
|
+
expect(parseDate('2012-03-15', 'yyyy-mm-d'), 'to be', new Date(2012, 2, 15).getTime());
|
|
71
|
+
expect(parseDate('2012-03-05', 'yyyy-mm-d'), 'to be', new Date(2012, 2, 5).getTime());
|
|
72
|
+
|
|
73
|
+
expect(parseDate('2012-03-5', 'yyyy-mm-dd'), 'to be', new Date(2012, 2, 5).getTime());
|
|
74
|
+
expect(parseDate('2012-03-15', 'yyyy-mm-dd'), 'to be', new Date(2012, 2, 15).getTime());
|
|
75
|
+
expect(parseDate('2012-03-05', 'yyyy-mm-dd'), 'to be', new Date(2012, 2, 5).getTime());
|
|
76
|
+
|
|
77
|
+
expect(parseDate('5/03/2012', 'dd/mm/yyyy'), 'to be', new Date(2012, 2, 5).getTime());
|
|
78
|
+
expect(parseDate('15/03/2012', 'd/mm/yyyy'), 'to be', new Date(2012, 2, 15).getTime());
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it('accepts 0 and number larger than the end of the month for "d", "dd"', function () {
|
|
82
|
+
expect(parseDate('2012-03-0', 'yyyy-mm-d'), 'to be', new Date(2012, 1, 29).getTime());
|
|
83
|
+
expect(parseDate('2012-03-33', 'yyyy-mm-d'), 'to be', new Date(2012, 3, 2).getTime());
|
|
84
|
+
expect(parseDate('2013-02-60', 'yyyy-mm-d'), 'to be', new Date(2013, 3, 1).getTime());
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('uses format: "m", "mm", "M" or "MM" as month to parse date string', function () {
|
|
88
|
+
const fakeToday = new Date(thisYear, 2, 31);
|
|
89
|
+
const clock = sinon.useFakeTimers({now: fakeToday});
|
|
90
|
+
|
|
91
|
+
// month number
|
|
92
|
+
expect(parseDate('2012-3-5', 'yyyy-m-d'), 'to be', new Date(2012, 2, 5).getTime());
|
|
93
|
+
expect(parseDate('2012-12-15', 'yyyy-m-d'), 'to be', new Date(2012, 11, 15).getTime());
|
|
94
|
+
expect(parseDate('2012-03-05', 'yyyy-m-d'), 'to be', new Date(2012, 2, 5).getTime());
|
|
95
|
+
|
|
96
|
+
expect(parseDate('2012-3-5', 'yyyy-mm-dd'), 'to be', new Date(2012, 2, 5).getTime());
|
|
97
|
+
expect(parseDate('2012-12-15', 'yyyy-mm-dd'), 'to be', new Date(2012, 11, 15).getTime());
|
|
98
|
+
expect(parseDate('2012-03-05', 'yyyy-mm-dd'), 'to be', new Date(2012, 2, 5).getTime());
|
|
99
|
+
|
|
100
|
+
expect(parseDate('5/3/2012', 'dd/mm/yyyy'), 'to be', new Date(2012, 2, 5).getTime());
|
|
101
|
+
expect(parseDate('15/12/2012', 'd/m/yyyy'), 'to be', new Date(2012, 11, 15).getTime());
|
|
102
|
+
|
|
103
|
+
// ensure setting a month w/ < 31days on the 31 of a month works correctly
|
|
104
|
+
expect(parseDate('2012-02-28', 'yyyy-mm-dd'), 'to be', new Date(2012, 1, 28).getTime());
|
|
105
|
+
expect(parseDate('2012-09-15', 'yyyy-mm-dd'), 'to be', new Date(2012, 8, 15).getTime());
|
|
106
|
+
|
|
107
|
+
// month name
|
|
108
|
+
expect(parseDate('Mar 5, 2012', 'M d, yyyy', locales.en), 'to be', new Date(2012, 2, 5).getTime());
|
|
109
|
+
expect(parseDate('Dec 15, 2012', 'M d, yyyy', locales.en), 'to be', new Date(2012, 11, 15).getTime());
|
|
110
|
+
|
|
111
|
+
expect(parseDate('Mär 5, 2012', 'M d, yyyy', locales.de), 'to be', new Date(2012, 2, 5).getTime());
|
|
112
|
+
expect(parseDate('Dez 15, 2012', 'M d, yyyy', locales.de), 'to be', new Date(2012, 11, 15).getTime());
|
|
113
|
+
|
|
114
|
+
expect(parseDate('mars 5, 2012', 'M d, yyyy', locales.fr), 'to be', new Date(2012, 2, 5).getTime());
|
|
115
|
+
expect(parseDate('déc. 15, 2012', 'M d, yyyy', locales.fr), 'to be', new Date(2012, 11, 15).getTime());
|
|
116
|
+
|
|
117
|
+
expect(parseDate('March 5, 2012', 'MM d, yyyy', locales.en), 'to be', new Date(2012, 2, 5).getTime());
|
|
118
|
+
expect(parseDate('December 15, 2012', 'MM d, yyyy', locales.en), 'to be', new Date(2012, 11, 15).getTime());
|
|
119
|
+
|
|
120
|
+
expect(parseDate('März 5, 2012', 'MM d, yyyy', locales.de), 'to be', new Date(2012, 2, 5).getTime());
|
|
121
|
+
expect(parseDate('Dezember 15, 2012', 'MM d, yyyy', locales.de), 'to be', new Date(2012, 11, 15).getTime());
|
|
122
|
+
|
|
123
|
+
expect(parseDate('mars 5, 2012', 'MM d, yyyy', locales.fr), 'to be', new Date(2012, 2, 5).getTime());
|
|
124
|
+
expect(parseDate('décembre 15, 2012', 'MM d, yyyy', locales.fr), 'to be', new Date(2012, 11, 15).getTime());
|
|
125
|
+
|
|
126
|
+
// month number for "M" and "MM"
|
|
127
|
+
expect(parseDate('3/5/2012', 'M/dd/yyyy', locales.en), 'to be', new Date(2012, 2, 5).getTime());
|
|
128
|
+
expect(parseDate('12/15/2012', 'MM/dd/yyyy', locales.en), 'to be', new Date(2012, 11, 15).getTime());
|
|
129
|
+
|
|
130
|
+
// month name for "m" and "mm"
|
|
131
|
+
expect(parseDate('Mar/5/2012', 'm/d/yyyy', locales.en), 'to be', new Date(2012, 2, 5).getTime());
|
|
132
|
+
expect(parseDate('December/15/2012', 'mm/dd/yyyy', locales.en), 'to be', new Date(2012, 11, 15).getTime());
|
|
133
|
+
|
|
134
|
+
clock.restore();
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it('accepts 0 and number larger than 12 for "m", "mm"', function () {
|
|
138
|
+
const fakeToday = new Date(thisYear, 2, 31);
|
|
139
|
+
const clock = sinon.useFakeTimers({now: fakeToday});
|
|
140
|
+
|
|
141
|
+
expect(parseDate('2012-0-05', 'yyyy-m-dd'), 'to be', new Date(2011, 11, 5).getTime());
|
|
142
|
+
expect(parseDate('2012-16-30', 'yyyy-m-d'), 'to be', new Date(2013, 3, 30).getTime());
|
|
143
|
+
expect(parseDate('2012-32-30', 'yyyy-m-d'), 'to be', new Date(2014, 7, 30).getTime());
|
|
144
|
+
|
|
145
|
+
clock.restore();
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it('evaluates month name with case-insensible begin-with match', function () {
|
|
149
|
+
const fakeToday = new Date(thisYear, 2, 31);
|
|
150
|
+
const clock = sinon.useFakeTimers({now: fakeToday});
|
|
151
|
+
|
|
152
|
+
expect(parseDate('march 5, 2012', 'M d, yyyy', locales.en), 'to be', new Date(2012, 2, 5).getTime());
|
|
153
|
+
expect(parseDate('DEC 15, 2012', 'MM d, yyyy', locales.en), 'to be', new Date(2012, 11, 15).getTime());
|
|
154
|
+
|
|
155
|
+
expect(parseDate('MA 5, 2012', 'MM d, yyyy', locales.en), 'to be', new Date(2012, 2, 5).getTime());
|
|
156
|
+
expect(parseDate('j 5, 2012', 'MM d, yyyy', locales.en), 'to be', new Date(2012, 0, 5).getTime());
|
|
157
|
+
expect(parseDate('ju 5, 2012', 'MM d, yyyy', locales.en), 'to be', new Date(2012, 5, 5).getTime());
|
|
158
|
+
|
|
159
|
+
expect(parseDate('march/5/2012', 'm/d/yyyy', locales.en), 'to be', new Date(2012, 2, 5).getTime());
|
|
160
|
+
expect(parseDate('DEC/15/2012', 'mm/dd/yyyy', locales.en), 'to be', new Date(2012, 11, 15).getTime());
|
|
161
|
+
|
|
162
|
+
expect(parseDate('MA/05/2012', 'mm/dd/yyyy', locales.en), 'to be', new Date(2012, 2, 5).getTime());
|
|
163
|
+
expect(parseDate('j/05/2012', 'mm/dd/yyyy', locales.en), 'to be', new Date(2012, 0, 5).getTime());
|
|
164
|
+
expect(parseDate('ju/05/2012', 'mm/dd/yyyy', locales.en), 'to be', new Date(2012, 5, 5).getTime());
|
|
165
|
+
|
|
166
|
+
clock.restore();
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('uses format: "y", "yy" or "yyyy" as year to parse date string', function () {
|
|
170
|
+
expect(parseDate('2012-3-5', 'y-m-d'), 'to be', new Date(2012, 2, 5).getTime());
|
|
171
|
+
expect(parseDate('1984-3-15', 'y-m-d'), 'to be', new Date(1984, 2, 15).getTime());
|
|
172
|
+
expect(parseDate('12-03-05', 'y-m-d'), 'to be', new Date(0, 2, 5).setFullYear(12));
|
|
173
|
+
|
|
174
|
+
expect(parseDate('2012-3-5', 'yy-m-d'), 'to be', new Date(2012, 2, 5).getTime());
|
|
175
|
+
expect(parseDate('1984-3-15', 'yy-m-d'), 'to be', new Date(1984, 2, 15).getTime());
|
|
176
|
+
expect(parseDate('12-03-05', 'yy-m-d'), 'to be', new Date(0, 2, 5).setFullYear(12));
|
|
177
|
+
|
|
178
|
+
expect(parseDate('2012-03-5', 'yyyy-mm-dd'), 'to be', new Date(2012, 2, 5).getTime());
|
|
179
|
+
expect(parseDate('1984-03-15', 'yyyy-mm-dd'), 'to be', new Date(1984, 2, 15).getTime());
|
|
180
|
+
expect(parseDate('12-03-05', 'yyyy-mm-dd'), 'to be', new Date(0, 2, 5).setFullYear(12));
|
|
181
|
+
|
|
182
|
+
expect(parseDate('5/03/2012', 'dd/mm/yyyy'), 'to be', new Date(2012, 2, 5).getTime());
|
|
183
|
+
expect(parseDate('15/03/1984', 'd/m/yy'), 'to be', new Date(1984, 2, 15).getTime());
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it('ignores "D" and "DD" (day of week)', function () {
|
|
187
|
+
let date = parseDate('2012-03-05', 'yyyy-mm-dd-D');
|
|
188
|
+
expect(date, 'to be', new Date(2012, 2, 5).getTime());
|
|
189
|
+
|
|
190
|
+
date = parseDate('Sat, Dec 15, 2012', 'DD, M dd, yyyy', locales.en);
|
|
191
|
+
expect(date, 'to be', new Date(2012, 11, 15).getTime());
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
it('uses current date\'s year/month/day to complement undefined, missing or unparsable parts', function () {
|
|
195
|
+
const fakeToday = new Date(thisYear, 2, 31);
|
|
196
|
+
const clock = sinon.useFakeTimers({now: fakeToday});
|
|
197
|
+
|
|
198
|
+
expect(parseDate('03-05', 'mm-dd'), 'to be', new Date(thisYear, 2, 5).getTime());
|
|
199
|
+
expect(parseDate('2012-06', 'yyyy-mm'), 'to be', new Date(2012, 5, 30).getTime());
|
|
200
|
+
expect(parseDate('5, 2012', 'd, yyyy'), 'to be', new Date(2012, 2, 5).getTime());
|
|
201
|
+
expect(parseDate('Mai/10', 'M/d', locales.en), 'to be', new Date(thisYear, 2, 10).getTime());
|
|
202
|
+
expect(parseDate('Maya/10', 'M/d', locales.en), 'to be', new Date(thisYear, 2, 10).getTime());
|
|
203
|
+
|
|
204
|
+
expect(parseDate('03-05', 'yyyy-mm-dd'), 'to be', new Date(0, 4, 31).setFullYear(3));
|
|
205
|
+
expect(parseDate('Sun, 23', 'DD, mm-dd'), 'to be', new Date(thisYear + 1, 10, 30).getTime());
|
|
206
|
+
|
|
207
|
+
expect(parseDate('Mar/05/12', 'yyyy/mm/dd', locales.en), 'to be', new Date(thisYear, 4, 12).getTime());
|
|
208
|
+
expect(parseDate('05/Mar/12', 'yyyy/mm/dd', locales.en), 'to be', new Date(0, 2, 12).setFullYear(5));
|
|
209
|
+
expect(parseDate('2012年十二月十五日', 'yyyy年mm月dd日', locales.en), 'to be', new Date(2012, 2, 31).getTime());
|
|
210
|
+
|
|
211
|
+
clock.restore();
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it('throws an Error if format is neither a valid format string nor an object w/ toValue property', function () {
|
|
215
|
+
expect(() => parseDate('01-01-01', {}), 'to throw error');
|
|
216
|
+
expect(() => parseDate('01-01-01', 1), 'to throw error');
|
|
217
|
+
expect(() => parseDate('01-01-01', 'aa-bb-cc'), 'to throw error');
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
describe('formatDate()', function () {
|
|
222
|
+
it('return empty string if the given date is falsy value other than 0 or invalid date', function () {
|
|
223
|
+
expect(formatDate(), 'to be', '');
|
|
224
|
+
expect(formatDate(''), 'to be', '');
|
|
225
|
+
expect(formatDate(new Date('')), 'to be', '');
|
|
226
|
+
expect(formatDate(0, 'yyyy', locales.en), 'not to be', '');
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it('invokes custom format fucntion and returns the result if it\'s given to format.toDisplay', function () {
|
|
230
|
+
const date = new Date(2012, 2, 5);
|
|
231
|
+
const format = {toDisplay: sinon.stub()};
|
|
232
|
+
format.toDisplay.returns('foo-bar');
|
|
233
|
+
|
|
234
|
+
expect(formatDate(date, format, locales.en), 'to be', 'foo-bar');
|
|
235
|
+
expect(format.toDisplay.calledWith(date, format, locales.en), 'to be true');
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
it('uses format: "d" as day of month, no leading zero to format date', function () {
|
|
239
|
+
expect(formatDate(new Date(2012, 2, 5), 'yyyy-mm-d', locales.en), 'to be', '2012-03-5');
|
|
240
|
+
expect(formatDate(0, 'd', locales.en), 'to be', String(new Date(0).getDate()));
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
it('uses format: "dd" as day of month, leading zero to format date', function () {
|
|
244
|
+
const date = new Date(2012, 2, 5);
|
|
245
|
+
expect(formatDate(date, 'yyyy-mm-dd', locales.en), 'to be', '2012-03-05');
|
|
246
|
+
expect(formatDate(date.getTime(), 'yyyy-mm-dd', locales.en), 'to be', '2012-03-05');
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it('uses format: "D" as short day of week in given language to format date', function () {
|
|
250
|
+
const date = new Date(2012, 2, 5);
|
|
251
|
+
expect(formatDate(date, 'yyyy-mm-dd-D', locales.en), 'to be', '2012-03-05-Mon');
|
|
252
|
+
expect(formatDate(date, 'yyyy-mm-dd-D', locales.es), 'to be', '2012-03-05-Lun');
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
it('uses format: "DD" as long day of week in given language to format date', function () {
|
|
256
|
+
const date = new Date(2012, 2, 5);
|
|
257
|
+
expect(formatDate(date, 'yyyy-mm-dd-DD', locales.en), 'to be', '2012-03-05-Monday');
|
|
258
|
+
expect(formatDate(date, 'yyyy-mm-dd-DD', locales.es), 'to be', '2012-03-05-Lunes');
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
it('uses format: "m" as Month, no leading zero. to format date', function () {
|
|
262
|
+
expect(formatDate(new Date(2012, 2, 5), 'yyyy-m-dd', locales.en), 'to be', '2012-3-05');
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
it('uses format: "mm" as Month, leading zero. to format date', function () {
|
|
266
|
+
expect(formatDate(new Date(2012, 2, 5), 'yyyy-mm-dd', locales.en), 'to be', '2012-03-05');
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
it('uses format: "M" as month shortname in given language to format date', function () {
|
|
270
|
+
const date = new Date(2012, 2, 5);
|
|
271
|
+
expect(formatDate(date, 'yyyy-M-dd', locales.en), 'to be', '2012-Mar-05');
|
|
272
|
+
expect(formatDate(date, 'yyyy-M-dd', locales.de), 'to be', '2012-Mär-05');
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
it('uses format: "MM" as month full name in given language to format date', function () {
|
|
276
|
+
const date = new Date(2012, 2, 5);
|
|
277
|
+
expect(formatDate(date, 'yyyy-MM-dd', locales.en), 'to be', '2012-March-05');
|
|
278
|
+
expect(formatDate(date, 'yyyy-MM-dd', locales.de), 'to be', '2012-März-05');
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
it('uses format: "y" as Year, no leading zero. to format date', function () {
|
|
282
|
+
expect(formatDate(new Date(0, 2, 5).setFullYear(2), 'y-m-d', locales.en), 'to be', '2-3-5');
|
|
283
|
+
expect(formatDate(new Date(0, 2, 5).setFullYear(12), 'y-m-d', locales.en), 'to be', '12-3-5');
|
|
284
|
+
expect(formatDate(new Date(2012, 2, 5), 'y-m-d', locales.en), 'to be', '2012-3-5');
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
it('uses format: "yy" as Year, two-digit. to format date', function () {
|
|
288
|
+
expect(formatDate(new Date(0, 2, 5).setFullYear(2), 'yy-mm-dd', locales.en), 'to be', '02-03-05');
|
|
289
|
+
expect(formatDate(new Date(0, 2, 5).setFullYear(12), 'yy-mm-dd', locales.en), 'to be', '12-03-05');
|
|
290
|
+
expect(formatDate(new Date(2012, 2, 5), 'yy-mm-dd', locales.en), 'to be', '12-03-05');
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
it('uses format: "yyyy" as Year, four-digit. to format date', function () {
|
|
294
|
+
expect(formatDate(new Date(0, 2, 5).setFullYear(2), 'yyyy-mm-dd', locales.en), 'to be', '0002-03-05');
|
|
295
|
+
expect(formatDate(new Date(0, 2, 5).setFullYear(12), 'yyyy-mm-dd', locales.en), 'to be', '0012-03-05');
|
|
296
|
+
expect(formatDate(new Date(2012, 2, 5), 'yyyy-mm-dd', locales.en), 'to be', '2012-03-05');
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
it('accepts separators come before and after the date numbers', function () {
|
|
300
|
+
expect(formatDate(new Date(2012, 2, 5), '西暦yyyy年mm月dd日', locales.en), 'to be', '西暦2012年03月05日');
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it('throws an Error if format is neither a valid format string nor an object w/ toValue property', function () {
|
|
304
|
+
const date = new Date(2012, 2, 5);
|
|
305
|
+
expect(() => formatDate(date, {}), 'to throw error');
|
|
306
|
+
expect(() => formatDate(date, 1), 'to throw error');
|
|
307
|
+
expect(() => formatDate(date, 'aa-bb-cc'), 'to throw error');
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
});
|