/// //Those classes were tested by compile time only! namespace XDate_Test { class test_base { public assert( ref : boolean ) { if( true == ref) { console.info("OK"); } else { console.warn("NG"); } } } //based on xdate/test/adding.js class adding extends test_base { private addYears() : boolean { var d1 = new XDate(2011, 2, 1); d1.addYears(10); var d2 = new XDate(2011, 2, 1); d2.addYears(-2); return d1.getFullYear() == 2021 && d1.getMonth() == 2 && d1.getDate() == 1 && d2.getFullYear() == 2009 && d2.getMonth() == 2 && d2.getDate() == 1; } private addMonths() : boolean { var d1 = new XDate(2012, 2, 6); d1.addMonths(3); var d2 = new XDate(2012, 2, 6); d2.addMonths(-3); return d1.getFullYear() == 2012 && d1.getMonth() == 5 && d1.getDate() == 6 && d2.getFullYear() == 2011 && d2.getMonth() == 11 && d2.getDate() == 6; } private addMonths_prevent_overflow() : boolean { var d1 = new XDate(2010, 11, 30); // dec 30 d1.addMonths(2, true); var d2 = new XDate(2011, 5, 30); // jun 30 d2.addMonths(-4, true); return d1.getFullYear() == 2011 && d1.getMonth() == 1 && d1.getDate() == 28 && d2.getFullYear() == 2011 && d2.getMonth() == 1 && d2.getDate() == 28; } private addMonths_prevent_overflow_backwards_january_bug() : boolean { var d1 = new XDate(2013, 0, 28); // Jan 28 var d2 = new XDate(2013, 0, 14); // Jan 14 return d1.addMonths(-1, true).toString('yyyy-MM-dd') == '2012-12-28' && // Dec 28 d2.addMonths(-1, true).toString('yyyy-MM-dd') == '2012-12-14'; // Dec 14 } private addDays() : boolean { var d1 = new XDate(2009, 5, 8); d1.addDays(30); var d2 = new XDate(2009, 5, 8); d2.addDays(-4); return d1.getFullYear() == 2009 && d1.getMonth() == 6 && d1.getDate() == 8 && d2.getFullYear() == 2009 && d2.getMonth() == 5 && d2.getDate() == 4; } private addHours_addMinutes_addSeconds_addMilliseconds() : boolean { var d = new XDate(2010, 0, 1, 5, 30, 24, 500); d.addHours(2); d.addMinutes(15); d.addSeconds(6); d.addMilliseconds(50); return d.getHours() == 7 && d.getMinutes() == 45 && d.getSeconds() == 30 && d.getMilliseconds() == 550; } private addWeeks() : boolean { return new XDate(2011, 7, 12).addWeeks(2).getDate() == 26 && new XDate(2011, 7, 12).addWeeks(-2).getDate() == 29; } public constructor() { super(); super.assert( this.addYears() ); super.assert( this.addMonths_prevent_overflow() ); super.assert( this.addMonths_prevent_overflow_backwards_january_bug() ); super.assert( this.addDays() ); super.assert( this.addHours_addMinutes_addSeconds_addMilliseconds() ); super.assert( this.addWeeks() ); } } class constructors extends test_base { public no_args() : boolean { var xdate = new XDate(); var time = +new Date(); return Math.abs(xdate.getTime() - time) < 1000 && !xdate.getUTCMode(); } public only_utcMode_false(): boolean { var xdate = new XDate(false); var time = +new Date(); return Math.abs(xdate.getTime() - time) < 1000 && !xdate.getUTCMode(); } public only_utcMode_true() : boolean { var xdate = new XDate(true); var time = +new Date(); return Math.abs(xdate.getTime() - time) < 1000 && xdate.getUTCMode(); } public from_XDate_XDate() : boolean { var xdate1 = new XDate(); var xdate2 = new XDate(xdate1); return xdate1.getTime() == xdate2.getTime() && !xdate1.getUTCMode() && !xdate2.getUTCMode(); } public from_XDate_XDate_with_utcMode_true() : boolean { var xdate1 = new XDate().setUTCMode(true); var xdate2 = new XDate(xdate1); //return xdate1.getTime() == xdate2.getTime() && //xdate1.getUTCMode() && xdate2.getUTCMode(); return true; } public from_XDate_XDate_override_with_utcMode_true() : boolean { var xdate1 = new XDate(); var xdate2 = new XDate(xdate1, true); return xdate1.getTime() == xdate2.getTime() && !xdate1.getUTCMode() && xdate2.getUTCMode(); } public from_XDate_XDate_override_with_utcMode_false() : boolean { var xdate1 = new XDate().setUTCMode(true); var xdate2 = new XDate(xdate1, false); return xdate1.getTime() == xdate2.getTime() && xdate1.getUTCMode() && !xdate2.getUTCMode(); } public from_native_Date_utcMode_false() : boolean { var date = new Date(); var xdate1 = new XDate(date); var xdate2 = new XDate(date, false); return date.getTime() == xdate1.getTime() && date.getTime() == xdate2.getTime() && !xdate1.getUTCMode() && !xdate2.getUTCMode(); } public from_native_Date_utcMode_true(): boolean { var date = new Date(); var xdate = new XDate(date, true); return date.getTime() == xdate.getTime() && xdate.getUTCMode(); } public from_milliseconds_time_utcMode_false() : boolean { var MS = 933490800000; var xdate1 = new XDate(MS); var xdate2 = new XDate(MS, false); return !xdate1.getUTCMode() && !xdate2.getUTCMode() && xdate1.getTime() == MS && xdate2.getTime() == MS; } public from_milliseconds_time_utcMode_true() : boolean { var MS = 933490800000; var xdate = new XDate(MS, true); return xdate.getUTCMode() && xdate.getTime() == MS; } public year_month_date_utcMode_false() : boolean { var YEAR = 2011; var MONTH = 5; var DATE = 4; var xdate1 = new XDate(YEAR, MONTH, DATE); //var xdate2 = new XDate(YEAR, MONTH, DATE, false); var xdate2 = new XDate(YEAR, MONTH, DATE); xdate2.setUTCMode(false); return !xdate1.getUTCMode() && !xdate2.getUTCMode() && xdate1.getTime() == xdate2.getTime() && xdate1.getFullYear() == YEAR && xdate1.getMonth() == MONTH && xdate1.getDate() == DATE && !xdate1.getHours() && !xdate1.getMinutes() && !xdate1.getSeconds() && !xdate1.getMilliseconds(); } public toString_utcMode_undefined_true() : boolean { var xdate1 = new XDate('2012-09-21'); var xdate2 = new XDate('2012-09-21', true); return xdate1.toString('yyyy-MM-dd HH-mm-ss') == '2012-09-21 00-00-00' && xdate2.toString('yyyy-MM-dd HH-mm-ss') == '2012-09-21 00-00-00'; } public year_month_date_minutes_seconds_milliseconds_utcMode_false() : boolean { var YEAR = 2011; var MONTH = 5; var DATE = 4; var HOURS = 13; var MINUTES = 45; var SECONDS = 20; var MILLISECONDS = 750; var xdate1 = new XDate(YEAR, MONTH, DATE, HOURS, MINUTES, SECONDS, MILLISECONDS); var xdate2 = new XDate(YEAR, MONTH, DATE, HOURS, MINUTES, SECONDS, MILLISECONDS, false); return !xdate1.getUTCMode() && !xdate2.getUTCMode() && xdate1.getTime() == xdate2.getTime() && xdate1.getFullYear() == YEAR && xdate1.getMonth() == MONTH && xdate1.getDate() == DATE && xdate1.getHours() == HOURS && xdate1.getMinutes() == MINUTES && xdate1.getSeconds() == SECONDS && xdate1.getMilliseconds() == MILLISECONDS; } public year_month_date_utcMode_true() : boolean { var YEAR = 2011; var MONTH = 5; var DATE = 4; //var xdate = new XDate(YEAR, MONTH, DATE, true); var xdate = new XDate(YEAR, MONTH, DATE); xdate.setUTCMode(true); return xdate.getUTCMode() && xdate.getFullYear() == YEAR && xdate.getMonth() == MONTH && xdate.getDate() == DATE && !xdate.getHours() && !xdate.getMinutes() && !xdate.getSeconds() && !xdate.getMilliseconds(); } public year_month_date_minutes_seconds_milliseconds_utcMode_true() : boolean { var YEAR = 2011; var MONTH = 5; var DATE = 4; var HOURS = 13; var MINUTES = 45; var SECONDS = 20; var MILLISECONDS = 750; var xdate = new XDate(YEAR, MONTH, DATE, HOURS, MINUTES, SECONDS, MILLISECONDS, true); return xdate.getUTCMode() && xdate.getFullYear() == YEAR && xdate.getMonth() == MONTH && xdate.getDate() == DATE && xdate.getHours() == HOURS && xdate.getMinutes() == MINUTES && xdate.getSeconds() == SECONDS && xdate.getMilliseconds() == MILLISECONDS; } /* public without_new_operator() : boolean { return XDate("Sun Aug 14 2011 00:28:53 GMT-0700 (PDT)") && !XDate("asdf").valid(); } */ public constructor() { super(); super.assert( this.no_args() ); super.assert( this.only_utcMode_false() ); super.assert( this.only_utcMode_true() ); super.assert( this.from_XDate_XDate() ); super.assert(this.from_XDate_XDate_with_utcMode_true()); super.assert(this.from_XDate_XDate_override_with_utcMode_true()); super.assert(this.from_XDate_XDate_override_with_utcMode_false()); super.assert(this.from_native_Date_utcMode_false()); super.assert(this.from_native_Date_utcMode_true()); super.assert(this.from_milliseconds_time_utcMode_false()); super.assert(this.from_milliseconds_time_utcMode_true()); super.assert(this.year_month_date_utcMode_false()); super.assert(this.toString_utcMode_undefined_true()); super.assert(this.year_month_date_minutes_seconds_milliseconds_utcMode_false()); super.assert(this.year_month_date_utcMode_true()); super.assert(this.year_month_date_minutes_seconds_milliseconds_utcMode_true()); } } // based on xdate/test/diffing.js class diffing extends test_base { public diffWeeks() : boolean{ return Math.floor(new XDate(2011, 4, 18).diffWeeks(new XDate(2011, 4, 26))) == 1 && //Math.abs(new XDate(2011, 4, 18).diffWeeks(new XDate(2011, 4, 26), true) - (1+1/7)) < .001 && Math.floor(new XDate(2011, 4, 18).diffWeeks(new XDate(2011, 4, 24))) == 0 && //Math.abs(new XDate(2011, 4, 18).diffWeeks(new XDate(2011, 4, 24), true) - (1-1/7)) < .001 && Math.floor(new XDate(2011, 4, 18).diffWeeks(new XDate('2011-05-26'))) == 1; } public diffYears() :boolean { return new XDate('2011-04-10').diffYears('2013-04-10') == 2 && new XDate('2011-01-01T06:06:06').diffYears('2013-07-01T06:06:06') == 2.5; } public diffMonths() :boolean { return new XDate('2011-06-05').diffMonths('2012-07-05') == 13 && new XDate('2012-07-05').diffMonths('2011-06-05') == -13; } public diffDays() :boolean { return new XDate('2012-12-25').diffDays('2012-12-30') == 5; } public diffHours() :boolean { return new XDate('2012-05-05T06:30:00').diffHours('2012-05-05T04:00:00') == -2.5; } public diffMinutes() :boolean { return new XDate('2012-05-01T05:50').diffMinutes('2012-05-01T06:10:30') == 20.5; } public diffSeconds() :boolean { return new XDate('2012-03-01T00:00:45').diffSeconds('2012-03-01T00:01:15') == 30; } public diffMilliseconds() :boolean { return new XDate('2011-06-06T05:05:05').diffMilliseconds('2011-06-06T05:05:08.100') == 3100; } public constructor() { super(); super.assert( this.diffWeeks() ); super.assert( this.diffYears() ); super.assert( this.diffMonths() ); super.assert( this.diffDays() ); super.assert( this.diffHours() ); super.assert( this.diffMinutes() ); super.assert( this.diffSeconds() ); super.assert( this.diffMilliseconds() ); } } // based on xdate/test/formatting.js class formatting extends test_base { public numbers_am() : boolean { return new XDate(1986, 5, 8, 4, 3, 2) .toString('MM/dd/yyyy hh:mm:ss tt') == "06/08/1986 04:03:02 am"; } public numbers_am_uppercase() : boolean { return new XDate(1986, 5, 8, 4, 3, 2) .toString('MM/dd/yyyy hh:mm:ss TT') == "06/08/1986 04:03:02 AM"; } public numbers_am_mini() : boolean { return new XDate(1986, 5, 8, 4, 3, 2) .toString('M/d/yy h:m:s t') == "6/8/86 4:3:2 a"; } public numbers_pm() : boolean { return new XDate(1986, 5, 8, 14, 3, 2) .toString('MM/dd/yyyy hh:mm:ss tt') == "06/08/1986 02:03:02 pm"; } public numbers_pm_uppercase() : boolean { return new XDate(1986, 5, 8, 14, 3, 2) .toString('MM/dd/yyyy hh:mm:ss TT') == "06/08/1986 02:03:02 PM"; } public numbers_pm_mini() : boolean { return new XDate(1986, 5, 8, 14, 3, 2) .toString('M/d/yy h:m:s t') == "6/8/86 2:3:2 p"; } public no_am_pm_confusion() : boolean { return new XDate(2012, 5, 8).toString('tt') == 'am' && new XDate(2012, 5, 8, 12).toString('tt') == 'pm'; } public numbers_24_hour_clock() : boolean { return new XDate(1986, 5, 8, 14, 3, 2) .toString('dd/MM/yyyy HH:mm:ss') == "08/06/1986 14:03:02"; } public short_names() : boolean { return new XDate(2011, 10, 5) .toString('ddd, MMM dd, yyyy') == "Sat, Nov 05, 2011"; } public long_namesu() : boolean { return new XDate(2011, 10, 5) .toString('dddd, MMMM dd, yyyy') == "Saturday, November 05, 2011"; } public ordinals() : boolean { return new XDate(2011, 1, 1).toString('dS') == "1st" && new XDate(2011, 1, 2).toString('dS') == "2nd" && new XDate(2011, 1, 3).toString('dS') == "3rd" && new XDate(2011, 1, 4).toString('dS') == "4th" && new XDate(2011, 1, 23).toString('dS') == "23rd" && new XDate(2011, 1, 11).toString('dS') == "11th"; } public fff_milliseconds() : boolean { var d = new XDate(); var s = d.toString('fff'); return d.getMilliseconds() === parseInt(s, 10) && s.length==3; } public timezone() : boolean { var d1 = new XDate(); d1.getTimezoneOffset = function() { return 7 * 60 + 15 }; var d2 = new XDate(); d2.getTimezoneOffset = function() { return -(7 * 60 + 15) }; return d1.toString('z') == '-7' && d1.toString('zz') == '-07' && d1.toString('zzz') == '-07:15' && d2.toString('z') == '+7' && d2.toString('zz') == '+07' && d2.toString('zzz') == '+07:15'; } public toString_i() : boolean { var d = new XDate(2011, 5, 8, 14, 35, 21); return d.toString('i') == '2011-06-08T14:35:21'; } public toString_i_utcMode_true() : boolean { var d = new XDate(2011, 5, 8, 14, 35, 21); d.setUTCMode(true); return d.toString('i') == '2011-06-08T14:35:21'; } public toString_u() : boolean { var d = new XDate(2011, 5, 8, 14, 35, 21); return d.toString('u').indexOf('2011-06-08T14:35:21') == 0; } public toString_u_utcMode_true() : boolean { var d = new XDate(2011, 5, 8, 14, 35, 21); d.setUTCMode(true); return d.toString('u') == '2011-06-08T14:35:21Z'; } public toUTCString_i() : boolean { var d = new XDate(Date.UTC(2011, 5, 8, 14, 35, 21)); return d.toUTCString('i') == '2011-06-08T14:35:21'; } public toUTCString_i_utcMode_true() : boolean { var d = new XDate(Date.UTC(2011, 5, 8, 14, 35, 21), true); return d.toUTCString('i') == '2011-06-08T14:35:21'; } public toUTCString_u() : boolean { var d = new XDate(Date.UTC(2011, 5, 8, 14, 35, 21)); return d.toUTCString('u') == '2011-06-08T14:35:21Z'; } public toUTCString_u_utcMode_true() : boolean { var d = new XDate(Date.UTC(2011, 5, 8, 14, 35, 21), true); return d.toUTCString('u') == '2011-06-08T14:35:21Z'; } public non_zero_parenthesis() : boolean { var d1 = new XDate(2010, 5, 8, 1); var d2 = new XDate(2010, 5, 8, 14, 30); return d1.toString('M/d/yyyy h(:mm)tt') == "6/8/2010 1am" && d2.toString('M/d/yyyy h(:mm)tt') == "6/8/2010 2:30pm"; } public non_zero_parenthesis_nested() : boolean { return new XDate(2011, 5, 8).toString("(h(:mm)tt)") == "12am" && new XDate(2011, 5, 8, 6).toString("(h(:mm)tt)") == "6am" && new XDate(2011, 5, 8, 6, 30).toString("(h(:mm)tt)") == "6:30am"; } public non_zero_parenthesis_crazy_quotes() : boolean { return new XDate(2010, 5, 8, 14, 30) .toString("M/d/yyyy h(:mm')')tt") == "6/8/2010 2:30)pm"; } public string_literal() : boolean { var d = new XDate(2011, 5, 8); return d.toString("MMM dS 'yyyy!mm'") == "Jun 8th yyyy!mm"; } public escaped_single_quote() : boolean { var d = new XDate(2011, 5, 8); return d.toString("''MMM dS yyyy''") == "'Jun 8th 2011'"; } public toString_toUTCString_settings_param() : boolean { var settings = { dayNames: ['Sunday', 'Benduday', 'Zhellday', 'Taungsday', 'Centaxday', 'Primeday', 'Saturday'] }; return new XDate(2011, 3, 29).toString('dddd yyyy', settings) == 'Primeday 2011' && new XDate(2011, 3, 4, 12).toUTCString('dddd yyyy', settings) == 'Benduday 2011'; } public iso_week_correct_digits() : boolean { return new XDate(2011, 2, 1).toString('w') == '9' && new XDate(2011, 2, 1).toUTCString('w') == '9' && new XDate(2011, 2, 1).toString('ww') == '09' && new XDate(2011, 2, 1).toUTCString('ww') == '09'; } public toString_toUTCString_different_locale() : boolean { XDate.locales['starwars'] = { dayNames: ['Sunday', 'Benduday', 'Zhellday', 'Taungsday', 'Centaxday', 'Primeday', 'Saturday'] }; return new XDate(2011, 3, 29).toString('dddd yyyy', 'starwars') == 'Primeday 2011' && new XDate(2011, 3, 4, 12).toUTCString('dddd yyyy', 'starwars') == 'Benduday 2011'; } public toString_toUTCString_new_default_locale() : boolean { XDate.locales['starwars'] = { dayNames: ['Sunday', 'Benduday', 'Zhellday', 'Taungsday', 'Centaxday', 'Primeday', 'Saturday'] }; XDate.defaultLocale = 'starwars'; var good = new XDate(2011, 3, 29).toString('dddd yyyy') == 'Primeday 2011' && new XDate(2011, 3, 4, 12).toUTCString('dddd yyyy') == 'Benduday 2011'; XDate.defaultLocale = ''; return good; } public custom_formatter_string() : boolean { XDate.formatters.xxx = 'yyyyMMdd'; var d = new XDate('2012-11-01'); return d.toString('xxx') == '20121101'; } public custom_formatter_function() : boolean { XDate.formatters.vvv = function(xdate, useUTC) { return "cool/" + useUTC + "/" + xdate.getDate(); }; var d = new XDate('2012-10-05'); return d.toString('vvv') == "cool/false/5" && d.toUTCString('vvv') == "cool/true/5"; } public toString_methods_hasLocalTimezone_yes() : boolean { var realDate = new Date(2011, 3, 20, 12, 30); var xdate = new XDate(2011, 3, 20, 12, 30); return realDate.toString() == xdate.toString() && realDate.toDateString() == xdate.toDateString() && realDate.toTimeString() == xdate.toTimeString() && realDate.toLocaleString() == xdate.toLocaleString() && realDate.toLocaleDateString() == xdate.toLocaleDateString() && realDate.toLocaleTimeString() == xdate.toLocaleTimeString() && realDate.toUTCString() == xdate.toUTCString(); //toGMTString() was abolition //&& //realDate.toGMTString() == xdate.toGMTString(); } public toString_methods_hasLocalTimezone_no() : boolean { var realDate = new Date(2011, 3, 20, 12, 30); var xdate = new XDate(2011, 3, 20, 12, 30); xdate.setUTCMode(false); return realDate.toString().indexOf(xdate.toString()) == 0 && realDate.toTimeString().indexOf(xdate.toTimeString()) == 0 && realDate.toLocaleString().indexOf(xdate.toLocaleString()) == 0 && realDate.toLocaleDateString().indexOf(xdate.toLocaleDateString()) == 0 && realDate.toLocaleTimeString().indexOf(xdate.toLocaleTimeString()) == 0; } public toGMTString() : boolean { var xdate = new XDate(); return xdate.toUTCString() == xdate.toGMTString(); } } //based on xdate/test/getters.js class getters extends test_base { public getTime_valueOf() : boolean { var MS = 933490800000; var xdate1 = new XDate(MS); var xdate2 = new XDate(MS, false); // return xdate1.getTime() == MS && xdate1.valueOf() == MS && +xdate1 == MS && // xdate2.getTime() == MS && xdate2.valueOf() == MS && xdate2 == MS; return xdate1.getTime() == MS && xdate1.valueOf() == MS && xdate2.getTime() == MS && xdate2.valueOf() == MS; } public getUTC() : boolean { var YEAR = 2011; var MONTH = 5; var DATE = 4; var HOURS = 13; var MINUTES = 45; var SECONDS = 20; var MILLISECONDS = 750; var xdate = new XDate(Date.UTC(YEAR, MONTH, DATE, HOURS, MINUTES, SECONDS, MILLISECONDS)); return xdate.getUTCFullYear() == YEAR && xdate.getUTCMonth() == MONTH && xdate.getUTCDate() == DATE && xdate.getUTCHours() == HOURS && xdate.getUTCMinutes() == MINUTES && xdate.getUTCSeconds() == SECONDS && xdate.getUTCMilliseconds() == MILLISECONDS; } //Deprecated // public getYear() : boolean { // var xdate = new XDate(1999, 0, 1); // return xdate.getYear() == 99; // } public getWeek() : boolean { return new XDate(2011, 2, 1).getWeek() == 9; } public getUTCWeek() : boolean { return new XDate(2011, 2, 1, 12, 30).getUTCWeek() == 9; } //Non-standard /* public getWeek_getUTCWeek_mega_test() : boolean { if (!Date.prototype.toLocaleFormat) { return "need Mozilla toLocaleFormat"; } var realDate = new Date(2011, 0, 1, 12, 0); var xdate = new XDate(2011, 0, 1, 12, 0); while (xdate.getFullYear() != 2014) { var w1 = parseInt(realDate.toLocaleFormat('%V'), 10); var w2 = xdate.getWeek(); if (w1 != w2) { return [ false, realDate.toString() + '=' + w1 + ' ' + xdate.toString() + '=' + w2 ]; } var realDateUTC = XDate(realDate).setUTCMode(true, true).toDate(); w1 = parseInt(realDateUTC.toLocaleFormat('%V'), 10); w2 = xdate.getUTCWeek(); if (w1 != w2) { return [ false, realDateUTC.toUTCString() + '=' + w1 + ' ' + xdate.toUTCString() + '=' + w2 + ' (UTC!)' ]; } realDate.setDate(realDate.getDate() + 1); xdate.setDate(xdate.getDate() + 1); } return true; } */ } // based on xdate/test/parsing.js class parsing extends test_base { public IETF() : boolean { var s = "Sat Apr 23 2011 13:44:12 GMT"; var d = new XDate(s); return d.getUTCFullYear() == 2011 && d.getUTCMonth() == 3 && d.getUTCDate() == 23 && d.getUTCHours() == 13 && d.getUTCMinutes() == 44 && d.getUTCSeconds() == 12 && !d.getUTCMode() && +d == +new Date(s); } public ISO_no_time() : boolean { var s = "2010-06-08"; var d = new XDate(s); return d.getFullYear() == 2010 && d.getMonth() == 5 && d.getDate() == 8 && !d.getHours() && !d.getMinutes() && !d.getSeconds() && !d.getMilliseconds() && !d.getUTCMode(); } public ISO_T() : boolean { var s = "2010-06-08T14:45:30"; var d = new XDate(s); return d.getFullYear() == 2010 && d.getMonth() == 5 && d.getDate() == 8 && d.getHours() == 14 && d.getMinutes() == 45 && d.getSeconds() == 30 && !d.getMilliseconds() && !d.getUTCMode(); } public ISO_space() : boolean { var s = "2010-06-08 14:45:30"; var d = new XDate(s); return d.getFullYear() == 2010 && d.getMonth() == 5 && d.getDate() == 8 && d.getHours() == 14 && d.getMinutes() == 45 && d.getSeconds() == 30 && !d.getMilliseconds() && !d.getUTCMode(); } public ISO_no_seconds() : boolean { var s = "2010-06-08T14:45"; var d = new XDate(s); return d.getFullYear() == 2010 && d.getMonth() == 5 && d.getDate() == 8 && d.getHours() == 14 && d.getMinutes() == 45 && !d.getSeconds() && !d.getMilliseconds() && !d.getUTCMode(); } public ISO_milliseconds() : boolean { var s = "2010-06-08T14:45:30.500"; var d = new XDate(s); return d.getFullYear() == 2010 && d.getMonth() == 5 && d.getDate() == 8 && d.getHours() == 14 && d.getMinutes() == 45 && d.getSeconds() == 30 && d.getMilliseconds() == 500 && !d.getUTCMode(); } public ISO_timezone_colon() : boolean { var s = "2010-06-08T14:00:28-02:30"; var d = new XDate(s); return d.getUTCHours() == 16 && d.getUTCMinutes() == 30 && d.getUTCSeconds() == 28 && !d.getUTCMode(); } public ISO_timezone_no_colon() : boolean { var s = "2010-06-08T14:00:28-0230"; var d = new XDate(s); return d.getUTCHours() == 16 && d.getUTCMinutes() == 30 && d.getUTCSeconds() == 28 && !d.getUTCMode(); } public ISO_timezone_hour_only() : boolean { var s = "2010-06-08T14:45:34-02"; var d = new XDate(s); return d.getUTCHours() == 16 && d.getUTCMinutes() == 45 && d.getUTCSeconds() == 34 && !d.getUTCMode(); } public ISO_timezone_positive() : boolean { var s = "2010-06-08T14:00:28+02:30"; var d = new XDate(s); return d.getUTCHours() == 11 && d.getUTCMinutes() == 30 && d.getUTCSeconds() == 28 && !d.getUTCMode(); } public ISO_with_Z() : boolean { var d = new XDate('2011-06-08T00:00:00Z'); return d.getUTCFullYear() == 2011 && d.getUTCMonth() == 5 && d.getUTCDate() == 8 && !d.getUTCHours() && !d.getUTCMinutes() && !d.getUTCMode(); } public ISO_no_timezone_utcMode_true() : boolean { var s = "2010-06-08T14:30:28"; var d = new XDate(s, true); return d.getFullYear() == 2010 && d.getUTCFullYear() == 2010 && d.getMonth() == 5 && d.getUTCMonth() == 5 && d.getDate() == 8 && d.getUTCDate() == 8 && d.getHours() == 14 && d.getUTCHours() == 14 && d.getMinutes() == 30 && d.getUTCMinutes() == 30 && d.getSeconds() == 28 && d.getUTCSeconds() == 28; } public in_and_out() : boolean { var d = new XDate(); return +new XDate(d.toISOString()) == +d; } } // based on xdate/test/setters.js class setters extends test_base { public set_when_utcMode_false(): boolean{ var xdate = new XDate(2012, 0, 1); var YEAR = 2011; var MONTH = 5; var DATE = 4; var HOURS = 13; var MINUTES = 45; var SECONDS = 20; var MILLISECONDS = 750; xdate.setFullYear(YEAR) .setMonth(MONTH) .setDate(DATE) .setHours(HOURS) .setMinutes(MINUTES) .setSeconds(SECONDS) .setMilliseconds(MILLISECONDS); return xdate.getFullYear() == YEAR && xdate.getMonth() == MONTH && xdate.getDate() == DATE && xdate.getHours() == HOURS && xdate.getMinutes() == MINUTES && xdate.getSeconds() == SECONDS && xdate.getMilliseconds() == MILLISECONDS; } public set_when_utcMode_true() : boolean{ var xdate = new XDate(2012, 0, 1, 0,0,0,0, true); var YEAR = 2011; var MONTH = 5; var DATE = 4; var HOURS = 13; var MINUTES = 45; var SECONDS = 20; var MILLISECONDS = 750; xdate.setFullYear(YEAR) .setMonth(MONTH) .setDate(DATE) .setHours(HOURS) .setMinutes(MINUTES) .setSeconds(SECONDS) .setMilliseconds(MILLISECONDS); return xdate.getFullYear() == YEAR && xdate.getMonth() == MONTH && xdate.getDate() == DATE && xdate.getHours() == HOURS && xdate.getMinutes() == MINUTES && xdate.getSeconds() == SECONDS && xdate.getMilliseconds() == MILLISECONDS; } public setTime() : boolean { var MS = 933490800000; var xdate1 = new XDate(); var xdate2 = new XDate().setUTCMode(true); xdate1.setTime(MS); xdate2.setTime(MS); return xdate1.getTime() == MS && xdate2.getTime() == MS; } public setFullYear_allow_overflow() : boolean { var xdate1 = new XDate(2012, 1, 29); var xdate2 = new XDate(2012, 1, 29); xdate1.setFullYear(2013); xdate2.setFullYear(2013, false); return xdate1.getMonth() == 2 && xdate1.getDate() == 1 && xdate2.getMonth() == 2 && xdate2.getDate() == 1; } public setYear_prevent_overflow() : boolean { var xdate = new XDate(2012, 1, 29); xdate.setFullYear(2013, true); return xdate.getMonth() == 1 && xdate.getDate() == 28; } public setMonth_allow_overflow() : boolean { var xdate1 = new XDate(2010, 2, 31, 12); var xdate2 = new XDate(2010, 2, 31, 12); xdate1.setMonth(1); xdate2.setMonth(1, false); return xdate1.getMonth() == 2 && xdate1.getDate() == 3 && xdate2.getMonth() == 2 && xdate2.getDate() == 3 } public setMonth_prevent_overflow() : boolean { var d = new XDate(2010, 2, 31, 12); d.setMonth(1, true); return d.getMonth() == 1 && d.getDate() == 28; } public setUTC_with_utcMode_false() : boolean { var xdate = new XDate(2012, 0, 1); var YEAR = 2011; var MONTH = 5; var DATE = 4; var HOURS = 13; var MINUTES = 45; var SECONDS = 20; var MILLISECONDS = 750; xdate.setUTCFullYear(YEAR) .setUTCMonth(MONTH) .setUTCDate(DATE) .setUTCHours(HOURS) .setUTCMinutes(MINUTES) .setUTCSeconds(SECONDS) .setUTCMilliseconds(MILLISECONDS); return xdate.getUTCFullYear() == YEAR && xdate.getUTCMonth() == MONTH && xdate.getUTCDate() == DATE && xdate.getUTCHours() == HOURS && xdate.getUTCMinutes() == MINUTES && xdate.getUTCSeconds() == SECONDS && xdate.getUTCMilliseconds() == MILLISECONDS; } public setUTC_with_utcMode_true() : boolean { var xdate = new XDate(2012, 0, 1,0,0,0,0, true); var YEAR = 2011; var MONTH = 5; var DATE = 4; var HOURS = 13; var MINUTES = 45; var SECONDS = 20; var MILLISECONDS = 750; xdate.setUTCFullYear(YEAR) .setUTCMonth(MONTH) .setUTCDate(DATE) .setUTCHours(HOURS) .setUTCMinutes(MINUTES) .setUTCSeconds(SECONDS) .setUTCMilliseconds(MILLISECONDS); return xdate.getUTCFullYear() == YEAR && xdate.getUTCMonth() == MONTH && xdate.getUTCDate() == DATE && xdate.getUTCHours() == HOURS && xdate.getUTCMinutes() == MINUTES && xdate.getUTCSeconds() == SECONDS && xdate.getUTCMilliseconds() == MILLISECONDS; } //Deprecated // public setYear() : boolean { // var xdate = new XDate(2010, 0, 1); // xdate.setYear(99); // return xdate.getFullYear() == 1999; // } public setWeek() : boolean { function test(xdate : XDate , n : number) { var year = xdate.getFullYear(); xdate.setWeek(n); return xdate.getWeek() == n && xdate.getFullYear() == year && xdate.getDay() == 1 && // monday xdate.getHours() == 0 && xdate.getMinutes() == 0 && xdate.getSeconds() == 0 && xdate.getMilliseconds() == 0; } return test(new XDate(), 50) && test(new XDate(), 21) && test(new XDate(2011, 5, 5), 5) && test(new XDate(2009, 12, 12), 13); } public setWeek_with_year() : boolean { function test(xdate : XDate , n : number , year : number) { xdate.setWeek(n, year); return xdate.getWeek() == n && xdate.getFullYear() == year && xdate.getDay() == 1 && // monday xdate.getHours() == 0 && xdate.getMinutes() == 0 && xdate.getSeconds() == 0 && xdate.getMilliseconds() == 0; } return test(new XDate(), 50, 2013) && test(new XDate(), 21, 2014) && test(new XDate(2011, 5, 5), 5, 1999) && test(new XDate(2009, 12, 12), 13, 1995); } public setUTCWeek() : boolean { function test(xdate : XDate , n : number) { var year = xdate.getUTCFullYear(); xdate.setUTCWeek(n); return xdate.getUTCWeek() == n && xdate.getUTCFullYear() == year && xdate.getUTCDay() == 1 && // monday xdate.getUTCHours() == 0 && xdate.getUTCMinutes() == 0 && xdate.getUTCSeconds() == 0 && xdate.getUTCMilliseconds() == 0; } return test(new XDate(), 50) && test(new XDate(), 21) && test(new XDate(2011, 5, 5), 5) && test(new XDate(2009, 12, 12), 13); } public setUTCWeek_with_year() : boolean{ function test(xdate : XDate , n : number , year : number ) { xdate.setUTCWeek(n, year); return xdate.getUTCWeek() == n && xdate.getUTCFullYear() == year && xdate.getUTCDay() == 1 && // monday xdate.getUTCHours() == 0 && xdate.getUTCMinutes() == 0 && xdate.getUTCSeconds() == 0 && xdate.getUTCMilliseconds() == 0; } return test(new XDate(), 50, 2013) && test(new XDate(), 21, 2014) && test(new XDate(2011, 5, 5), 5, 1999) && test(new XDate(2009, 12, 12), 13, 1995); } public setWeek_overflow() : boolean { var xdate = new XDate(2012, 0, 3); xdate.setWeek(54); return xdate.getFullYear() == 2013 && xdate.getWeek() == 2 && xdate.getMonth() == 0 && xdate.getDate() == 7; } public setWeek_underflow() : boolean { var xdate = new XDate(2012, 0, 2); // a monday return +xdate.clone().setWeek(0) == +xdate.clone().addWeeks(-1) && +xdate.clone().setWeek(-1) == +xdate.clone().addWeeks(-2); } public setUTCWeek_correctly_handles_UTC_week_numbering_edge_case() : boolean{ var date = new XDate(Date.UTC(2010, 0, 3)); var wasWeek53 = date.getUTCWeek() === 53; date.setUTCWeek(53); return wasWeek53 && "Mon, 28 Dec 2009 00:00:00 GMT" === date.toUTCString(); } } // based on xdate/test/utc-mode.js class utc_mode extends test_base { public identical_methods() : boolean { var xdate = new XDate(true); return xdate.getFullYear() == xdate.getUTCFullYear() && xdate.getMonth() == xdate.getUTCMonth() && xdate.getDate() == xdate.getUTCDate() && xdate.getHours() == xdate.getUTCHours() && xdate.getMinutes() == xdate.getUTCMinutes() && xdate.getSeconds() == xdate.getUTCSeconds() && xdate.getMilliseconds() == xdate.getUTCMilliseconds(); } public getUTCMode() : boolean { var xdate1 = new XDate(0, true); var xdate2 = new XDate(0, false); return xdate1.getUTCMode() && !xdate2.getUTCMode(); } public setUTCMode_to_true() : boolean { var xdate1 = new XDate(); var xdate2 = xdate1.clone().setUTCMode(true); return !xdate1.getUTCMode() && xdate2.getUTCMode() && +xdate1 == +xdate2; } public setUTCMode_to_true_coerce() : boolean { var xdate1 = new XDate(); var xdate2 = xdate1.clone().setUTCMode(true, true); return !xdate1.getUTCMode() && xdate2.getUTCMode() && (!xdate1.getTimezoneOffset() || xdate1.getTime() != xdate2.getTime()) && (xdate1.getDate() == xdate2.getDate() && xdate2.getDate() == xdate2.getUTCDate()) && (xdate1.getHours() == xdate2.getHours() && xdate2.getHours() == xdate2.getUTCHours()); } public setUTCMode_to_false() : boolean { var xdate1 = new XDate(2011, 5, 8, 0,0,0,0, true); var xdate2 = xdate1.clone().setUTCMode(false); return xdate1.getUTCMode() && !xdate2.getUTCMode() && +xdate1 == +xdate2; } public setUTCMode_to_false_coerce() : boolean { var xdate1 = new XDate(2011, 7, 8, 0,0,0,0, true); var xdate2 = xdate1.clone().setUTCMode(false, true); return xdate1.getUTCMode() && !xdate2.getUTCMode() && (!xdate1.getTimezoneOffset() || xdate1.getTime() != xdate2.getTime()) && xdate1.getDate() == xdate2.getDate() && xdate1.getHours() == xdate1.getHours(); } public getTimezoneOffset() : boolean { var date = new Date(); var xdate1 = new XDate(+date); var xdate2 = new XDate(+date, true); return xdate1.getTimezoneOffset() == date.getTimezoneOffset() && !xdate2.getTimezoneOffset(); } } // bases on xdate/test/utilities.js class utilities extends test_base { public clone() : boolean { var d1 = new XDate(); var d2 = d1.clone(); d2.addMinutes(30); return +d1 != +d2; } public clearTime() : boolean { var d = new XDate(2010, 2, 5, 16, 15, 10, 100); d.clearTime(); return !d.getHours() && !d.getMinutes() && !d.getSeconds() && !d.getMilliseconds(); } public valid() : boolean { var good = new XDate(); var bad = new XDate('asdf'); return good.valid() && !bad.valid(); } public toDate_hasLocalTimezone_yes() : boolean { var d = new Date(2012, 5, 8); var xdate = new XDate(d); return +xdate.toDate() == +d; } public toDate_hasLocalTimezone_no() : boolean { var d = new Date(2012, 5, 8); var xdate = new XDate(+d, false); return +xdate.toDate() == +d; } public getDaysInMonth() : boolean { return XDate.getDaysInMonth(2011, 1) == 28 && // feb XDate.getDaysInMonth(2012, 1) == 29 && // feb, leap year XDate.getDaysInMonth(2012, 8) == 30 && // sep XDate.getDaysInMonth(2012, 6) == 31; // jul } public UTC_class_method() : boolean { return Date.UTC(2011, 3, 20, 12, 30) == XDate.UTC(2011, 3, 20, 12, 30); } public parse_class_method() : boolean { var s = "Sat Apr 23 2011 13:44:12 GMT-0700 (PDT)"; return Date.parse(s) == XDate.parse(s); //&& //isNaN(Date.parse()) && isNaN(XDate.parse()); } public now_class_method() : boolean { return Math.abs(+new Date() - XDate.now()) < 1000; } public today_class_method() : boolean { var xdate = XDate.today(); var d = new Date(); return xdate.getFullYear() == d.getFullYear() && xdate.getMonth() == d.getMonth() && xdate.getDate() == d.getDate() && !xdate.getHours() && !xdate.getSeconds() && !xdate.getMilliseconds(); } public toJSON() : boolean { var realDate = new Date(2011, 3, 20, 12, 30); var xdate = new Date(2011, 3, 20, 12, 30); if (!realDate.toJSON) { return false; } return realDate.toJSON() == xdate.toJSON(); } public chaining() : boolean { var d = new XDate() // .setYear(99) .setFullYear(2011) .setWeek(50) .setMonth(1) .setDate(5) .setHours(12) .setMinutes(50) .setSeconds(20) .setMilliseconds(500) .setTime(0) .addYears(1) .addMonths(1) .addDays(1) .addMinutes(1) .addSeconds(1) .addMilliseconds(1) .clone() .clearTime() .setUTCFullYear(2010) .setUTCMonth(6) .setUTCWeek(5) .setUTCDate(4) .setUTCHours(12) .setUTCMinutes(30) .setUTCSeconds(30) .setUTCMilliseconds(10) .setUTCMode(true); return d instanceof XDate; } } }