js/src/tests/ecma_5/Date/toJSON-01.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 // Any copyright is dedicated to the Public Domain.
     2 // http://creativecommons.org/licenses/publicdomain/
     4 var gTestfile = 'toJSON-01.js';
     5 //-----------------------------------------------------------------------------
     6 var BUGNUMBER = 584811;
     7 var summary = "Date.prototype.toJSON isn't to spec";
     9 print(BUGNUMBER + ": " + summary);
    11 /**************
    12  * BEGIN TEST *
    13  **************/
    15 var called;
    17 var dateToJSON = Date.prototype.toJSON;
    18 assertEq(Date.prototype.hasOwnProperty("toJSON"), true);
    19 assertEq(typeof dateToJSON, "function");
    21 // brief test to exercise this outside of isolation, just for sanity
    22 var invalidDate = new Date();
    23 invalidDate.setTime(NaN);
    24 assertEq(JSON.stringify({ p: invalidDate }), '{"p":null}');
    27 /* 15.9.5.44 Date.prototype.toJSON ( key ) */
    28 assertEq(dateToJSON.length, 1);
    30 /*
    31  * 1. Let O be the result of calling ToObject, giving it the this value as its
    32  *    argument.
    33  */
    34 try
    35 {
    36   dateToJSON.call(null);
    37   throw new Error("should have thrown a TypeError");
    38 }
    39 catch (e)
    40 {
    41   assertEq(e instanceof TypeError, true,
    42            "ToObject throws TypeError for null/undefined");
    43 }
    45 try
    46 {
    47   dateToJSON.call(undefined);
    48   throw new Error("should have thrown a TypeError");
    49 }
    50 catch (e)
    51 {
    52   assertEq(e instanceof TypeError, true,
    53            "ToObject throws TypeError for null/undefined");
    54 }
    57 /*
    58  * 2. Let tv be ToPrimitive(O, hint Number).
    59  * ...expands to:
    60  *    1. Let valueOf be the result of calling the [[Get]] internal method of object O with argument "valueOf".
    61  *    2. If IsCallable(valueOf) is true then,
    62  *       a. Let val be the result of calling the [[Call]] internal method of valueOf, with O as the this value and
    63  *                an empty argument list.
    64  *       b. If val is a primitive value, return val.
    65  *    3. Let toString be the result of calling the [[Get]] internal method of object O with argument "toString".
    66  *    4. If IsCallable(toString) is true then,
    67  *       a. Let str be the result of calling the [[Call]] internal method of toString, with O as the this value and
    68  *               an empty argument list.
    69  *       b. If str is a primitive value, return str.
    70  *    5. Throw a TypeError exception.
    71  */
    72 try
    73 {
    74   var r = dateToJSON.call({ get valueOf() { throw 17; } });
    75   throw new Error("didn't throw, returned: " + r);
    76 }
    77 catch (e)
    78 {
    79   assertEq(e, 17, "bad exception: " + e);
    80 }
    82 called = false;
    83 assertEq(dateToJSON.call({ valueOf: null,
    84                            toString: function() { called = true; return 12; },
    85                            toISOString: function() { return "ohai"; } }),
    86          "ohai");
    87 assertEq(called, true);
    89 called = false;
    90 assertEq(dateToJSON.call({ valueOf: function() { called = true; return 42; },
    91                            toISOString: function() { return null; } }),
    92          null);
    93 assertEq(called, true);
    95 try
    96 {
    97   called = false;
    98   dateToJSON.call({ valueOf: function() { called = true; return {}; },
    99                     get toString() { throw 42; } });
   100 }
   101 catch (e)
   102 {
   103   assertEq(called, true);
   104   assertEq(e, 42, "bad exception: " + e);
   105 }
   107 called = false;
   108 assertEq(dateToJSON.call({ valueOf: function() { called = true; return {}; },
   109                            get toString() { return function() { return 8675309; }; },
   110                            toISOString: function() { return true; } }),
   111          true);
   112 assertEq(called, true);
   114 var asserted = false;
   115 called = false;
   116 assertEq(dateToJSON.call({ valueOf: function() { called = true; return {}; },
   117                            get toString()
   118                            {
   119                              assertEq(called, true);
   120                              asserted = true;
   121                              return function() { return 8675309; };
   122                            },
   123                            toISOString: function() { return NaN; } }),
   124          NaN);
   125 assertEq(asserted, true);
   127 try
   128 {
   129   var r = dateToJSON.call({ valueOf: null, toString: null,
   130                             get toISOString()
   131                             {
   132                               throw new Error("shouldn't have been gotten");
   133                             } });
   134   throw new Error("didn't throw, returned: " + r);
   135 }
   136 catch (e)
   137 {
   138   assertEq(e instanceof TypeError, true, "bad exception: " + e);
   139 }
   142 /* 3. If tv is a Number and is not finite, return null. */
   143 assertEq(dateToJSON.call({ valueOf: function() { return Infinity; } }), null);
   144 assertEq(dateToJSON.call({ valueOf: function() { return -Infinity; } }), null);
   145 assertEq(dateToJSON.call({ valueOf: function() { return NaN; } }), null);
   147 assertEq(dateToJSON.call({ valueOf: function() { return Infinity; },
   148                            toISOString: function() { return {}; } }), null);
   149 assertEq(dateToJSON.call({ valueOf: function() { return -Infinity; },
   150                            toISOString: function() { return []; } }), null);
   151 assertEq(dateToJSON.call({ valueOf: function() { return NaN; },
   152                            toISOString: function() { return undefined; } }), null);
   155 /*
   156  * 4. Let toISO be the result of calling the [[Get]] internal method of O with
   157  *    argument "toISOString".
   158  */
   159 try
   160 {
   161   var r = dateToJSON.call({ get toISOString() { throw 42; } });
   162   throw new Error("didn't throw, returned: " + r);
   163 }
   164 catch (e)
   165 {
   166   assertEq(e, 42, "bad exception: " + e);
   167 }
   170 /* 5. If IsCallable(toISO) is false, throw a TypeError exception. */
   171 try
   172 {
   173   var r = dateToJSON.call({ toISOString: null });
   174   throw new Error("didn't throw, returned: " + r);
   175 }
   176 catch (e)
   177 {
   178   assertEq(e instanceof TypeError, true, "bad exception: " + e);
   179 }
   181 try
   182 {
   183   var r = dateToJSON.call({ toISOString: undefined });
   184   throw new Error("didn't throw, returned: " + r);
   185 }
   186 catch (e)
   187 {
   188   assertEq(e instanceof TypeError, true, "bad exception: " + e);
   189 }
   191 try
   192 {
   193   var r = dateToJSON.call({ toISOString: "oogabooga" });
   194   throw new Error("didn't throw, returned: " + r);
   195 }
   196 catch (e)
   197 {
   198   assertEq(e instanceof TypeError, true, "bad exception: " + e);
   199 }
   201 try
   202 {
   203   var r = dateToJSON.call({ toISOString: Math.PI });
   204   throw new Error("didn't throw, returned: " + r);
   205 }
   206 catch (e)
   207 {
   208   assertEq(e instanceof TypeError, true, "bad exception: " + e);
   209 }
   212 /*
   213  * 6. Return the result of calling the [[Call]] internal method of toISO with O
   214  *    as the this value and an empty argument list.
   215  */
   216 var o =
   217   {
   218     toISOString: function(a)
   219     {
   220       called = true;
   221       assertEq(this, o);
   222       assertEq(a, undefined);
   223       assertEq(arguments.length, 0);
   224       return obj;
   225     }
   226   };
   227 var obj = {};
   228 called = false;
   229 assertEq(dateToJSON.call(o), obj, "should have gotten obj back");
   230 assertEq(called, true);
   233 /******************************************************************************/
   235 if (typeof reportCompare === "function")
   236   reportCompare(true, true);
   238 print("All tests passed!");

mercurial