1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/tests/ecma_5/Date/15.9.4.2.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,133 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +//----------------------------------------------------------------------------- 1.10 +var BUGNUMBER = 430930; 1.11 + 1.12 + 1.13 +//----------------------------------------------------------------------------- 1.14 +test(); 1.15 +//----------------------------------------------------------------------------- 1.16 + 1.17 +function iso(d) 1.18 +{ 1.19 + return new Date(d).toISOString(); 1.20 +} 1.21 + 1.22 +function check(s, millis){ 1.23 + description = "Date.parse('"+s+"') == '"+iso(millis)+"'"; 1.24 + expected = millis; 1.25 + actual = Date.parse(s); 1.26 + reportCompare(expected, actual, description); 1.27 +} 1.28 + 1.29 +function checkInvalid(s) 1.30 +{ 1.31 + description = "Date.parse('"+s+"') produces invalid date"; 1.32 + expected = NaN; 1.33 + actual = Date.parse(s); 1.34 + reportCompare(expected, actual, description); 1.35 +} 1.36 + 1.37 +function dd(year, month, day, hour, minute, second, millis){ 1.38 + return Date.UTC(year, month-1, day, hour, minute, second, millis); 1.39 +} 1.40 + 1.41 +function TZAtDate(d){ 1.42 + return d.getTimezoneOffset() * 60000; 1.43 +} 1.44 + 1.45 +function TZInMonth(month){ 1.46 + return TZAtDate(new Date(dd(2009,month,1,0,0,0,0))); 1.47 +} 1.48 + 1.49 +function test() 1.50 +{ 1.51 + enterFunc ('test'); 1.52 + printBugNumber(BUGNUMBER); 1.53 + 1.54 + JanTZ = TZInMonth(1); 1.55 + JulTZ = TZInMonth(7); 1.56 + CurrTZ = TZAtDate(new Date()); 1.57 + 1.58 + // formats with explicit timezone 1.59 + check("2009-07-23T19:53:21.001+12:00", dd(2009,7,23,7,53,21,1)); 1.60 + check("2009-07-23T19:53:21+12:00", dd(2009,7,23,7,53,21,0)); 1.61 + check("2009-07-23T19:53+12:00", dd(2009,7,23,7,53,0,0)); 1.62 + 1.63 + check("2009-07T19:53:21.001+12:00", dd(2009,7,1,7,53,21,1)); 1.64 + check("2009-07T19:53:21+12:00", dd(2009,7,1,7,53,21,0)); 1.65 + check("2009-07T19:53+12:00", dd(2009,7,1,7,53,0,0)); 1.66 + 1.67 + check("2009T19:53:21.001+12:00", dd(2009,1,1,7,53,21,1)); 1.68 + check("2009T19:53:21+12:00", dd(2009,1,1,7,53,21,0)); 1.69 + check("2009T19:53+12:00", dd(2009,1,1,7,53,0,0)); 1.70 + 1.71 + check("T19:53:21.001+12:00", dd(1970,1,1,7,53,21,1)); 1.72 + check("T19:53:21+12:00", dd(1970,1,1,7,53,21,0)); 1.73 + check("T19:53+12:00", dd(1970,1,1,7,53,0,0)); 1.74 + 1.75 + // formats without timezone uses the timezone as at that date 1.76 + check("2009-07-23T19:53:21.001", dd(2009,7,23,19,53,21,1)+JulTZ); 1.77 + check("2009-07-23T19:53:21", dd(2009,7,23,19,53,21,0)+JulTZ); 1.78 + check("2009-07-23T19:53", dd(2009,7,23,19,53,0,0)+JulTZ); 1.79 + 1.80 + check("2009-07T19:53:21.001", dd(2009,7,1,19,53,21,1)+JulTZ); 1.81 + check("2009-07T19:53:21", dd(2009,7,1,19,53,21,0)+JulTZ); 1.82 + check("2009-07T19:53", dd(2009,7,1,19,53,0,0)+JulTZ); 1.83 + 1.84 + check("2009T19:53:21.001", dd(2009,1,1,19,53,21,1)+JanTZ); 1.85 + check("2009T19:53:21", dd(2009,1,1,19,53,21,0)+JanTZ); 1.86 + check("2009T19:53", dd(2009,1,1,19,53,0,0)+JanTZ); 1.87 + 1.88 + check("T19:53:21.001", dd(1970,1,1,19,53,21,1)+JanTZ); 1.89 + check("T19:53:21", dd(1970,1,1,19,53,21,0)+JanTZ); 1.90 + check("T19:53", dd(1970,1,1,19,53,0,0)+JanTZ); 1.91 + 1.92 + // with no time at all assume UTC 1.93 + check("2009-07-23", dd(2009,7,23,0,0,0,0)); 1.94 + check("2009-07", dd(2009,7,1,0,0,0,0)); 1.95 + check("2009", dd(2009,1,1,0,0,0,0)); 1.96 + 1.97 + // one field too big 1.98 + checkInvalid("2009-13-23T19:53:21.001+12:00"); 1.99 + checkInvalid("2009-07-32T19:53:21.001+12:00"); 1.100 + checkInvalid("2009-07-23T25:53:21.001+12:00"); 1.101 + checkInvalid("2009-07-23T19:60:21.001+12:00"); 1.102 + checkInvalid("2009-07-23T19:53:60.001+12:00"); 1.103 + checkInvalid("2009-07-23T19:53:21.001+24:00"); 1.104 + checkInvalid("2009-07-23T19:53:21.001+12:60"); 1.105 + 1.106 + // other month ends 1.107 + check("2009-06-30T19:53:21.001+12:00", dd(2009,6,30,7,53,21,1)); 1.108 + checkInvalid("2009-06-31T19:53:21.001+12:00"); 1.109 + check("2009-02-28T19:53:21.001+12:00", dd(2009,2,28,7,53,21,1)); 1.110 + checkInvalid("2009-02-29T19:53:21.001+12:00"); 1.111 + check("2008-02-29T19:53:21.001+12:00", dd(2008,2,29,7,53,21,1)); 1.112 + checkInvalid("2008-02-30T19:53:21.001+12:00"); 1.113 + 1.114 + // limits of representation 1.115 + checkInvalid("-271821-04-19T23:59:59.999Z"); 1.116 + check("-271821-04-20", -8.64e15); 1.117 + check("+275760-09-13", 8.64e15); 1.118 + checkInvalid("+275760-09-13T00:00:00.001Z"); 1.119 + 1.120 + check("-269845-07-23T19:53:21.001+12:00", dd(-269845,7,23,7,53,21,1)); 1.121 + check("+273785-07-23T19:53:21.001+12:00", dd(273785,7,23,7,53,21,1)); 1.122 + 1.123 + // explicit UTC 1.124 + check("2009-07-23T19:53:21.001Z", dd(2009,7,23,19,53,21,1)); 1.125 + check("+002009-07-23T19:53:21.001Z", dd(2009,7,23,19,53,21,1)); 1.126 + 1.127 + // different timezones 1.128 + check("2009-07-23T19:53:21.001+12:00", dd(2009,7,23,7,53,21,1)); 1.129 + check("2009-07-23T00:53:21.001-07:00", dd(2009,7,23,7,53,21,1)); 1.130 + 1.131 + // 00:00 and 24:00 1.132 + check("2009-07-23T00:00:00.000-07:00", dd(2009,7,23,7,0,0,0)); 1.133 + check("2009-07-23T24:00:00.000-07:00", dd(2009,7,24,7,0,0,0)); 1.134 + 1.135 + exitFunc ('test'); 1.136 +}