Home | History | Annotate | Download | only in Expressions
      1 /**
      2  *  File Name:          instanceof-001.js
      3  *  ECMA Section:       11.8.6
      4  *  Description:
      5  *
      6  *  RelationalExpression instanceof Identifier
      7  *
      8  *  Author:             christine (at) netscape.com
      9  *  Date:               2 September 1998
     10  */
     11     var SECTION = "instanceof-001";
     12     var VERSION = "ECMA_2";
     13     var TITLE   = "instanceof"
     14 
     15     startTest();
     16     writeHeaderToLog( SECTION + " "+ TITLE);
     17 
     18     var tc = 0;
     19     var testcases = new Array();
     20 
     21     function InstanceOf( object_1, object_2, expect ) {
     22         result = object_1 instanceof object_2;
     23 
     24         testcases[tc++] = new TestCase(
     25             SECTION,
     26             "(" + object_1 + ") instanceof " + object_2,
     27             expect,
     28             result );
     29     }
     30 
     31     function Gen3(value) {
     32         this.value = value;
     33         this.generation = 3;
     34         this.toString = new Function ( "return \"(Gen\"+this.generation+\" instance)\"" );
     35     }
     36     Gen3.name = 3;
     37     Gen3.__proto__.toString = new Function( "return \"(\"+this.name+\" object)\"");
     38 
     39     function Gen2(value) {
     40         this.value = value;
     41         this.generation = 2;
     42     }
     43     Gen2.name = 2;
     44     Gen2.prototype = new Gen3();
     45 
     46     function Gen1(value) {
     47         this.value = value;
     48         this.generation = 1;
     49     }
     50     Gen1.name = 1;
     51     Gen1.prototype = new Gen2();
     52 
     53     function Gen0(value) {
     54         this.value = value;
     55         this.generation = 0;
     56     }
     57     Gen0.name = 0;
     58     Gen0.prototype = new Gen1();
     59 
     60 
     61     function GenA(value) {
     62         this.value = value;
     63         this.generation = "A";
     64         this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
     65 
     66     }
     67     GenA.prototype = new Gen0();
     68     GenA.name = "A";
     69 
     70     function GenB(value) {
     71         this.value = value;
     72         this.generation = "B";
     73         this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
     74     }
     75     GenB.name = "B"
     76     GenB.prototype = void 0;
     77 
     78     // RelationalExpression is not an object.
     79 
     80     InstanceOf( true, Boolean, false );
     81     InstanceOf( new Boolean(false), Boolean, true );
     82 
     83     // Identifier is not a function
     84 
     85 //    InstanceOf( true, true, false );
     86 //    InstanceOf( new Boolean(true), false, false );
     87 
     88     // Identifier is a function, prototype of Identifier is not an object
     89 
     90 //    InstanceOf( new GenB(), GenB, false );
     91 
     92     // __proto__ of RelationalExpression is null.  should return false
     93     genA = new GenA();
     94     genA.__proto__ = null;
     95 
     96     InstanceOf( genA, GenA, false );
     97 
     98     // RelationalExpression.__proto__ ==  (but not ===) Identifier.prototype
     99 
    100     InstanceOf( new Gen2(), Gen0, false );
    101     InstanceOf( new Gen2(), Gen1, false );
    102     InstanceOf( new Gen2(), Gen2, true );
    103     InstanceOf( new Gen2(), Gen3, true );
    104 
    105     // RelationalExpression.__proto__.__proto__ === Identifier.prototype
    106     InstanceOf( new Gen0(), Gen0, true );
    107     InstanceOf( new Gen0(), Gen1, true );
    108     InstanceOf( new Gen0(), Gen2, true );
    109     InstanceOf( new Gen0(), Gen3, true );
    110 
    111     InstanceOf( new Gen0(), Object, true );
    112     InstanceOf( new Gen0(), Function, false );
    113 
    114     InstanceOf( Gen0, Function, true );
    115     InstanceOf( Gen0, Object, true );
    116 
    117     test();