Home | History | Annotate | Download | only in webkit
      1 // Copyright 2013 the V8 project authors. All rights reserved.
      2 // Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions
      6 // are met:
      7 // 1.  Redistributions of source code must retain the above copyright
      8 //     notice, this list of conditions and the following disclaimer.
      9 // 2.  Redistributions in binary form must reproduce the above copyright
     10 //     notice, this list of conditions and the following disclaimer in the
     11 //     documentation and/or other materials provided with the distribution.
     12 //
     13 // THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
     14 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     15 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     16 // DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     17 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     18 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     19 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     20 // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     21 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     22 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     23 
     24 description(
     25 "This test checks the behavior of the reduce() method on a number of objects."
     26 );
     27 
     28 function toObject(array) {
     29     var o = {};
     30     for (var i in array)
     31         o[i] = array[i];
     32     o.length = array.length;
     33     o.reduce = Array.prototype.reduce;
     34     return o;
     35 }
     36 function toUnorderedObject(array) {
     37     var o = {};
     38     var props = [];
     39     for (var i in array)
     40         props.push(i);
     41     for (var i = props.length - 1; i >= 0; i--)
     42         o[props[i]] = array[props[i]];
     43     o.length = array.length;
     44     o.reduce = Array.prototype.reduce;
     45     return o;
     46 }
     47 
     48 shouldBe("[0,1,2,3].reduce(function(a,b){ return a + b; })", "6");
     49 shouldBe("[1,2,3].reduce(function(a,b){ return a + b; })", "6");
     50 shouldBe("[0,1,2,3].reduce(function(a,b){ return a + b; }, 4)", "10");
     51 shouldBe("[1,2,3].reduce(function(a,b){ return a + b; }, 4)", "10");
     52 shouldBe("toObject([0,1,2,3]).reduce(function(a,b){ return a + b; })", "6");
     53 shouldBe("toObject([1,2,3]).reduce(function(a,b){ return a + b; })", "6");
     54 shouldBe("toObject([0,1,2,3]).reduce(function(a,b){ return a + b; }, 4)", "10");
     55 shouldBe("toObject([1,2,3]).reduce(function(a,b){ return a + b; }, 4)", "10");
     56 shouldBe("toUnorderedObject([0,1,2,3]).reduce(function(a,b){ return a + b; })", "6");
     57 shouldBe("toUnorderedObject([1,2,3]).reduce(function(a,b){ return a + b; })", "6");
     58 shouldBe("toUnorderedObject([0,1,2,3]).reduce(function(a,b){ return a + b; }, 4)", "10");
     59 shouldBe("toUnorderedObject([1,2,3]).reduce(function(a,b){ return a + b; }, 4)", "10");
     60 sparseArray = [];
     61 sparseArray[10] = 10;
     62 shouldBe("sparseArray.reduce(function(a,b){ return a + b; }, 0)", "10");
     63 shouldBe("toObject(sparseArray).reduce(function(a,b){ return a + b; }, 0)", "10");
     64 var callCount = 0;
     65 shouldBe("sparseArray.reduce(function(a,b){ callCount++; }); callCount", "0");
     66 callCount = 0;
     67 shouldBe("toObject(sparseArray).reduce(function(a,b){ callCount++; }); callCount", "0");
     68 var callCount = 0;
     69 shouldBe("sparseArray.reduce(function(a,b){ callCount++; }, 0); callCount", "1");
     70 callCount = 0;
     71 shouldBe("toObject(sparseArray).reduce(function(a,b){ callCount++; }, 0); callCount", "1");
     72 callCount = 0;
     73 shouldBe("[0,1,2,3,4].reduce(function(a,b){ callCount++; }, 0); callCount", "5");
     74 callCount = 0;
     75 shouldBe("[0,1,2,3,4].reduce(function(a,b){ callCount++; }); callCount", "4");
     76 callCount = 0;
     77 shouldBe("[1, 2, 3, 4].reduce(function(a,b, i, thisObj){ thisObj.length--; callCount++; return a + b; }, 0); callCount", "2");
     78 callCount = 0;
     79 shouldBe("[1, 2, 3, 4].reduce(function(a,b, i, thisObj){ thisObj.length++; callCount++; return a + b; }, 0); callCount", "4");
     80 callCount = 0;
     81 shouldBe("toObject([1, 2, 3, 4]).reduce(function(a,b, i, thisObj){ thisObj.length--; callCount++; return a + b; }, 0); callCount", "4");
     82 callCount = 0;
     83 shouldBe("toObject([1, 2, 3, 4]).reduce(function(a,b, i, thisObj){ thisObj.length++; callCount++; return a + b; }, 0); callCount", "4");
     84 
     85 shouldBe("[[0,1], [2,3], [4,5]].reduce(function(a,b) {return a.concat(b);}, [])", "[0,1,2,3,4,5]");
     86 shouldBe("toObject([[0,1], [2,3], [4,5]]).reduce(function(a,b) {return a.concat(b);}, [])", "[0,1,2,3,4,5]");
     87 shouldBe("toObject([0,1,2,3,4,5]).reduce(function(a,b,i) {return a.concat([i,b]);}, [])", "[0,0,1,1,2,2,3,3,4,4,5,5]");
     88 shouldBe("toUnorderedObject([[0,1], [2,3], [4,5]]).reduce(function(a,b) {return a.concat(b);}, [])", "[0,1,2,3,4,5]");
     89 shouldBe("toUnorderedObject([0,1,2,3,4,5]).reduce(function(a,b,i) {return a.concat([i,b]);}, [])", "[0,0,1,1,2,2,3,3,4,4,5,5]");
     90 shouldBe("[0,1,2,3,4,5].reduce(function(a,b,i) {return a.concat([i,b]);}, [])", "[0,0,1,1,2,2,3,3,4,4,5,5]");
     91 shouldBe("[2,3].reduce(function() {'use strict'; return this;})", "undefined");
     92