sta.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901
  1. /// Copyright (c) 2012 Ecma International. All rights reserved.
  2. /// Ecma International makes this code available under the terms and conditions set
  3. /// forth on http://hg.ecmascript.org/tests/test262/raw-file/tip/LICENSE (the
  4. /// "Use Terms"). Any redistribution of this code must retain the above
  5. /// copyright and this notice and otherwise comply with the Use Terms.
  6. //-----------------------------------------------------------------------------
  7. function compareArray(aExpected, aActual) {
  8. if (aActual.length != aExpected.length) {
  9. return false;
  10. }
  11. aExpected.sort();
  12. aActual.sort();
  13. var s;
  14. for (var i = 0; i < aExpected.length; i++) {
  15. if (aActual[i] !== aExpected[i]) {
  16. return false;
  17. }
  18. }
  19. return true;
  20. }
  21. //-----------------------------------------------------------------------------
  22. function arrayContains(arr, expected) {
  23. var found;
  24. for (var i = 0; i < expected.length; i++) {
  25. found = false;
  26. for (var j = 0; j < arr.length; j++) {
  27. if (expected[i] === arr[j]) {
  28. found = true;
  29. break;
  30. }
  31. }
  32. if (!found) {
  33. return false;
  34. }
  35. }
  36. return true;
  37. }
  38. //-----------------------------------------------------------------------------
  39. var supportsArrayIndexGettersOnArrays = undefined;
  40. function fnSupportsArrayIndexGettersOnArrays() {
  41. if (typeof supportsArrayIndexGettersOnArrays !== "undefined") {
  42. return supportsArrayIndexGettersOnArrays;
  43. }
  44. supportsArrayIndexGettersOnArrays = false;
  45. if (fnExists(Object.defineProperty)) {
  46. var arr = [];
  47. Object.defineProperty(arr, "0", {
  48. get: function () {
  49. supportsArrayIndexGettersOnArrays = true;
  50. return 0;
  51. }
  52. });
  53. var res = arr[0];
  54. }
  55. return supportsArrayIndexGettersOnArrays;
  56. }
  57. //-----------------------------------------------------------------------------
  58. var supportsArrayIndexGettersOnObjects = undefined;
  59. function fnSupportsArrayIndexGettersOnObjects() {
  60. if (typeof supportsArrayIndexGettersOnObjects !== "undefined")
  61. return supportsArrayIndexGettersOnObjects;
  62. supportsArrayIndexGettersOnObjects = false;
  63. if (fnExists(Object.defineProperty)) {
  64. var obj = {};
  65. Object.defineProperty(obj, "0", {
  66. get: function () {
  67. supportsArrayIndexGettersOnObjects = true;
  68. return 0;
  69. }
  70. });
  71. var res = obj[0];
  72. }
  73. return supportsArrayIndexGettersOnObjects;
  74. }
  75. //-----------------------------------------------------------------------------
  76. function ConvertToFileUrl(pathStr) {
  77. return "file:" + pathStr.replace(/\\/g, "/");
  78. }
  79. //-----------------------------------------------------------------------------
  80. function fnExists(/*arguments*/) {
  81. for (var i = 0; i < arguments.length; i++) {
  82. if (typeof (arguments[i]) !== "function") return false;
  83. }
  84. return true;
  85. }
  86. //-----------------------------------------------------------------------------
  87. var __globalObject = Function("return this;")();
  88. function fnGlobalObject() {
  89. return __globalObject;
  90. }
  91. //-----------------------------------------------------------------------------
  92. function fnSupportsStrict() {
  93. "use strict";
  94. try {
  95. eval('with ({}) {}');
  96. return false;
  97. } catch (e) {
  98. return true;
  99. }
  100. }
  101. //-----------------------------------------------------------------------------
  102. //Verify all attributes specified data property of given object:
  103. //value, writable, enumerable, configurable
  104. //If all attribute values are expected, return true, otherwise, return false
  105. function dataPropertyAttributesAreCorrect(obj,
  106. name,
  107. value,
  108. writable,
  109. enumerable,
  110. configurable) {
  111. var attributesCorrect = true;
  112. if (obj[name] !== value) {
  113. if (typeof obj[name] === "number" &&
  114. isNaN(obj[name]) &&
  115. typeof value === "number" &&
  116. isNaN(value)) {
  117. // keep empty
  118. } else {
  119. attributesCorrect = false;
  120. }
  121. }
  122. try {
  123. if (obj[name] === "oldValue") {
  124. obj[name] = "newValue";
  125. } else {
  126. obj[name] = "OldValue";
  127. }
  128. } catch (we) {
  129. }
  130. var overwrited = false;
  131. if (obj[name] !== value) {
  132. if (typeof obj[name] === "number" &&
  133. isNaN(obj[name]) &&
  134. typeof value === "number" &&
  135. isNaN(value)) {
  136. // keep empty
  137. } else {
  138. overwrited = true;
  139. }
  140. }
  141. if (overwrited !== writable) {
  142. attributesCorrect = false;
  143. }
  144. var enumerated = false;
  145. for (var prop in obj) {
  146. if (obj.hasOwnProperty(prop) && prop === name) {
  147. enumerated = true;
  148. }
  149. }
  150. if (enumerated !== enumerable) {
  151. attributesCorrect = false;
  152. }
  153. var deleted = false;
  154. try {
  155. delete obj[name];
  156. } catch (de) {
  157. }
  158. if (!obj.hasOwnProperty(name)) {
  159. deleted = true;
  160. }
  161. if (deleted !== configurable) {
  162. attributesCorrect = false;
  163. }
  164. return attributesCorrect;
  165. }
  166. //-----------------------------------------------------------------------------
  167. //Verify all attributes specified accessor property of given object:
  168. //get, set, enumerable, configurable
  169. //If all attribute values are expected, return true, otherwise, return false
  170. function accessorPropertyAttributesAreCorrect(obj,
  171. name,
  172. get,
  173. set,
  174. setVerifyHelpProp,
  175. enumerable,
  176. configurable) {
  177. var attributesCorrect = true;
  178. if (get !== undefined) {
  179. if (obj[name] !== get()) {
  180. if (typeof obj[name] === "number" &&
  181. isNaN(obj[name]) &&
  182. typeof get() === "number" &&
  183. isNaN(get())) {
  184. // keep empty
  185. } else {
  186. attributesCorrect = false;
  187. }
  188. }
  189. } else {
  190. if (obj[name] !== undefined) {
  191. attributesCorrect = false;
  192. }
  193. }
  194. try {
  195. var desc = Object.getOwnPropertyDescriptor(obj, name);
  196. if (typeof desc.set === "undefined") {
  197. if (typeof set !== "undefined") {
  198. attributesCorrect = false;
  199. }
  200. } else {
  201. obj[name] = "toBeSetValue";
  202. if (obj[setVerifyHelpProp] !== "toBeSetValue") {
  203. attributesCorrect = false;
  204. }
  205. }
  206. } catch (se) {
  207. throw se;
  208. }
  209. var enumerated = false;
  210. for (var prop in obj) {
  211. if (obj.hasOwnProperty(prop) && prop === name) {
  212. enumerated = true;
  213. }
  214. }
  215. if (enumerated !== enumerable) {
  216. attributesCorrect = false;
  217. }
  218. var deleted = false;
  219. try {
  220. delete obj[name];
  221. } catch (de) {
  222. throw de;
  223. }
  224. if (!obj.hasOwnProperty(name)) {
  225. deleted = true;
  226. }
  227. if (deleted !== configurable) {
  228. attributesCorrect = false;
  229. }
  230. return attributesCorrect;
  231. }
  232. //-----------------------------------------------------------------------------
  233. var NotEarlyErrorString = "NotEarlyError";
  234. var EarlyErrorRePat = "^((?!" + NotEarlyErrorString + ").)*$";
  235. var NotEarlyError = new Error(NotEarlyErrorString);
  236. //-----------------------------------------------------------------------------
  237. // Copyright 2009 the Sputnik authors. All rights reserved.
  238. // This code is governed by the BSD license found in the LICENSE file.
  239. function Test262Error(message) {
  240. if (message) this.message = message;
  241. }
  242. Test262Error.prototype.toString = function () {
  243. return "Test262 Error: " + this.message;
  244. };
  245. function testFailed(message) {
  246. throw new Test262Error(message);
  247. }
  248. function testPrint(message) {
  249. }
  250. //adaptors for Test262 framework
  251. function $PRINT(message) {
  252. }
  253. function $INCLUDE(message) { }
  254. function $ERROR(message) {
  255. testFailed(message);
  256. }
  257. function $FAIL(message) {
  258. testFailed(message);
  259. }
  260. //Sputnik library definitions
  261. //Ultimately these should be namespaced some how and only made
  262. //available to tests that explicitly include them.
  263. //For now, we just define the globally
  264. //math_precision.js
  265. // Copyright 2009 the Sputnik authors. All rights reserved.
  266. // This code is governed by the BSD license found in the LICENSE file.
  267. function getPrecision(num) {
  268. //TODO: Create a table of prec's,
  269. // because using Math for testing Math isn't that correct.
  270. var log2num = Math.log(Math.abs(num)) / Math.LN2;
  271. var pernum = Math.ceil(log2num);
  272. return (2 * Math.pow(2, -52 + pernum));
  273. //return(0);
  274. }
  275. //math_isequal.js
  276. // Copyright 2009 the Sputnik authors. All rights reserved.
  277. // This code is governed by the BSD license found in the LICENSE file.
  278. var prec;
  279. function isEqual(num1, num2) {
  280. if ((num1 === Infinity) && (num2 === Infinity)) {
  281. return (true);
  282. }
  283. if ((num1 === -Infinity) && (num2 === -Infinity)) {
  284. return (true);
  285. }
  286. prec = getPrecision(Math.min(Math.abs(num1), Math.abs(num2)));
  287. return (Math.abs(num1 - num2) <= prec);
  288. //return(num1 === num2);
  289. }
  290. //numeric_conversion.js
  291. // Copyright 2009 the Sputnik authors. All rights reserved.
  292. // This code is governed by the BSD license found in the LICENSE file.
  293. function ToInteger(p) {
  294. var x = Number(p);
  295. if (isNaN(x)) {
  296. return +0;
  297. }
  298. if ((x === +0)
  299. || (x === -0)
  300. || (x === Number.POSITIVE_INFINITY)
  301. || (x === Number.NEGATIVE_INFINITY)) {
  302. return x;
  303. }
  304. var sign = (x < 0) ? -1 : 1;
  305. return (sign * Math.floor(Math.abs(x)));
  306. }
  307. //Date_constants.js
  308. // Copyright 2009 the Sputnik authors. All rights reserved.
  309. // This code is governed by the BSD license found in the LICENSE file.
  310. var HoursPerDay = 24;
  311. var MinutesPerHour = 60;
  312. var SecondsPerMinute = 60;
  313. var msPerDay = 86400000;
  314. var msPerSecond = 1000;
  315. var msPerMinute = 60000;
  316. var msPerHour = 3600000;
  317. var date_1899_end = -2208988800001;
  318. var date_1900_start = -2208988800000;
  319. var date_1969_end = -1;
  320. var date_1970_start = 0;
  321. var date_1999_end = 946684799999;
  322. var date_2000_start = 946684800000;
  323. var date_2099_end = 4102444799999;
  324. var date_2100_start = 4102444800000;
  325. // Copyright 2009 the Sputnik authors. All rights reserved.
  326. // This code is governed by the BSD license found in the LICENSE file.
  327. //the following values are normally generated by the sputnik.py driver
  328. var $LocalTZ,
  329. $DST_start_month,
  330. $DST_start_sunday,
  331. $DST_start_hour,
  332. $DST_start_minutes,
  333. $DST_end_month,
  334. $DST_end_sunday,
  335. $DST_end_hour,
  336. $DST_end_minutes;
  337. (function () {
  338. /**
  339. * Finds the first date, starting from |start|, where |predicate|
  340. * holds.
  341. */
  342. var findNearestDateBefore = function (start, predicate) {
  343. var current = start;
  344. var month = 1000 * 60 * 60 * 24 * 30;
  345. for (var step = month; step > 0; step = Math.floor(step / 3)) {
  346. if (!predicate(current)) {
  347. while (!predicate(current))
  348. current = new Date(current.getTime() + step);
  349. current = new Date(current.getTime() - step);
  350. }
  351. }
  352. while (!predicate(current)) {
  353. current = new Date(current.getTime() + 1);
  354. }
  355. return current;
  356. };
  357. var juneDate = new Date(2000, 5, 20, 0, 0, 0, 0);
  358. var decemberDate = new Date(2000, 11, 20, 0, 0, 0, 0);
  359. var juneOffset = juneDate.getTimezoneOffset();
  360. var decemberOffset = decemberDate.getTimezoneOffset();
  361. var isSouthernHemisphere = (juneOffset > decemberOffset);
  362. var winterTime = isSouthernHemisphere ? juneDate : decemberDate;
  363. var summerTime = isSouthernHemisphere ? decemberDate : juneDate;
  364. var dstStart = findNearestDateBefore(winterTime, function (date) {
  365. return date.getTimezoneOffset() == summerTime.getTimezoneOffset();
  366. });
  367. $DST_start_month = dstStart.getMonth();
  368. $DST_start_sunday = dstStart.getDate() > 15 ? '"last"' : '"first"';
  369. $DST_start_hour = dstStart.getHours();
  370. $DST_start_minutes = dstStart.getMinutes();
  371. var dstEnd = findNearestDateBefore(summerTime, function (date) {
  372. return date.getTimezoneOffset() == winterTime.getTimezoneOffset();
  373. });
  374. $DST_end_month = dstEnd.getMonth();
  375. $DST_end_sunday = dstEnd.getDate() > 15 ? '"last"' : '"first"';
  376. $DST_end_hour = dstEnd.getHours();
  377. $DST_end_minutes = dstEnd.getMinutes();
  378. return;
  379. })();
  380. //Date.library.js
  381. // Copyright 2009 the Sputnik authors. All rights reserved.
  382. // This code is governed by the BSD license found in the LICENSE file.
  383. //15.9.1.2 Day Number and Time within Day
  384. function Day(t) {
  385. return Math.floor(t / msPerDay);
  386. }
  387. function TimeWithinDay(t) {
  388. return t % msPerDay;
  389. }
  390. //15.9.1.3 Year Number
  391. function DaysInYear(y) {
  392. if (y % 4 != 0) return 365;
  393. if (y % 4 == 0 && y % 100 != 0) return 366;
  394. if (y % 100 == 0 && y % 400 != 0) return 365;
  395. if (y % 400 == 0) return 366;
  396. }
  397. function DayFromYear(y) {
  398. return (365 * (y - 1970)
  399. + Math.floor((y - 1969) / 4)
  400. - Math.floor((y - 1901) / 100)
  401. + Math.floor((y - 1601) / 400));
  402. }
  403. function TimeFromYear(y) {
  404. return msPerDay * DayFromYear(y);
  405. }
  406. function YearFromTime(t) {
  407. t = Number(t);
  408. var sign = (t < 0) ? -1 : 1;
  409. var year = (sign < 0) ? 1969 : 1970;
  410. for (var time = 0; ; year += sign) {
  411. time = TimeFromYear(year);
  412. if (sign > 0 && time > t) {
  413. year -= sign;
  414. break;
  415. }
  416. else if (sign < 0 && time <= t) {
  417. break;
  418. }
  419. };
  420. return year;
  421. }
  422. function InLeapYear(t) {
  423. if (DaysInYear(YearFromTime(t)) == 365)
  424. return 0;
  425. if (DaysInYear(YearFromTime(t)) == 366)
  426. return 1;
  427. }
  428. function DayWithinYear(t) {
  429. return Day(t) - DayFromYear(YearFromTime(t));
  430. }
  431. //15.9.1.4 Month Number
  432. function MonthFromTime(t) {
  433. var day = DayWithinYear(t);
  434. var leap = InLeapYear(t);
  435. if ((0 <= day) && (day < 31)) return 0;
  436. if ((31 <= day) && (day < (59 + leap))) return 1;
  437. if (((59 + leap) <= day) && (day < (90 + leap))) return 2;
  438. if (((90 + leap) <= day) && (day < (120 + leap))) return 3;
  439. if (((120 + leap) <= day) && (day < (151 + leap))) return 4;
  440. if (((151 + leap) <= day) && (day < (181 + leap))) return 5;
  441. if (((181 + leap) <= day) && (day < (212 + leap))) return 6;
  442. if (((212 + leap) <= day) && (day < (243 + leap))) return 7;
  443. if (((243 + leap) <= day) && (day < (273 + leap))) return 8;
  444. if (((273 + leap) <= day) && (day < (304 + leap))) return 9;
  445. if (((304 + leap) <= day) && (day < (334 + leap))) return 10;
  446. if (((334 + leap) <= day) && (day < (365 + leap))) return 11;
  447. }
  448. //15.9.1.5 Date Number
  449. function DateFromTime(t) {
  450. var day = DayWithinYear(t);
  451. var month = MonthFromTime(t);
  452. var leap = InLeapYear(t);
  453. if (month == 0) return day + 1;
  454. if (month == 1) return day - 30;
  455. if (month == 2) return day - 58 - leap;
  456. if (month == 3) return day - 89 - leap;
  457. if (month == 4) return day - 119 - leap;
  458. if (month == 5) return day - 150 - leap;
  459. if (month == 6) return day - 180 - leap;
  460. if (month == 7) return day - 211 - leap;
  461. if (month == 8) return day - 242 - leap;
  462. if (month == 9) return day - 272 - leap;
  463. if (month == 10) return day - 303 - leap;
  464. if (month == 11) return day - 333 - leap;
  465. }
  466. //15.9.1.6 Week Day
  467. function WeekDay(t) {
  468. var weekday = (Day(t) + 4) % 7;
  469. return (weekday < 0 ? 7 + weekday : weekday);
  470. }
  471. //15.9.1.9 Daylight Saving Time Adjustment
  472. $LocalTZ = (new Date()).getTimezoneOffset() / -60;
  473. if (DaylightSavingTA((new Date()).valueOf()) !== 0) {
  474. $LocalTZ -= 1;
  475. }
  476. var LocalTZA = $LocalTZ * msPerHour;
  477. function DaysInMonth(m, leap) {
  478. m = m % 12;
  479. //April, June, Sept, Nov
  480. if (m == 3 || m == 5 || m == 8 || m == 10) {
  481. return 30;
  482. }
  483. //Jan, March, May, July, Aug, Oct, Dec
  484. if (m == 0 || m == 2 || m == 4 || m == 6 || m == 7 || m == 9 || m == 11) {
  485. return 31;
  486. }
  487. //Feb
  488. return 28 + leap;
  489. }
  490. function GetSundayInMonth(t, m, count) {
  491. var year = YearFromTime(t);
  492. var tempDate;
  493. if (count === '"first"') {
  494. for (var d = 1; d <= DaysInMonth(m, InLeapYear(t)) ; d++) {
  495. tempDate = new Date(year, m, d);
  496. if (tempDate.getDay() === 0) {
  497. return tempDate.valueOf();
  498. }
  499. }
  500. } else if (count === '"last"') {
  501. for (var d = DaysInMonth(m, InLeapYear(t)) ; d > 0; d--) {
  502. tempDate = new Date(year, m, d);
  503. if (tempDate.getDay() === 0) {
  504. return tempDate.valueOf();
  505. }
  506. }
  507. }
  508. throw new Error("Unsupported 'count' arg:" + count);
  509. }
  510. /*
  511. function GetSundayInMonth(t, m, count){
  512. var year = YearFromTime(t);
  513. var leap = InLeapYear(t);
  514. var day = 0;
  515. if(m >= 1) day += DaysInMonth(0, leap);
  516. if(m >= 2) day += DaysInMonth(1, leap);
  517. if(m >= 3) day += DaysInMonth(2, leap);
  518. if(m >= 4) day += DaysInMonth(3, leap);
  519. if(m >= 5) day += DaysInMonth(4, leap);
  520. if(m >= 6) day += DaysInMonth(5, leap);
  521. if(m >= 7) day += DaysInMonth(6, leap);
  522. if(m >= 8) day += DaysInMonth(7, leap);
  523. if(m >= 9) day += DaysInMonth(8, leap);
  524. if(m >= 10) day += DaysInMonth(9, leap);
  525. if(m >= 11) day += DaysInMonth(10, leap);
  526. var month_start = TimeFromYear(year)+day*msPerDay;
  527. var sunday = 0;
  528. if(count === "last"){
  529. for(var last_sunday = month_start+DaysInMonth(m, leap)*msPerDay;
  530. WeekDay(last_sunday)>0;
  531. last_sunday -= msPerDay
  532. ){};
  533. sunday = last_sunday;
  534. }
  535. else {
  536. for(var first_sunday = month_start;
  537. WeekDay(first_sunday)>0;
  538. first_sunday += msPerDay
  539. ){};
  540. sunday = first_sunday+7*msPerDay*(count-1);
  541. }
  542. return sunday;
  543. }*/
  544. function DaylightSavingTA(t) {
  545. // t = t-LocalTZA;
  546. var DST_start = GetSundayInMonth(t, $DST_start_month, $DST_start_sunday) +
  547. $DST_start_hour * msPerHour +
  548. $DST_start_minutes * msPerMinute;
  549. var k = new Date(DST_start);
  550. var DST_end = GetSundayInMonth(t, $DST_end_month, $DST_end_sunday) +
  551. $DST_end_hour * msPerHour +
  552. $DST_end_minutes * msPerMinute;
  553. if (t >= DST_start && t < DST_end) {
  554. return msPerHour;
  555. } else {
  556. return 0;
  557. }
  558. }
  559. //15.9.1.9 Local Time
  560. function LocalTime(t) {
  561. return t + LocalTZA + DaylightSavingTA(t);
  562. }
  563. function UTC(t) {
  564. return t - LocalTZA - DaylightSavingTA(t - LocalTZA);
  565. }
  566. //15.9.1.10 Hours, Minutes, Second, and Milliseconds
  567. function HourFromTime(t) {
  568. return Math.floor(t / msPerHour) % HoursPerDay;
  569. }
  570. function MinFromTime(t) {
  571. return Math.floor(t / msPerMinute) % MinutesPerHour;
  572. }
  573. function SecFromTime(t) {
  574. return Math.floor(t / msPerSecond) % SecondsPerMinute;
  575. }
  576. function msFromTime(t) {
  577. return t % msPerSecond;
  578. }
  579. //15.9.1.11 MakeTime (hour, min, sec, ms)
  580. function MakeTime(hour, min, sec, ms) {
  581. if (!isFinite(hour) || !isFinite(min) || !isFinite(sec) || !isFinite(ms)) {
  582. return Number.NaN;
  583. }
  584. hour = ToInteger(hour);
  585. min = ToInteger(min);
  586. sec = ToInteger(sec);
  587. ms = ToInteger(ms);
  588. return ((hour * msPerHour) + (min * msPerMinute) + (sec * msPerSecond) + ms);
  589. }
  590. //15.9.1.12 MakeDay (year, month, date)
  591. function MakeDay(year, month, date) {
  592. if (!isFinite(year) || !isFinite(month) || !isFinite(date)) {
  593. return Number.NaN;
  594. }
  595. year = ToInteger(year);
  596. month = ToInteger(month);
  597. date = ToInteger(date);
  598. var result5 = year + Math.floor(month / 12);
  599. var result6 = month % 12;
  600. var sign = (year < 1970) ? -1 : 1;
  601. var t = (year < 1970) ? 1 : 0;
  602. var y = (year < 1970) ? 1969 : 1970;
  603. if (sign == -1) {
  604. for (y = 1969; y >= year; y += sign) {
  605. t += sign * DaysInYear(y) * msPerDay;
  606. }
  607. } else {
  608. for (y = 1970 ; y < year; y += sign) {
  609. t += sign * DaysInYear(y) * msPerDay;
  610. }
  611. }
  612. var leap = 0;
  613. for (var m = 0; m < month; m++) {
  614. //if year is changed, than we need to recalculate leep
  615. leap = InLeapYear(t);
  616. t += DaysInMonth(m, leap) * msPerDay;
  617. }
  618. if (YearFromTime(t) != result5) {
  619. return Number.NaN;
  620. }
  621. if (MonthFromTime(t) != result6) {
  622. return Number.NaN;
  623. }
  624. if (DateFromTime(t) != 1) {
  625. return Number.NaN;
  626. }
  627. return Day(t) + date - 1;
  628. }
  629. //15.9.1.13 MakeDate (day, time)
  630. function MakeDate(day, time) {
  631. if (!isFinite(day) || !isFinite(time)) {
  632. return Number.NaN;
  633. }
  634. return day * msPerDay + time;
  635. }
  636. //15.9.1.14 TimeClip (time)
  637. function TimeClip(time) {
  638. if (!isFinite(time) || Math.abs(time) > 8.64e15) {
  639. return Number.NaN;
  640. }
  641. return ToInteger(time);
  642. }
  643. //Test Functions
  644. //ConstructDate is considered deprecated, and should not be used directly from
  645. //test262 tests as it's incredibly sensitive to DST start/end dates that
  646. //vary with geographic location.
  647. function ConstructDate(year, month, date, hours, minutes, seconds, ms) {
  648. /*
  649. * 1. Call ToNumber(year)
  650. * 2. Call ToNumber(month)
  651. * 3. If date is supplied use ToNumber(date); else use 1
  652. * 4. If hours is supplied use ToNumber(hours); else use 0
  653. * 5. If minutes is supplied use ToNumber(minutes); else use 0
  654. * 6. If seconds is supplied use ToNumber(seconds); else use 0
  655. * 7. If ms is supplied use ToNumber(ms); else use 0
  656. * 8. If Result(1) is not NaN and 0 <= ToInteger(Result(1)) <= 99, Result(8) is
  657. * 1900+ToInteger(Result(1)); otherwise, Result(8) is Result(1)
  658. * 9. Compute MakeDay(Result(8), Result(2), Result(3))
  659. * 10. Compute MakeTime(Result(4), Result(5), Result(6), Result(7))
  660. * 11. Compute MakeDate(Result(9), Result(10))
  661. * 12. Set the [[Value]] property of the newly constructed object to TimeClip(UTC(Result(11)))
  662. */
  663. var r1 = Number(year);
  664. var r2 = Number(month);
  665. var r3 = ((date && arguments.length > 2) ? Number(date) : 1);
  666. var r4 = ((hours && arguments.length > 3) ? Number(hours) : 0);
  667. var r5 = ((minutes && arguments.length > 4) ? Number(minutes) : 0);
  668. var r6 = ((seconds && arguments.length > 5) ? Number(seconds) : 0);
  669. var r7 = ((ms && arguments.length > 6) ? Number(ms) : 0);
  670. var r8 = r1;
  671. if (!isNaN(r1) && (0 <= ToInteger(r1)) && (ToInteger(r1) <= 99))
  672. r8 = 1900 + r1;
  673. var r9 = MakeDay(r8, r2, r3);
  674. var r10 = MakeTime(r4, r5, r6, r7);
  675. var r11 = MakeDate(r9, r10);
  676. var retVal = TimeClip(UTC(r11));
  677. return retVal;
  678. }
  679. /**** Python code for initialize the above constants
  680. // We may want to replicate the following in JavaScript.
  681. // However, using JS date operations to generate parameters that are then used to
  682. // test those some date operations seems unsound. However, it isn't clear if there
  683. //is a good interoperable alternative.
  684. # Copyright 2009 the Sputnik authors. All rights reserved.
  685. # This code is governed by the BSD license found in the LICENSE file.
  686. def GetDaylightSavingsTimes():
  687. # Is the given floating-point time in DST?
  688. def IsDst(t):
  689. return time.localtime(t)[-1]
  690. # Binary search to find an interval between the two times no greater than
  691. # delta where DST switches, returning the midpoint.
  692. def FindBetween(start, end, delta):
  693. while end - start > delta:
  694. middle = (end + start) / 2
  695. if IsDst(middle) == IsDst(start):
  696. start = middle
  697. else:
  698. end = middle
  699. return (start + end) / 2
  700. now = time.time()
  701. one_month = (30 * 24 * 60 * 60)
  702. # First find a date with different daylight savings. To avoid corner cases
  703. # we try four months before and after today.
  704. after = now + 4 * one_month
  705. before = now - 4 * one_month
  706. if IsDst(now) == IsDst(before) and IsDst(now) == IsDst(after):
  707. logger.warning("Was unable to determine DST info.")
  708. return None
  709. # Determine when the change occurs between now and the date we just found
  710. # in a different DST.
  711. if IsDst(now) != IsDst(before):
  712. first = FindBetween(before, now, 1)
  713. else:
  714. first = FindBetween(now, after, 1)
  715. # Determine when the change occurs between three and nine months from the
  716. # first.
  717. second = FindBetween(first + 3 * one_month, first + 9 * one_month, 1)
  718. # Find out which switch is into and which if out of DST
  719. if IsDst(first - 1) and not IsDst(first + 1):
  720. start = second
  721. end = first
  722. else:
  723. start = first
  724. end = second
  725. return (start, end)
  726. def GetDaylightSavingsAttribs():
  727. times = GetDaylightSavingsTimes()
  728. if not times:
  729. return None
  730. (start, end) = times
  731. def DstMonth(t):
  732. return time.localtime(t)[1] - 1
  733. def DstHour(t):
  734. return time.localtime(t - 1)[3] + 1
  735. def DstSunday(t):
  736. if time.localtime(t)[2] > 15:
  737. return "'last'"
  738. else:
  739. return "'first'"
  740. def DstMinutes(t):
  741. return (time.localtime(t - 1)[4] + 1) % 60
  742. attribs = { }
  743. attribs['start_month'] = DstMonth(start)
  744. attribs['end_month'] = DstMonth(end)
  745. attribs['start_sunday'] = DstSunday(start)
  746. attribs['end_sunday'] = DstSunday(end)
  747. attribs['start_hour'] = DstHour(start)
  748. attribs['end_hour'] = DstHour(end)
  749. attribs['start_minutes'] = DstMinutes(start)
  750. attribs['end_minutes'] = DstMinutes(end)
  751. return attribs
  752. *********/
  753. //--Test case registration-----------------------------------------------------
  754. function runTestCase(testcase) {
  755. if (testcase() !== true) {
  756. $ERROR("Test case returned non-true value!");
  757. }
  758. }