2010-12-13 Dai Mikurube <dmikurube@google.com>
[WebKit.git] / LayoutTests / fast / forms / script-tests / ValidityState-rangeUnderflow.js
1 description('This test aims to check for rangeUnderflow flag with input fields');
2
3 var input = document.createElement('input');
4
5 function checkUnderflow(value, min, disabled)
6 {
7     input.value = value;
8     input.min = min;
9     input.disabled = !!disabled;
10     var underflow = input.validity.rangeUnderflow;
11     var resultText = 'The value "' + input.value + '" ' +
12         (underflow ? 'undeflows' : 'doesn\'t underflow') +
13         ' the minimum value "' + input.min + '"' + (disabled ? ' when disabled.' : '.');
14     if (underflow)
15         testPassed(resultText);
16     else
17         testFailed(resultText);
18 }
19
20 function checkNotUnderflow(value, min, disabled)
21 {
22     input.value = value;
23     input.min = min;
24     input.disabled = !!disabled;
25     var underflow = input.validity.rangeUnderflow;
26     var resultText = 'The value "' + input.value + '" ' +
27         (underflow ? 'underflows' : 'doesn\'t underflow') +
28         ' the minimum value "' + input.min + '"' + (disabled ? ' when disabled.' : '.');
29     if (underflow)
30         testFailed(resultText);
31     else
32         testPassed(resultText);
33 }
34
35 // ----------------------------------------------------------------
36 debug('Type=text');
37 input.type = 'text';  // No underflow for type=text.
38 checkNotUnderflow('99', '100');
39
40 // ----------------------------------------------------------------
41 debug('');
42 debug('Type=date');
43 input.type = 'date';
44 input.max = '';
45 // No underflow cases
46 checkNotUnderflow('2010-01-27', null);
47 checkNotUnderflow('2010-01-27', '');
48 checkNotUnderflow('2010-01-27', 'foo');
49 // 1000-01-01 is smaller than the implicit minimum value.
50 // But the date parser rejects it before comparing the minimum value.
51 checkNotUnderflow('1000-01-01', '');
52 checkNotUnderflow('1582-10-15', '');
53 checkNotUnderflow('2010-01-27', '2010-01-26');
54 checkNotUnderflow('2010-01-27', '2009-01-28');
55 checkNotUnderflow('foo', '2011-01-26');
56
57 // Underflow cases
58 checkUnderflow('2010-01-27', '2010-01-28');
59 checkUnderflow('9999-01-01', '10000-12-31');
60 input.max = '2010-01-01';  // value < min && value > max
61 checkUnderflow('2010-01-27', '2010-02-01');
62
63 // Disabled
64 checkNotUnderflow('9999-01-01', '10000-12-31', true);
65
66 // ----------------------------------------------------------------
67 debug('');
68 debug('Type=datetime');
69 input.type = 'datetime';
70 input.max = '';
71 // No underflow cases
72 checkNotUnderflow('2010-01-27T12:34Z', null);
73 checkNotUnderflow('2010-01-27T12:34Z', '');
74 checkNotUnderflow('2010-01-27T12:34Z', 'foo');
75 // 1000-01-01 is smaller than the implicit minimum value.
76 // But the date parser rejects it before comparing the minimum value.
77 checkNotUnderflow('1000-01-01T12:34Z', '');
78 checkNotUnderflow('1582-10-15T00:00Z', '');
79 checkNotUnderflow('2010-01-27T12:34Z', '2010-01-26T00:00Z');
80 checkNotUnderflow('2010-01-27T12:34Z', '2009-01-28T00:00Z');
81 checkNotUnderflow('foo', '2011-01-26T00:00Z');
82
83 // Underflow cases
84 checkUnderflow('2010-01-27T12:34Z', '2010-01-27T13:00Z');
85 checkUnderflow('9999-01-01T12:00Z', '10000-12-31T12:00Z');
86 input.max = '2010-01-01T12:00Z';  // value < min && value > max
87 checkUnderflow('2010-01-27T12:00Z', '2010-02-01T12:00Z');
88
89 // Disabled
90 checkNotUnderflow('9999-01-01T12:00Z', '10000-12-31T12:00Z', true);
91
92 // ----------------------------------------------------------------
93 debug('');
94 debug('Type=datetime-local');
95 input.type = 'datetime-local';
96 input.max = '';
97 // No underflow cases
98 checkNotUnderflow('2010-01-27T12:34', null);
99 checkNotUnderflow('2010-01-27T12:34', '');
100 checkNotUnderflow('2010-01-27T12:34', 'foo');
101 // 1000-01-01 is smaller than the implicit minimum value.
102 // But the date parser rejects it before comparing the minimum value.
103 checkNotUnderflow('1000-01-01T12:34', '');
104 checkNotUnderflow('1582-10-15T00:00', '');
105 checkNotUnderflow('2010-01-27T12:34', '2010-01-26T00:00');
106 checkNotUnderflow('2010-01-27T12:34', '2009-01-28T00:00');
107 checkNotUnderflow('foo', '2011-01-26T00:00');
108
109 // Underflow cases
110 checkUnderflow('2010-01-27T12:34', '2010-01-27T13:00');
111 checkUnderflow('9999-01-01T12:00', '10000-12-31T12:00');
112 input.max = '2010-01-01T12:00';  // value < min && value > max
113 checkUnderflow('2010-01-27T12:00', '2010-02-01T12:00');
114
115 // Disabled
116 checkNotUnderflow('9999-01-01T12:00', '10000-12-31T12:00', true);
117
118 // ----------------------------------------------------------------
119 debug('');
120 debug('Type=month');
121 input.type = 'month';
122 input.max = '';
123 // No underflow cases
124 checkNotUnderflow('2010-01', null);
125 checkNotUnderflow('2010-01', '');
126 checkNotUnderflow('2010-01', 'foo');
127 // 1000-01 is smaller than the implicit minimum value.
128 // But the month parser rejects it before comparing the minimum value.
129 checkNotUnderflow('1000-01', '');
130 checkNotUnderflow('1582-10', '');
131 checkNotUnderflow('2010-01', '2009-12');
132 checkNotUnderflow('2010-01', '2009-01');
133 checkNotUnderflow('foo', '2011-01');
134
135 // Underflow cases
136 checkUnderflow('2010-01', '2010-02');
137 checkUnderflow('9999-01', '10000-12');
138 input.max = '2009-12';  // value < min && value > max
139 checkUnderflow('2010-01', '2010-02');
140
141 // Disabled
142 checkNotUnderflow('9999-01', '10000-12', true);
143
144 // ----------------------------------------------------------------
145 debug('');
146 debug('Type=number');
147 input.type = 'number';
148 input.max = '';
149 // No underflow cases
150 input.type = 'number';
151 checkNotUnderflow('101', '100');  // Very normal case.
152 checkNotUnderflow('-99', '-100');
153 checkNotUnderflow('101', '1E+2');
154 checkNotUnderflow('1.01', '1.00');
155 checkNotUnderflow('abc', '100');  // Invalid value.
156 checkNotUnderflow('', '1');  // No value.
157 checkNotUnderflow('-1', '');  // No min.
158 checkNotUnderflow('-1', 'xxx');  // Invalid min.
159 // The following case should be rangeUnderflow==true ideally.  But the "double" type doesn't have enough precision.
160 checkNotUnderflow('0.999999999999999999999999999999999999999998', '0.999999999999999999999999999999999999999999');
161
162 // Underflow cases
163 checkUnderflow('99', '100');
164 checkUnderflow('-101', '-100');
165 checkUnderflow('99', '1E+2');
166 input.max = '100';  // value < min && value > max
167 checkUnderflow('101', '200');
168
169 // Disabled
170 checkNotUnderflow('99', '1E+2', true);
171
172 // ----------------------------------------------------------------
173 debug('');
174 debug('Type=time');
175 input.type = 'time';
176 input.max = '';
177 // No underflow cases
178 checkNotUnderflow('13:16', null);
179 checkNotUnderflow('13:16', '');
180 checkNotUnderflow('13:16', 'foo');
181 checkNotUnderflow('00:00:00.000', '');
182 checkNotUnderflow('23:59:59.999', '');
183 checkNotUnderflow('13:16', '11:00');
184 checkNotUnderflow('13:16', '13:16');
185 checkNotUnderflow('foo', '11:00');
186
187 // Underflow cases
188 checkUnderflow('13:16', '13:17');
189 checkUnderflow('23:59', '23:59:30');
190 input.max = '11:00';  // value < min && value > max
191 checkUnderflow('13:16', '14:00');
192
193 // Disabled
194 checkNotUnderflow('23:59', '23:59:30', true);
195
196 // ----------------------------------------------------------------
197 debug('');
198 debug('Type=week');
199 input.type = 'week';
200 input.max = '';
201 // No underflow cases
202 checkNotUnderflow('2010-W01', null);
203 checkNotUnderflow('2010-W01', '');
204 checkNotUnderflow('2010-W01', 'foo');
205 // 1000-W01 is smaller than the implicit minimum value.
206 // But the month parser rejects it before comparing the minimum value.
207 checkNotUnderflow('1000-W01', '');
208 checkNotUnderflow('1583-W01', '');
209 checkNotUnderflow('2010-W01', '2009-W51');
210 checkNotUnderflow('2010-W01', '2009-W01');
211 checkNotUnderflow('foo', '2011-W01');
212
213 // Underflow cases
214 checkUnderflow('2010-W01', '2010-W02');
215 checkUnderflow('9999-W01', '10000-W12');
216 input.max = '2009-W52';  // value < min && value > max
217 checkUnderflow('2010-W01', '2010-W02');
218
219 // Disabled
220 checkNotUnderflow('9999-W01', '10000-W12', true);
221
222 var successfullyParsed = true;