tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

errstack-001.js (5112B)


      1 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 /*
      7 *
      8 * Date:    28 Feb 2002
      9 * SUMMARY: Testing that Error.stack distinguishes between:
     10 *
     11 * A) top-level calls: myFunc();
     12 * B) no-name function calls: function() { myFunc();} ()
     13 *
     14 * The stack frame for A) should begin with '@'
     15 * The stack frame for B) should begin with '()'
     16 *
     17 * This behavior was coded by Brendan during his fix for bug 127136.
     18 * See http://bugzilla.mozilla.org/show_bug.cgi?id=127136#c13
     19 *
     20 * Note: our function getStackFrames(err) orders the array of stack frames
     21 * so that the 0th element will correspond to the highest frame, i.e. will
     22 * correspond to a line in top-level code. The 1st element will correspond
     23 * to the function that is called first, and so on...
     24 *
     25 * NOTE: At present Rhino does not have an Error.stack property. It is an
     26 * ECMA extension, see http://bugzilla.mozilla.org/show_bug.cgi?id=123177
     27 */
     28 //-----------------------------------------------------------------------------
     29 var UBound = 0;
     30 var BUGNUMBER = '(none)';
     31 var summary = 'Testing Error.stack';
     32 var status = '';
     33 var statusitems = [];
     34 var actual = '';
     35 var actualvalues = [];
     36 var expect= '';
     37 var expectedvalues = [];
     38 var myErr = '';
     39 var stackFrames = '';
     40 
     41 
     42 function A(x,y)
     43 {
     44  return B(x+1,y+1);
     45 }
     46 
     47 function B(x,z)
     48 {
     49  return C(x+1,z+1);
     50 }
     51 
     52 function C(x,y)
     53 {
     54  return D(x+1,y+1);
     55 }
     56 
     57 function D(x,z)
     58 {
     59  try
     60  {
     61    throw new Error('meep!');
     62  }
     63  catch (e)
     64  {
     65    return e;
     66  }
     67 }
     68 
     69 
     70 myErr = A(44,13);
     71 stackFrames = getStackFrames(myErr);
     72 status = inSection(1);
     73 actual = stackFrames[0].substring(0,1);
     74 expect = '@';
     75 addThis();
     76 
     77 status = inSection(2);
     78 actual = stackFrames[1].substring(0,2);
     79 expect = 'A@';
     80 addThis();
     81 
     82 status = inSection(3);
     83 actual = stackFrames[2].substring(0,2);
     84 expect = 'B@';
     85 addThis();
     86 
     87 status = inSection(4);
     88 actual = stackFrames[3].substring(0,2);
     89 expect = 'C@';
     90 addThis();
     91 
     92 status = inSection(5);
     93 actual = stackFrames[4].substring(0,2);
     94 expect = 'D@';
     95 addThis();
     96 
     97 
     98 
     99 myErr = A('44:foo','13:bar');
    100 stackFrames = getStackFrames(myErr);
    101 status = inSection(6);
    102 actual = stackFrames[0].substring(0,1);
    103 expect = '@';
    104 addThis();
    105 
    106 status = inSection(7);
    107 actual = stackFrames[1].substring(0,2);
    108 expect = 'A@';
    109 addThis();
    110 
    111 status = inSection(8);
    112 actual = stackFrames[2].substring(0,2);
    113 expect = 'B@';
    114 addThis();
    115 
    116 status = inSection(9);
    117 actual = stackFrames[3].substring(0,2);
    118 expect = 'C@';
    119 addThis();
    120 
    121 status = inSection(10);
    122 actual = stackFrames[4].substring(0,2);
    123 expect = 'D@';;
    124 addThis();
    125 
    126 
    127 
    128 /*
    129 * Make the first frame occur in a function with an empty name -
    130 */
    131 myErr = function() { return A(44,13); } ();
    132 stackFrames = getStackFrames(myErr);
    133 status = inSection(11);
    134 actual = stackFrames[0].substring(0,1);
    135 expect = '@';
    136 addThis();
    137 
    138 status = inSection(12);
    139 actual = stackFrames[1].substring(0,7);
    140 expect = 'myErr<@';
    141 addThis();
    142 
    143 status = inSection(13);
    144 actual = stackFrames[2].substring(0,2);
    145 expect = 'A@';
    146 addThis();
    147 
    148 // etc. for the rest of the frames as above
    149 
    150 
    151 
    152 /*
    153 * Make the first frame occur in a function with name 'anonymous' -
    154 */
    155 var f = Function('return A(44,13);');
    156 myErr = f();
    157 stackFrames = getStackFrames(myErr);
    158 status = inSection(14);
    159 actual = stackFrames[0].substring(0,1);
    160 expect = '@';
    161 addThis();
    162 
    163 status = inSection(15);
    164 actual = stackFrames[1].substring(0,10);
    165 expect = 'anonymous@';
    166 addThis();
    167 
    168 status = inSection(16);
    169 actual = stackFrames[2].substring(0,2);
    170 expect = 'A@';
    171 addThis();
    172 
    173 // etc. for the rest of the frames as above
    174 
    175 
    176 
    177 /*
    178 * Make a user-defined error via the Error() function -
    179 */
    180 var message = 'Hi there!'; var fileName = 'file name'; var lineNumber = 0;
    181 myErr = Error(message, fileName, lineNumber);
    182 stackFrames = getStackFrames(myErr);
    183 status = inSection(17);
    184 actual = stackFrames[0].substring(0,1);
    185 expect = '@';
    186 addThis();
    187 
    188 
    189 /*
    190 * Now use the |new| keyword. Re-use the same params -
    191 */
    192 myErr = new Error(message, fileName, lineNumber);
    193 stackFrames = getStackFrames(myErr);
    194 status = inSection(18);
    195 actual = stackFrames[0].substring(0,1);
    196 expect = '@';
    197 addThis();
    198 
    199 
    200 
    201 
    202 //-----------------------------------------------------------------------------
    203 test();
    204 //-----------------------------------------------------------------------------
    205 
    206 
    207 
    208 /*
    209 * Split the string |err.stack| along its '\n' delimiter.
    210 * As of 2002-02-28 |err.stack| ends with the delimiter, so
    211 * the resulting array has an empty string as its last element.
    212 *
    213 * Pop that useless element off before doing anything.
    214 * Then reverse the array, for convenience of indexing -
    215 */
    216 function getStackFrames(err)
    217 {
    218  var arr = err.stack.split('\n');
    219  arr.pop();
    220  return arr.reverse();
    221 }
    222 
    223 
    224 function addThis()
    225 {
    226  statusitems[UBound] = status;
    227  actualvalues[UBound] = actual;
    228  expectedvalues[UBound] = expect;
    229  UBound++;
    230 }
    231 
    232 
    233 function test()
    234 {
    235  printBugNumber(BUGNUMBER);
    236  printStatus(summary);
    237 
    238  for (var i=0; i<UBound; i++)
    239  {
    240    reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
    241  }
    242 }