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 that toString() round-trip on a function that has prefix, postfix and typeof operators applied to group expression will not remove the grouping. Also checks that evaluation of such a expression produces run-time exception"
     26 );
     27 
     28 /* These have become obsolete, since they are not syntactically well-formed ES5+.
     29 
     30 function postfix_should_preserve_parens(x, y, z) {
     31     (x, y)++;
     32     return y;
     33 }
     34 
     35 function prefix_should_preserve_parens(x, y, z) {
     36     ++(x, y);
     37     return x;
     38 
     39 }
     40 
     41 function both_should_preserve_parens(x, y, z) {
     42     ++(x, y)--;
     43     return x;
     44 
     45 }
     46 
     47 function postfix_should_preserve_parens_multi(x, y, z) {
     48     (((x, y)))--;
     49     return x;
     50 }
     51 
     52 function prefix_should_preserve_parens_multi(x, y, z) {
     53     --(((x, y)));
     54     return x;
     55 }
     56 
     57 function both_should_preserve_parens_multi(x, y, z) {
     58     ++(((x, y)))--;
     59     return x;
     60 }
     61 
     62 function postfix_should_preserve_parens_multi1(x, y, z) {
     63     (((x)), y)--;
     64     return x;
     65 }
     66 
     67 function prefix_should_preserve_parens_multi1(x, y, z) {
     68     --(((x)), y);
     69     return x;
     70 }
     71 
     72 function prefix_should_preserve_parens_multi2(x, y, z) {
     73     var z = 0;
     74     --(((x), y), z);
     75     return x;
     76 }
     77 
     78 function postfix_should_preserve_parens_multi2(x, y, z) {
     79     var z = 0;
     80     (((x), y) ,z)++;
     81     return x;
     82 }
     83 */
     84 
     85 // if these return a variable (such as y) instead of
     86 // the result of typeof, this means that the parenthesis
     87 // got lost somewhere.
     88 function typeof_should_preserve_parens(x, y, z) {
     89     return typeof (x, y);
     90 }
     91 
     92 function typeof_should_preserve_parens1(x, y, z) {
     93     return typeof ((x, y));
     94 }
     95 
     96 function typeof_should_preserve_parens2(x, y, z) {
     97     var z = 33;
     98     return typeof (z, (x, y));
     99 }
    100 
    101 function typeof_should_preserve_parens_multi(x, y, z) {
    102     var z = 33;
    103     return typeof ((z,(((x, y)))));
    104 }
    105 
    106 unevalf = function(x) { return '(' + x.toString() + ')'; };
    107 
    108 function testToString(fn) {
    109     // check that toString result evaluates to code that can be evaluated
    110     // this doesn't actually reveal the bug that this test is testing
    111     shouldBe("unevalf(eval(unevalf("+fn+")))", "unevalf(" + fn + ")");
    112 
    113     // check that grouping operator is still there (this test reveals the bug
    114     // but will create possible false negative if toString output changes in
    115     // the future)
    116     shouldBeTrue("/.*\\(+x\\)*, y\\)/.test(unevalf("+fn+"))");
    117 
    118 }
    119 
    120 function testToStringAndRTFailure(fn)
    121 {
    122     testToString(fn);
    123 
    124     // check that function call produces run-time exception
    125     shouldThrow(""+fn+ "(1, 2, 3);");
    126 
    127     // check that function call produces run-time exception after eval(unevalf)
    128     shouldThrow("eval(unevalf("+fn+ "))(1, 2, 3);");
    129 }
    130 
    131 function testToStringAndReturn(fn, p1, p2, retval)
    132 {
    133 
    134     testToString(fn);
    135 
    136     // check that function call produces correct result
    137     shouldBe("" + fn + "(" + p1 + ", " + p2 +");", retval);
    138 
    139     // check that function call produces correct result after eval(unevalf)
    140     shouldBe("eval(unevalf("+fn+ "))" + "(" + p1 + ", " + p2 +");", retval);
    141 }
    142 
    143 
    144 /*
    145 testToStringAndRTFailure("prefix_should_preserve_parens");
    146 testToStringAndRTFailure("postfix_should_preserve_parens");
    147 testToStringAndRTFailure("both_should_preserve_parens");
    148 testToStringAndRTFailure("prefix_should_preserve_parens_multi");
    149 testToStringAndRTFailure("postfix_should_preserve_parens_multi");
    150 testToStringAndRTFailure("prefix_should_preserve_parens_multi1");
    151 testToStringAndRTFailure("postfix_should_preserve_parens_multi1");
    152 testToStringAndRTFailure("prefix_should_preserve_parens_multi2");
    153 testToStringAndRTFailure("postfix_should_preserve_parens_multi2");
    154 */
    155 
    156 testToStringAndReturn("typeof_should_preserve_parens", "'a'", 1, "'number'");
    157 testToStringAndReturn("typeof_should_preserve_parens1", "'a'", 1, "'number'");
    158 testToStringAndReturn("typeof_should_preserve_parens2", "'a'", 1, "'number'");
    159 testToStringAndReturn("typeof_should_preserve_parens_multi", "'a'", 1, "'number'");
    160