[WebIDL] Assigning a value outside the float range to a 'float' attribute should...
[WebKit-https.git] / JSTests / exceptionFuzz / date-format-xparb.js
1 try {
2 (function() {
3
4 /*
5  * Copyright (C) 2004 Baron Schwartz <baron at sequent dot org>
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU Lesser General Public License as published by the
9  * Free Software Foundation, version 2.1.
10  *
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13  * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
14  * details.
15  */
16
17 Date.parseFunctions = {count:0};
18 Date.parseRegexes = [];
19 Date.formatFunctions = {count:0};
20
21 Date.prototype.dateFormat = function(format) {
22     if (Date.formatFunctions[format] == null) {
23         Date.createNewFormat(format);
24     }
25     var func = Date.formatFunctions[format];
26     return this[func]();
27 }
28
29 Date.createNewFormat = function(format) {
30     var funcName = "format" + Date.formatFunctions.count++;
31     Date.formatFunctions[format] = funcName;
32     var code = "Date.prototype." + funcName + " = function(){return ";
33     var special = false;
34     var ch = '';
35     for (var i = 0; i < format.length; ++i) {
36         ch = format.charAt(i);
37         if (!special && ch == "\\") {
38             special = true;
39         }
40         else if (special) {
41             special = false;
42             code += "'" + String.escape(ch) + "' + ";
43         }
44         else {
45             code += Date.getFormatCode(ch);
46         }
47     }
48     eval(code.substring(0, code.length - 3) + ";}");
49 }
50
51 Date.getFormatCode = function(character) {
52     switch (character) {
53     case "d":
54         return "String.leftPad(this.getDate(), 2, '0') + ";
55     case "D":
56         return "Date.dayNames[this.getDay()].substring(0, 3) + ";
57     case "j":
58         return "this.getDate() + ";
59     case "l":
60         return "Date.dayNames[this.getDay()] + ";
61     case "S":
62         return "this.getSuffix() + ";
63     case "w":
64         return "this.getDay() + ";
65     case "z":
66         return "this.getDayOfYear() + ";
67     case "W":
68         return "this.getWeekOfYear() + ";
69     case "F":
70         return "Date.monthNames[this.getMonth()] + ";
71     case "m":
72         return "String.leftPad(this.getMonth() + 1, 2, '0') + ";
73     case "M":
74         return "Date.monthNames[this.getMonth()].substring(0, 3) + ";
75     case "n":
76         return "(this.getMonth() + 1) + ";
77     case "t":
78         return "this.getDaysInMonth() + ";
79     case "L":
80         return "(this.isLeapYear() ? 1 : 0) + ";
81     case "Y":
82         return "this.getFullYear() + ";
83     case "y":
84         return "('' + this.getFullYear()).substring(2, 4) + ";
85     case "a":
86         return "(this.getHours() < 12 ? 'am' : 'pm') + ";
87     case "A":
88         return "(this.getHours() < 12 ? 'AM' : 'PM') + ";
89     case "g":
90         return "((this.getHours() %12) ? this.getHours() % 12 : 12) + ";
91     case "G":
92         return "this.getHours() + ";
93     case "h":
94         return "String.leftPad((this.getHours() %12) ? this.getHours() % 12 : 12, 2, '0') + ";
95     case "H":
96         return "String.leftPad(this.getHours(), 2, '0') + ";
97     case "i":
98         return "String.leftPad(this.getMinutes(), 2, '0') + ";
99     case "s":
100         return "String.leftPad(this.getSeconds(), 2, '0') + ";
101     case "O":
102         return "this.getGMTOffset() + ";
103     case "T":
104         return "this.getTimezone() + ";
105     case "Z":
106         return "(this.getTimezoneOffset() * -60) + ";
107     default:
108         return "'" + String.escape(character) + "' + ";
109     }
110 }
111
112 Date.parseDate = function(input, format) {
113     if (Date.parseFunctions[format] == null) {
114         Date.createParser(format);
115     }
116     var func = Date.parseFunctions[format];
117     return Date[func](input);
118 }
119
120 Date.createParser = function(format) {
121     var funcName = "parse" + Date.parseFunctions.count++;
122     var regexNum = Date.parseRegexes.length;
123     var currentGroup = 1;
124     Date.parseFunctions[format] = funcName;
125
126     var code = "Date." + funcName + " = function(input){\n"
127         + "var y = -1, m = -1, d = -1, h = -1, i = -1, s = -1;\n"
128         + "var d = new Date();\n"
129         + "y = d.getFullYear();\n"
130         + "m = d.getMonth();\n"
131         + "d = d.getDate();\n"
132         + "var results = input.match(Date.parseRegexes[" + regexNum + "]);\n"
133         + "if (results && results.length > 0) {"
134     var regex = "";
135
136     var special = false;
137     var ch = '';
138     for (var i = 0; i < format.length; ++i) {
139         ch = format.charAt(i);
140         if (!special && ch == "\\") {
141             special = true;
142         }
143         else if (special) {
144             special = false;
145             regex += String.escape(ch);
146         }
147         else {
148             obj = Date.formatCodeToRegex(ch, currentGroup);
149             currentGroup += obj.g;
150             regex += obj.s;
151             if (obj.g && obj.c) {
152                 code += obj.c;
153             }
154         }
155     }
156
157     code += "if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n"
158         + "{return new Date(y, m, d, h, i, s);}\n"
159         + "else if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n"
160         + "{return new Date(y, m, d, h, i);}\n"
161         + "else if (y > 0 && m >= 0 && d > 0 && h >= 0)\n"
162         + "{return new Date(y, m, d, h);}\n"
163         + "else if (y > 0 && m >= 0 && d > 0)\n"
164         + "{return new Date(y, m, d);}\n"
165         + "else if (y > 0 && m >= 0)\n"
166         + "{return new Date(y, m);}\n"
167         + "else if (y > 0)\n"
168         + "{return new Date(y);}\n"
169         + "}return null;}";
170
171     Date.parseRegexes[regexNum] = new RegExp("^" + regex + "$");
172     eval(code);
173 }
174
175 Date.formatCodeToRegex = function(character, currentGroup) {
176     switch (character) {
177     case "D":
178         return {g:0,
179         c:null,
180         s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"};
181     case "j":
182     case "d":
183         return {g:1,
184             c:"d = parseInt(results[" + currentGroup + "], 10);\n",
185             s:"(\\d{1,2})"};
186     case "l":
187         return {g:0,
188             c:null,
189             s:"(?:" + Date.dayNames.join("|") + ")"};
190     case "S":
191         return {g:0,
192             c:null,
193             s:"(?:st|nd|rd|th)"};
194     case "w":
195         return {g:0,
196             c:null,
197             s:"\\d"};
198     case "z":
199         return {g:0,
200             c:null,
201             s:"(?:\\d{1,3})"};
202     case "W":
203         return {g:0,
204             c:null,
205             s:"(?:\\d{2})"};
206     case "F":
207         return {g:1,
208             c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "].substring(0, 3)], 10);\n",
209             s:"(" + Date.monthNames.join("|") + ")"};
210     case "M":
211         return {g:1,
212             c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "]], 10);\n",
213             s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"};
214     case "n":
215     case "m":
216         return {g:1,
217             c:"m = parseInt(results[" + currentGroup + "], 10) - 1;\n",
218             s:"(\\d{1,2})"};
219     case "t":
220         return {g:0,
221             c:null,
222             s:"\\d{1,2}"};
223     case "L":
224         return {g:0,
225             c:null,
226             s:"(?:1|0)"};
227     case "Y":
228         return {g:1,
229             c:"y = parseInt(results[" + currentGroup + "], 10);\n",
230             s:"(\\d{4})"};
231     case "y":
232         return {g:1,
233             c:"var ty = parseInt(results[" + currentGroup + "], 10);\n"
234                 + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",
235             s:"(\\d{1,2})"};
236     case "a":
237         return {g:1,
238             c:"if (results[" + currentGroup + "] == 'am') {\n"
239                 + "if (h == 12) { h = 0; }\n"
240                 + "} else { if (h < 12) { h += 12; }}",
241             s:"(am|pm)"};
242     case "A":
243         return {g:1,
244             c:"if (results[" + currentGroup + "] == 'AM') {\n"
245                 + "if (h == 12) { h = 0; }\n"
246                 + "} else { if (h < 12) { h += 12; }}",
247             s:"(AM|PM)"};
248     case "g":
249     case "G":
250     case "h":
251     case "H":
252         return {g:1,
253             c:"h = parseInt(results[" + currentGroup + "], 10);\n",
254             s:"(\\d{1,2})"};
255     case "i":
256         return {g:1,
257             c:"i = parseInt(results[" + currentGroup + "], 10);\n",
258             s:"(\\d{2})"};
259     case "s":
260         return {g:1,
261             c:"s = parseInt(results[" + currentGroup + "], 10);\n",
262             s:"(\\d{2})"};
263     case "O":
264         return {g:0,
265             c:null,
266             s:"[+-]\\d{4}"};
267     case "T":
268         return {g:0,
269             c:null,
270             s:"[A-Z]{3}"};
271     case "Z":
272         return {g:0,
273             c:null,
274             s:"[+-]\\d{1,5}"};
275     default:
276         return {g:0,
277             c:null,
278             s:String.escape(character)};
279     }
280 }
281
282 Date.prototype.getTimezone = function() {
283     return this.toString().replace(
284         /^.*? ([A-Z]{3}) [0-9]{4}.*$/, "$1").replace(
285         /^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3");
286 }
287
288 Date.prototype.getGMTOffset = function() {
289     return (this.getTimezoneOffset() > 0 ? "-" : "+")
290         + String.leftPad(Math.floor(this.getTimezoneOffset() / 60), 2, "0")
291         + String.leftPad(this.getTimezoneOffset() % 60, 2, "0");
292 }
293
294 Date.prototype.getDayOfYear = function() {
295     var num = 0;
296     Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
297     for (var i = 0; i < this.getMonth(); ++i) {
298         num += Date.daysInMonth[i];
299     }
300     return num + this.getDate() - 1;
301 }
302
303 Date.prototype.getWeekOfYear = function() {
304     // Skip to Thursday of this week
305     var now = this.getDayOfYear() + (4 - this.getDay());
306     // Find the first Thursday of the year
307     var jan1 = new Date(this.getFullYear(), 0, 1);
308     var then = (7 - jan1.getDay() + 4);
309     document.write(then);
310     return String.leftPad(((now - then) / 7) + 1, 2, "0");
311 }
312
313 Date.prototype.isLeapYear = function() {
314     var year = this.getFullYear();
315     return ((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
316 }
317
318 Date.prototype.getFirstDayOfMonth = function() {
319     var day = (this.getDay() - (this.getDate() - 1)) % 7;
320     return (day < 0) ? (day + 7) : day;
321 }
322
323 Date.prototype.getLastDayOfMonth = function() {
324     var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7;
325     return (day < 0) ? (day + 7) : day;
326 }
327
328 Date.prototype.getDaysInMonth = function() {
329     Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
330     return Date.daysInMonth[this.getMonth()];
331 }
332
333 Date.prototype.getSuffix = function() {
334     switch (this.getDate()) {
335         case 1:
336         case 21:
337         case 31:
338             return "st";
339         case 2:
340         case 22:
341             return "nd";
342         case 3:
343         case 23:
344             return "rd";
345         default:
346             return "th";
347     }
348 }
349
350 String.escape = function(string) {
351     return string.replace(/('|\\)/g, "\\$1");
352 }
353
354 String.leftPad = function (val, size, ch) {
355     var result = new String(val);
356     if (ch == null) {
357         ch = " ";
358     }
359     while (result.length < size) {
360         result = ch + result;
361     }
362     return result;
363 }
364
365 Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
366 Date.monthNames =
367    ["January",
368     "February",
369     "March",
370     "April",
371     "May",
372     "June",
373     "July",
374     "August",
375     "September",
376     "October",
377     "November",
378     "December"];
379 Date.dayNames =
380    ["Sunday",
381     "Monday",
382     "Tuesday",
383     "Wednesday",
384     "Thursday",
385     "Friday",
386     "Saturday"];
387 Date.y2kYear = 50;
388 Date.monthNumbers = {
389     Jan:0,
390     Feb:1,
391     Mar:2,
392     Apr:3,
393     May:4,
394     Jun:5,
395     Jul:6,
396     Aug:7,
397     Sep:8,
398     Oct:9,
399     Nov:10,
400     Dec:11};
401 Date.patterns = {
402     ISO8601LongPattern:"Y-m-d H:i:s",
403     ISO8601ShortPattern:"Y-m-d",
404     ShortDatePattern: "n/j/Y",
405     LongDatePattern: "l, F d, Y",
406     FullDateTimePattern: "l, F d, Y g:i:s A",
407     MonthDayPattern: "F d",
408     ShortTimePattern: "g:i A",
409     LongTimePattern: "g:i:s A",
410     SortableDateTimePattern: "Y-m-d\\TH:i:s",
411     UniversalSortableDateTimePattern: "Y-m-d H:i:sO",
412     YearMonthPattern: "F, Y"};
413
414 var date = new Date("1/1/2007 1:11:11");
415
416 for (i = 0; i < 4000; ++i) {
417     var shortFormat = date.dateFormat("Y-m-d");
418     var longFormat = date.dateFormat("l, F d, Y g:i:s A");
419     date.setTime(date.getTime() + 84266956);
420 }
421
422 // FIXME: Find a way to validate this test.
423 // https://bugs.webkit.org/show_bug.cgi?id=114849
424
425 })();
426 } catch (e) {
427     print("JSC EXCEPTION FUZZ: Caught exception: " + e);
428 }