Home | History | Annotate | Download | only in function
      1 /* The contents of this file are subject to the Netscape Public
      2  * License Version 1.1 (the "License"); you may not use this file
      3  * except in compliance with the License. You may obtain a copy of
      4  * the License at http://www.mozilla.org/NPL/
      5  *
      6  * Software distributed under the License is distributed on an "AS
      7  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
      8  * implied. See the License for the specific language governing
      9  * rights and limitations under the License.
     10  *
     11  * The Original Code is Mozilla Communicator client code, released March
     12  * 31, 1998.
     13  *
     14  * The Initial Developer of the Original Code is Netscape Communications
     15  * Corporation. Portions created by Netscape are
     16  * Copyright (C) 1998 Netscape Communications Corporation. All
     17  * Rights Reserved.
     18  *
     19  * Contributor(s):
     20  *
     21  */
     22 /**
     23     File Name:          tostring-1.js
     24     Section:            Function.toString
     25     Description:
     26 
     27     Since the behavior of Function.toString() is implementation-dependent,
     28     toString tests for function are not in the ECMA suite.
     29 
     30     Currently, an attempt to parse the toString output for some functions
     31     and verify that the result is something reasonable.
     32 
     33     This verifies
     34     http://scopus.mcom.com/bugsplat/show_bug.cgi?id=99212
     35 
     36     Author:             christine (at) netscape.com
     37     Date:               12 november 1997
     38 */
     39 
     40     var SECTION = "tostring-2";
     41     var VERSION = "JS1_2";
     42     startTest();
     43     var TITLE   = "Function.toString()";
     44     var BUGNUMBER="123444";
     45 
     46     writeHeaderToLog( SECTION + " "+ TITLE);
     47 
     48     var testcases = new Array();
     49 
     50     var tab = "    ";
     51 
     52 
     53 var equals = new TestFunction( "Equals", "a, b", tab+ "return a == b;" );
     54 function Equals (a, b) {
     55     return a == b;
     56 }
     57 
     58 var reallyequals = new TestFunction( "ReallyEquals", "a, b",
     59     ( version() <= 120 )  ? tab +"return a == b;" : tab +"return a === b;" );
     60 function ReallyEquals( a, b ) {
     61     return a === b;
     62 }
     63 
     64 var doesntequal = new TestFunction( "DoesntEqual", "a, b", tab + "return a != b;" );
     65 function DoesntEqual( a, b ) {
     66     return a != b;
     67 }
     68 
     69 var reallydoesntequal = new TestFunction( "ReallyDoesntEqual", "a, b",
     70     ( version() <= 120 ) ? tab +"return a != b;"  : tab +"return a !== b;" );
     71 function ReallyDoesntEqual( a, b ) {
     72     return a !== b;
     73 }
     74 
     75 var testor = new TestFunction( "TestOr", "a",  tab+"if (a == null || a == void 0) {\n"+
     76     tab +tab+"return 0;\n"+tab+"} else {\n"+tab+tab+"return a;\n"+tab+"}" );
     77 function TestOr( a ) {
     78  if ( a == null || a == void 0 )
     79     return 0;
     80  else
     81     return a;
     82 }
     83 
     84 var testand = new TestFunction( "TestAnd", "a", tab+"if (a != null && a != void 0) {\n"+
     85     tab+tab+"return a;\n" + tab+ "} else {\n"+tab+tab+"return 0;\n"+tab+"}" );
     86 function TestAnd( a ) {
     87  if ( a != null && a != void 0 )
     88     return a;
     89  else
     90     return 0;
     91 }
     92 
     93 var or = new TestFunction( "Or", "a, b", tab + "return a | b;" );
     94 function Or( a, b ) {
     95     return a | b;
     96 }
     97 
     98 var and = new TestFunction( "And", "a, b", tab + "return a & b;" );
     99 function And( a, b ) {
    100     return a & b;
    101 }
    102 
    103 var xor = new TestFunction( "XOr", "a, b", tab + "return a ^ b;" );
    104 function XOr( a, b ) {
    105     return a ^ b;
    106 }
    107 
    108     testcases[testcases.length] = new TestCase( SECTION,
    109         "Equals.toString()",
    110         equals.valueOf(),
    111         Equals.toString() );
    112 
    113     testcases[testcases.length] = new TestCase( SECTION,
    114         "ReallyEquals.toString()",
    115         reallyequals.valueOf(),
    116         ReallyEquals.toString() );
    117 
    118     testcases[testcases.length] = new TestCase( SECTION,
    119         "DoesntEqual.toString()",
    120         doesntequal.valueOf(),
    121         DoesntEqual.toString() );
    122 
    123     testcases[testcases.length] = new TestCase( SECTION,
    124         "ReallyDoesntEqual.toString()",
    125         reallydoesntequal.valueOf(),
    126         ReallyDoesntEqual.toString() );
    127 
    128     testcases[testcases.length] = new TestCase( SECTION,
    129         "TestOr.toString()",
    130         testor.valueOf(),
    131         TestOr.toString() );
    132 
    133     testcases[testcases.length] = new TestCase( SECTION,
    134         "TestAnd.toString()",
    135         testand.valueOf(),
    136         TestAnd.toString() );
    137 
    138     testcases[testcases.length] = new TestCase( SECTION,
    139         "Or.toString()",
    140         or.valueOf(),
    141         Or.toString() );
    142 
    143     testcases[testcases.length] = new TestCase( SECTION,
    144         "And.toString()",
    145         and.valueOf(),
    146         And.toString() );
    147 
    148     testcases[testcases.length] = new TestCase( SECTION,
    149         "XOr.toString()",
    150         xor.valueOf(),
    151         XOr.toString() );
    152 
    153     test();
    154 
    155 function test() {
    156     for ( tc=0; tc < testcases.length; tc++ ) {
    157         testcases[tc].passed = writeTestCaseResult(
    158                             testcases[tc].expect,
    159                             testcases[tc].actual,
    160                             testcases[tc].description +" = "+
    161                             testcases[tc].actual );
    162 
    163         testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value ";
    164     }
    165     stopTest();
    166     return ( testcases );
    167 }
    168 function TestFunction( name, args, body ) {
    169     this.name = name;
    170     this.arguments = args.toString();
    171     this.body = body;
    172 
    173     /* the format of Function.toString() in JavaScript 1.2 is:
    174     /n
    175     function name ( arguments ) {
    176         body
    177     }
    178     */
    179     this.value = "\nfunction " + (name ? name : "anonymous" )+
    180     "("+args+") {\n"+ (( body ) ? body +"\n" : "") + "}\n";
    181 
    182     this.toString = new Function( "return this.value" );
    183     this.valueOf = new Function( "return this.value" );
    184     return this;
    185 }
    186