Home | History | Annotate | Download | only in resources
      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 var wasPostTestScriptParsed = false;
     25 
     26 function removeLink(text)
     27 {
     28     return text.replace(/<a[^>]*>/g, "").replace(/<\/a>/g, "");
     29 }
     30 
     31 function description(msg)
     32 {
     33     print(removeLink(msg));
     34     print("\nOn success, you will see a series of \"PASS\" messages, followed by \"TEST COMPLETE\".\n");
     35     print();
     36 }
     37 
     38 function debug(msg)
     39 {
     40     print(msg);
     41 }
     42 
     43 function escapeString(text)
     44 {
     45     return text.replace(/\0/g, "");
     46 }
     47 
     48 function testPassed(msg)
     49 {
     50     print("PASS", escapeString(msg));
     51 }
     52 
     53 function testFailed(msg)
     54 {
     55     print("FAIL", escapeString(msg));
     56 }
     57 
     58 function areArraysEqual(_a, _b)
     59 {
     60     if (Object.prototype.toString.call(_a) != Object.prototype.toString.call([]))
     61         return false;
     62     if (_a.length !== _b.length)
     63         return false;
     64     for (var i = 0; i < _a.length; i++)
     65         if (_a[i] !== _b[i])
     66             return false;
     67     return true;
     68 }
     69 
     70 function isMinusZero(n)
     71 {
     72     // the only way to tell 0 from -0 in JS is the fact that 1/-0 is
     73     // -Infinity instead of Infinity
     74     return n === 0 && 1/n < 0;
     75 }
     76 
     77 function isResultCorrect(_actual, _expected)
     78 {
     79     if (_expected === 0)
     80         return _actual === _expected && (1/_actual) === (1/_expected);
     81     if (_actual === _expected)
     82         return true;
     83     if (typeof(_expected) == "number" && isNaN(_expected))
     84         return typeof(_actual) == "number" && isNaN(_actual);
     85     if (Object.prototype.toString.call(_expected) == Object.prototype.toString.call([]))
     86         return areArraysEqual(_actual, _expected);
     87     return false;
     88 }
     89 
     90 function stringify(v)
     91 {
     92     if (v === 0 && 1/v < 0)
     93         return "-0";
     94     else return "" + v;
     95 }
     96 
     97 function shouldBe(_a, _b)
     98 {
     99   if (typeof _a != "string" || typeof _b != "string")
    100     debug("WARN: shouldBe() expects string arguments");
    101   var exception;
    102   var _av;
    103   try {
    104      _av = eval(_a);
    105   } catch (e) {
    106      exception = e;
    107   }
    108   var _bv = eval(_b);
    109 
    110   if (exception)
    111     testFailed(_a + " should be " + _bv + ". Threw exception " + exception);
    112   else if (isResultCorrect(_av, _bv))
    113     testPassed(_a + " is " + _b);
    114   else if (typeof(_av) == typeof(_bv))
    115     testFailed(_a + " should be " + _bv + ". Was " + stringify(_av) + ".");
    116   else
    117     testFailed(_a + " should be " + _bv + " (of type " + typeof _bv + "). Was " + _av + " (of type " + typeof _av + ").");
    118 }
    119 
    120 function shouldBeTrue(_a) { shouldBe(_a, "true"); }
    121 function shouldBeFalse(_a) { shouldBe(_a, "false"); }
    122 function shouldBeNaN(_a) { shouldBe(_a, "NaN"); }
    123 function shouldBeNull(_a) { shouldBe(_a, "null"); }
    124 
    125 function shouldBeEqualToString(a, b)
    126 {
    127   if (typeof a !== "string" || typeof b !== "string")
    128     debug("WARN: shouldBeEqualToString() expects string arguments");
    129   var unevaledString = JSON.stringify(b);
    130   shouldBe(a, unevaledString);
    131 }
    132 
    133 function shouldBeUndefined(_a)
    134 {
    135   var exception;
    136   var _av;
    137   try {
    138      _av = eval(_a);
    139   } catch (e) {
    140      exception = e;
    141   }
    142 
    143   if (exception)
    144     testFailed(_a + " should be undefined. Threw exception " + exception);
    145   else if (typeof _av == "undefined")
    146     testPassed(_a + " is undefined.");
    147   else
    148     testFailed(_a + " should be undefined. Was " + _av);
    149 }
    150 
    151 
    152 function shouldThrow(_a, _e)
    153 {
    154   var exception;
    155   var _av;
    156   try {
    157      _av = eval(_a);
    158   } catch (e) {
    159      exception = e;
    160   }
    161 
    162   var _ev;
    163   if (_e)
    164       _ev =  eval(_e);
    165 
    166   if (exception) {
    167     if (typeof _e == "undefined" || exception == _ev)
    168       testPassed(_a + " threw exception " + exception + ".");
    169     else
    170       testFailed(_a + " should throw " + (typeof _e == "undefined" ? "an exception" : _ev) + ". Threw exception " + exception + ".");
    171   } else if (typeof _av == "undefined")
    172     testFailed(_a + " should throw " + (typeof _e == "undefined" ? "an exception" : _ev) + ". Was undefined.");
    173   else
    174     testFailed(_a + " should throw " + (typeof _e == "undefined" ? "an exception" : _ev) + ". Was " + _av + ".");
    175 }
    176 
    177 function isSuccessfullyParsed()
    178 {
    179     successfullyParsed = true;
    180     shouldBeTrue("successfullyParsed");
    181     debug("\nTEST COMPLETE\n");
    182 }
    183 
    184 // It's possible for an async test to call finishJSTest() before js-test-post.js
    185 // has been parsed.
    186 function finishJSTest()
    187 {
    188     wasFinishJSTestCalled = true;
    189     if (!wasPostTestScriptParsed)
    190         return;
    191     isSuccessfullyParsed();
    192 }
    193