tor-browser

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

15.4.4.5-1.js (6680B)


      1 /* -*- tab-width: 2; 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   File Name:          15.4.4.5.js
      9   ECMA Section:       Array.prototype.sort(comparefn)
     10   Description:
     11 
     12   This test file tests cases in which the compare function is not supplied.
     13 
     14   The elements of this array are sorted. The sort is not necessarily stable.
     15   If comparefn is provided, it should be a function that accepts two arguments
     16   x and y and returns a negative value if x < y, zero if x = y, or a positive
     17   value if x > y.
     18 
     19   1.   Call the [[Get]] method of this object with argument "length".
     20   2.   Call ToUint32(Result(1)).
     21   1.  Perform an implementation-dependent sequence of calls to the
     22   [[Get]] , [[Put]], and [[Delete]] methods of this object and
     23   toSortCompare (described below), where the first argument for each call
     24   to [[Get]], [[Put]] , or [[Delete]] is a nonnegative integer less
     25   than Result(2) and where the arguments for calls to SortCompare are
     26   results of previous calls to the [[Get]] method. After this sequence
     27   is complete, this object must have the following two properties.
     28   (1) There must be some mathematical permutation of the nonnegative
     29   integers less than Result(2), such that for every nonnegative integer
     30   j less than Result(2), if property old[j] existed, then new[(j)] is
     31   exactly the same value as old[j],. but if property old[j] did not exist,
     32   then new[(j)] either does not exist or exists with value undefined.
     33   (2) If comparefn is not supplied or is a consistent comparison
     34   function for the elements of this array, then for all nonnegative
     35   integers j and k, each less than Result(2), if old[j] compares less
     36   than old[k] (see SortCompare below), then (j) < (k). Here we use the
     37   notation old[j] to refer to the hypothetical result of calling the [
     38   [Get]] method of this object with argument j before this step is
     39   executed, and the notation new[j] to refer to the hypothetical result
     40   of calling the [[Get]] method of this object with argument j after this
     41   step has been completely executed. A function is a consistent
     42   comparison function for a set of values if (a) for any two of those
     43   values (possibly the same value) considered as an ordered pair, it
     44   always returns the same value when given that pair of values as its
     45   two arguments, and the result of applying ToNumber to this value is
     46   not NaN; (b) when considered as a relation, where the pair (x, y) is
     47   considered to be in the relation if and only if applying the function
     48   to x and y and then applying ToNumber to the result produces a
     49   negative value, this relation is a partial order; and (c) when
     50   considered as a different relation, where the pair (x, y) is considered
     51   to be in the relation if and only if applying the function to x and y
     52   and then applying ToNumber to the result produces a zero value (of either
     53   sign), this relation is an equivalence relation. In this context, the
     54   phrase "x compares less than y" means applying Result(2) to x and y and
     55   then applying ToNumber to the result produces a negative value.
     56   3.Return this object.
     57 
     58   When the SortCompare operator is called with two arguments x and y, the following steps are taken:
     59   1.If x and y are both undefined, return +0.
     60   2.If x is undefined, return 1.
     61   3.If y is undefined, return 1.
     62   4.If the argument comparefn was not provided in the call to sort, go to step 7.
     63   5.Call comparefn with arguments x and y.
     64   6.Return Result(5).
     65   7.Call ToString(x).
     66   8.Call ToString(y).
     67   9.If Result(7) < Result(8), return 1.
     68   10.If Result(7) > Result(8), return 1.
     69   11.Return +0.
     70 
     71   Note that, because undefined always compared greater than any other value, undefined and nonexistent
     72   property values always sort to the end of the result. It is implementation-dependent whether or not such
     73   properties will exist or not at the end of the array when the sort is concluded.
     74 
     75   Note that the sort function is intentionally generic; it does not require that its this value be an Array object.
     76   Therefore it can be transferred to other kinds of objects for use as a method. Whether the sort function can be
     77   applied successfully to a host object is implementation dependent .
     78 
     79   Author:             christine@netscape.com
     80   Date:               12 november 1997
     81 */
     82 
     83 
     84 var SECTION = "15.4.4.5-1";
     85 var TITLE   = "Array.prototype.sort(comparefn)";
     86 
     87 writeHeaderToLog( SECTION + " "+ TITLE);
     88 var S = new Array();
     89 var item = 0;
     90 
     91 // array is empty.
     92 S[item++] = "var A = new Array()";
     93 
     94 // array contains one item
     95 S[item++] = "var A = new Array( true )";
     96 
     97 // length of array is 2
     98 S[item++] = "var A = new Array( true, false, new Boolean(true), new Boolean(false), 'true', 'false' )";
     99 
    100 S[item++] = "var A = new Array(); A[3] = 'undefined'; A[6] = null; A[8] = 'null'; A[0] = void 0";
    101 
    102 S[item] = "var A = new Array( ";
    103 
    104 var limit = 0x0061;
    105 for ( var i = 0x007A; i >= limit; i-- ) {
    106  S[item] += "\'"+ String.fromCharCode(i) +"\'" ;
    107  if ( i > limit ) {
    108    S[item] += ",";
    109  }
    110 }
    111 
    112 S[item] += ")";
    113 
    114 item++;
    115 
    116 for ( var i = 0; i < S.length; i++ ) {
    117  CheckItems( S[i] );
    118 }
    119 
    120 test();
    121 
    122 function CheckItems( S ) {
    123  eval( S );
    124  var E = Sort( A );
    125 
    126  new TestCase(
    127 	  S +";  A.sort(); A.length",
    128 	  E.length,
    129 	  eval( S + "; A.sort(); A.length") );
    130 
    131  for ( var i = 0; i < E.length; i++ ) {
    132    new TestCase(
    133      "A["+i+ "].toString()",
    134      E[i] +"",
    135      A[i] +"");
    136 
    137    if ( A[i] == void 0 && typeof A[i] == "undefined" ) {
    138      new TestCase(
    139 "typeof A["+i+ "]",
    140 typeof E[i],
    141 typeof A[i] );
    142    }
    143  }
    144 }
    145 function Object_1( value ) {
    146  this.array = value.split(",");
    147  this.length = this.array.length;
    148  for ( var i = 0; i < this.length; i++ ) {
    149    this[i] = eval(this.array[i]);
    150  }
    151  this.sort = Array.prototype.sort;
    152  this.getClass = Object.prototype.toString;
    153 }
    154 function Sort( a ) {
    155  for ( i = 0; i < a.length; i++ ) {
    156    for ( j = i+1; j < a.length; j++ ) {
    157      var lo = a[i];
    158      var hi = a[j];
    159      var c = Compare( lo, hi );
    160      if ( c == 1 ) {
    161 a[i] = hi;
    162 a[j] = lo;
    163      }
    164    }
    165  }
    166  return a;
    167 }
    168 function Compare( x, y ) {
    169  if ( x == void 0 && y == void 0  && typeof x == "undefined" && typeof y == "undefined" ) {
    170    return +0;
    171  }
    172  if ( x == void 0  && typeof x == "undefined" ) {
    173    return 1;
    174  }
    175  if ( y == void 0 && typeof y == "undefined" ) {
    176    return -1;
    177  }
    178  x = String(x);
    179  y = String(y);
    180  if ( x < y ) {
    181    return -1;
    182  }
    183  if ( x > y ) {
    184    return 1;
    185  }
    186  return 0;
    187 }