Index: third_party/pkg/angular/test/directive/ng_model_datelike_spec.dart |
diff --git a/third_party/pkg/angular/test/directive/ng_model_datelike_spec.dart b/third_party/pkg/angular/test/directive/ng_model_datelike_spec.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d690b0e58372b92624c69a6ea2367c5075a6b4ed |
--- /dev/null |
+++ b/third_party/pkg/angular/test/directive/ng_model_datelike_spec.dart |
@@ -0,0 +1,489 @@ |
+library ng_model_date_like_spec; |
+ |
+import '../_specs.dart'; |
+import 'dart:html' as dom; |
+ |
+/** |
+ * Note: some tests become noops for browsers that do not support the particular |
+ * date-like input being tested. |
+ */ |
+void main() { |
+ //---------------------------------------------------------------------------- |
+ // Test fixture |
+ TestBed _; |
+ InputElement inputElement; |
+ |
+ //---------------------------------------------------------------------------- |
+ // Utility functions |
+ |
+ /// Wrapper for [valueAsDate] IDL attribute access, necessary due to |
+ /// https://code.google.com/p/dart/issues/detail?id=17625 |
+ DateTime inputValueAsDateWrapper(InputElement inputElement) { |
+ try { |
+ return inputElement.valueAsDate; |
+ } catch (e) { |
+ return null; |
+ } |
+ } |
+ |
+ DateTime inputValueAsDate() { |
+ DateTime dt = inputValueAsDateWrapper(inputElement); |
+ return (dt != null && !dt.isUtc) ? dt.toUtc() : dt; |
+ } |
+ |
+ bool isBrowser(String pattern) => |
+ dom.window.navigator.userAgent.indexOf(pattern) > 0; |
+ |
+ /** Use this function to determine if a non type=text or type=textarea |
+ * input is supported by the browser under test. If [shouldWorkForChrome] |
+ * and then browser is Chrome, then `expect()` the input element to be supported. |
+ */ |
+ bool nonTextInputElementSupported(InputElement input, {bool |
+ shouldWorkForChrome: true}) { |
+ const testValue = '!'; // any string that is not valid for the input. |
+ String savedValue = input.value; |
+ input.value = testValue; |
+ if (input.value == testValue) { |
+ if (shouldWorkForChrome) expect(isBrowser('Chrome')).toBeFalsy(); |
+ return false; |
+ } |
+ input.value = savedValue; |
+ return true; |
+ } |
+ |
+ //---------------------------------------------------------------------------- |
+ // Tests |
+ |
+ describe('ng-model for date-like input', () { |
+ beforeEach((TestBed tb) => _ = tb); |
+ beforeEach(() => inputElement = null); |
+ |
+ describe('type=date', () { |
+ final DateTime dateTime = new DateTime.utc(2014, 3, 29); |
+ final String dtAsString = "2014-03-29"; |
+ |
+ it('should update input value from DateTime model property', () { |
+ _.compile('<input type=date ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toBeNull(); |
+ _.rootScope.context['model'] = dateTime; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toEqual(dateTime); |
+ }); |
+ |
+ it('should update input value from String model property', () { |
+ _.compile('<input type=date ng-bind-type=string ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ // if(!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.apply(); |
+ expect(inputElement.value).toEqual(''); |
+ _.rootScope.context['model'] = dtAsString; |
+ _.rootScope.apply(); |
+ expect(inputElement.value).toEqual(dtAsString); |
+ }); |
+ |
+ it('should update model from the input "valueAsDate" IDL attribute', () { |
+ _.compile('<input type=date ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ inputElement.valueAsDate = dateTime; |
+ _.triggerEvent(inputElement, 'change'); |
+ expect(_.rootScope.context['model']).toEqual(dateTime); |
+ }); |
+ |
+ it('should update model from the input "value" IDL attribute', () { |
+ _.compile('<input type=date ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ inputElement.value = dtAsString; |
+ _.triggerEvent(inputElement, 'change'); |
+ expect(_.rootScope.context['model']).toEqual(dateTime); |
+ }); |
+ |
+ it('should clear input when model is the empty string', () { |
+ _.compile('<input type=date ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.context['model'] = dateTime; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toEqual(dateTime); |
+ |
+ _.rootScope.context['model'] = ''; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toBeNull(); |
+ expect(inputElement.value).toEqual(''); |
+ }); |
+ |
+ it('should clear valid input when model is set to null', () { |
+ _.compile('<input type=date ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.context['model'] = dateTime; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toEqual(dateTime); |
+ |
+ _.rootScope.context['model'] = null; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toBeNull(); |
+ expect(inputElement.value).toEqual(''); |
+ }); |
+ }); |
+ |
+ describe('type=time', () { |
+ final DateTime dateTime = new DateTime.utc(1970, 1, 1, 23, 45, 16); |
+ final String dtAsString = "23:45:16"; |
+ |
+ it('should update input value from DateTime model property', () { |
+ _.compile('<input type=time ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toBeNull(); |
+ _.rootScope.context['model'] = dateTime; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toEqual(dateTime); |
+ }); |
+ |
+ it('should update input value from String model property', () { |
+ _.compile('<input type=time ng-bind-type=string ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ // if(!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.apply(); |
+ expect(inputElement.value).toEqual(''); |
+ _.rootScope.context['model'] = dtAsString; |
+ _.rootScope.apply(); |
+ expect(inputElement.value).toEqual(dtAsString); |
+ }); |
+ |
+ it('should update model from the input "valueAsDate" IDL attribute', () { |
+ _.compile('<input type=time ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ inputElement.valueAsDate = dateTime; |
+ _.triggerEvent(inputElement, 'change'); |
+ expect(_.rootScope.context['model']).toEqual(dateTime); |
+ }); |
+ |
+ it('should update model from the input "value" IDL attribute', () { |
+ _.compile('<input type=time ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ inputElement.value = dtAsString; |
+ _.triggerEvent(inputElement, 'change'); |
+ expect(_.rootScope.context['model']).toEqual(dateTime); |
+ }); |
+ |
+ it('should clear input when model is the empty string', () { |
+ _.compile('<input type=time ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.context['model'] = dateTime; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toEqual(dateTime); |
+ |
+ _.rootScope.context['model'] = ''; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toBeNull(); |
+ expect(inputElement.value).toEqual(''); |
+ }); |
+ |
+ it('should clear valid input when model is set to null', () { |
+ _.compile('<input type=time ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.context['model'] = dateTime; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toEqual(dateTime); |
+ |
+ _.rootScope.context['model'] = null; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toBeNull(); |
+ expect(inputElement.value).toEqual(''); |
+ }); |
+ }); |
+ |
+ describe('type=datetime-local', () { |
+ final DateTime dt = new DateTime.utc(2014, 03, 30, 23, 45, 16); |
+ final num dateTime = dt.millisecondsSinceEpoch; |
+ final String dtAsString = "2014-03-30T23:45:16"; |
+ |
+ it('should update input value from num model', () { |
+ _.compile('<input type=datetime-local ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.apply(); |
+ expect(inputElement.valueAsNumber.isNaN).toBeTruthy(); |
+ _.rootScope.context['model'] = dateTime; |
+ _.rootScope.apply(); |
+ expect(inputElement.valueAsNumber).toEqual(dateTime); |
+ }); |
+ |
+ it('should update input value from String model property', () { |
+ _.compile( |
+ '<input type=datetime-local ng-bind-type=string ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ |
+ _.rootScope.apply(); |
+ expect(inputElement.value).toEqual(''); |
+ _.rootScope.context['model'] = dtAsString; |
+ _.rootScope.apply(); |
+ expect(inputElement.value).toEqual(dtAsString); |
+ }); |
+ |
+ it('should update model from the input "valueAsNumber" IDL attribute', () |
+ { |
+ _.compile('<input type=datetime-local ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ inputElement.valueAsNumber = dateTime; |
+ expect(inputElement.valueAsNumber).toEqual(dateTime); |
+ _.triggerEvent(inputElement, 'change'); |
+ expect(_.rootScope.context['model']).toEqual(dateTime); |
+ }); |
+ |
+ it('should update model from the input "value" IDL attribute', () { |
+ _.compile('<input type=datetime-local ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ inputElement.value = dtAsString; |
+ _.triggerEvent(inputElement, 'change'); |
+ expect(_.rootScope.context['model']).toEqual(dateTime); |
+ }); |
+ |
+ it('should clear input when model is the empty string', () { |
+ _.compile('<input type=datetime-local ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.context['model'] = dateTime; |
+ _.rootScope.apply(); |
+ expect(inputElement.valueAsNumber).toEqual(dateTime); |
+ |
+ _.rootScope.context['model'] = ''; |
+ _.rootScope.apply(); |
+ expect(inputElement.valueAsNumber.isNaN).toBeTruthy(); |
+ expect(inputElement.value).toEqual(''); |
+ }); |
+ |
+ it('should clear valid input when model is set to null', () { |
+ _.compile('<input type=datetime-local ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.context['model'] = dateTime; |
+ _.rootScope.apply(); |
+ expect(inputElement.valueAsNumber).toEqual(dateTime); |
+ |
+ _.rootScope.context['model'] = null; |
+ _.rootScope.apply(); |
+ expect(inputElement.valueAsNumber.isNaN).toBeTruthy(); |
+ expect(inputElement.value).toEqual(''); |
+ }); |
+ }); |
+ |
+ describe('type=datetime', () { |
+ /* |
+ * Note: no browser that I know of supports type=datetime other than |
+ * treating it as an ordinary type=text input. Hence, no tests |
+ * are added for type=datetime other than accessing its value as a string. |
+ */ |
+ final DateTime dateTime = new DateTime.utc(2014, 03, 30, 23, 45, 16); |
+ final String dtAsString = "2014-03-30T23:45:16"; |
+ |
+ it('should update input value from String model property', () { |
+ _.compile('<input type=datetime ng-bind-type=string ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ |
+ _.rootScope.apply(); |
+ expect(inputElement.value).toEqual(''); |
+ _.rootScope.context['model'] = dtAsString; |
+ _.rootScope.apply(); |
+ expect(inputElement.value).toEqual(dtAsString); |
+ }); |
+ |
+ it('should update model from the input "value" IDL attribute', () { |
+ _.compile('<input type=datetime ng-bind-type=string ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement, shouldWorkForChrome: |
+ false)) return; // skip test |
+ |
+ inputElement.value = dtAsString; |
+ _.triggerEvent(inputElement, 'change'); |
+ expect(_.rootScope.context['model']).toEqual(dtAsString); |
+ }); |
+ }); |
+ |
+ describe('type=month', () { |
+ final DateTime dateTime = new DateTime.utc(2014, 3); |
+ final String dtAsString = "2014-03"; |
+ |
+ it('should update input value from DateTime model property', () { |
+ _.compile('<input type=month ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toBeNull(); |
+ _.rootScope.context['model'] = dateTime; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toEqual(dateTime); |
+ }); |
+ |
+ it('should update input value from String model property', () { |
+ _.compile('<input type=month ng-bind-type=string ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ |
+ _.rootScope.apply(); |
+ expect(inputElement.value).toEqual(''); |
+ _.rootScope.context['model'] = dtAsString; |
+ _.rootScope.apply(); |
+ expect(inputElement.value).toEqual(dtAsString); |
+ }); |
+ |
+ it('should update model from the input "valueAsDate" IDL attribute', () { |
+ _.compile('<input type=month ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ inputElement.valueAsDate = dateTime; |
+ _.triggerEvent(inputElement, 'change'); |
+ expect(_.rootScope.context['model']).toEqual(dateTime); |
+ }); |
+ |
+ it('should update model from the input "value" IDL attribute', () { |
+ _.compile('<input type=month ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ inputElement.value = dtAsString; |
+ _.triggerEvent(inputElement, 'change'); |
+ expect(_.rootScope.context['model']).toEqual(dateTime); |
+ }); |
+ |
+ it('should clear input when model is the empty string', () { |
+ _.compile('<input type=month ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.context['model'] = dateTime; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toEqual(dateTime); |
+ |
+ _.rootScope.context['model'] = ''; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toBeNull(); |
+ expect(inputElement.value).toEqual(''); |
+ }); |
+ |
+ it('should clear valid input when model is set to null', () { |
+ _.compile('<input type=month ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.context['model'] = dateTime; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toEqual(dateTime); |
+ |
+ _.rootScope.context['model'] = null; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toBeNull(); |
+ expect(inputElement.value).toEqual(''); |
+ }); |
+ }); |
+ |
+ describe('type=week', () { |
+ final DateTime dateTime = new DateTime.utc(2014, 3, 31); |
+ final String dtAsString = "2014-W14"; |
+ |
+ it('should update input value from DateTime model property', () { |
+ _.compile('<input type=week ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toBeNull(); |
+ _.rootScope.context['model'] = dateTime; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toEqual(dateTime); |
+ }); |
+ |
+ it('should update input value from String model property', () { |
+ _.compile('<input type=week ng-bind-type=string ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ |
+ _.rootScope.apply(); |
+ expect(inputElement.value).toEqual(''); |
+ _.rootScope.context['model'] = dtAsString; |
+ _.rootScope.apply(); |
+ expect(inputElement.value).toEqual(dtAsString); |
+ }); |
+ |
+ it('should update model from the input "valueAsDate" IDL attribute', () { |
+ _.compile('<input type=week ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ inputElement.valueAsDate = dateTime; |
+ _.triggerEvent(inputElement, 'change'); |
+ expect(_.rootScope.context['model']).toEqual(dateTime); |
+ }); |
+ |
+ it('should update model from the input "value" IDL attribute', () { |
+ _.compile('<input type=week ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ inputElement.value = dtAsString; |
+ _.triggerEvent(inputElement, 'change'); |
+ expect(_.rootScope.context['model']).toEqual(dateTime); |
+ }); |
+ |
+ it('should clear input when model is the empty string', () { |
+ _.compile('<input type=week ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.context['model'] = dateTime; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toEqual(dateTime); |
+ |
+ _.rootScope.context['model'] = ''; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toBeNull(); |
+ expect(inputElement.value).toEqual(''); |
+ }); |
+ |
+ it('should clear valid input when model is set to null', () { |
+ _.compile('<input type=week ng-model=model>'); |
+ inputElement = _.rootElement as dom.InputElement; |
+ if (!nonTextInputElementSupported(inputElement)) return; // skip test |
+ |
+ _.rootScope.context['model'] = dateTime; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toEqual(dateTime); |
+ |
+ _.rootScope.context['model'] = null; |
+ _.rootScope.apply(); |
+ expect(inputValueAsDate()).toBeNull(); |
+ expect(inputElement.value).toEqual(''); |
+ }); |
+ }); |
+ }); |
+} |