1/* ***** BEGIN LICENSE BLOCK ***** 2* Version: NPL 1.1/GPL 2.0/LGPL 2.1 3* 4* The contents of this file are subject to the Netscape Public License 5* Version 1.1 (the "License"); you may not use this file except in 6* compliance with the License. You may obtain a copy of the License at 7* http://www.mozilla.org/NPL/ 8* 9* Software distributed under the License is distributed on an "AS IS" basis, 10* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 11* for the specific language governing rights and limitations under the 12* License. 13* 14* The Original Code is JavaScript Engine testing utilities. 15* 16* The Initial Developer of the Original Code is Netscape Communications Corp. 17* Portions created by the Initial Developer are Copyright (C) 2003 18* the Initial Developer. All Rights Reserved. 19* 20* Contributor(s): igor@icesoft.no, pschwartau@netscape.com 21* 22* Alternatively, the contents of this file may be used under the terms of 23* either the GNU General Public License Version 2 or later (the "GPL"), or 24* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 25* in which case the provisions of the GPL or the LGPL are applicable instead 26* of those above. If you wish to allow use of your version of this file only 27* under the terms of either the GPL or the LGPL, and not to allow others to 28* use your version of this file under the terms of the NPL, indicate your 29* decision by deleting the provisions above and replace them with the notice 30* and other provisions required by the GPL or the LGPL. If you do not delete 31* the provisions above, a recipient may use your version of this file under 32* the terms of any one of the NPL, the GPL or the LGPL. 33* 34* ***** END LICENSE BLOCK ***** 35* 36* 37* Date: 06 February 2003 38* SUMMARY: Using |instanceof| to check if function is called as a constructor 39* 40* See http://bugzilla.mozilla.org/show_bug.cgi?id=192105 41* 42*/ 43//----------------------------------------------------------------------------- 44var UBound = 0; 45var bug = 192105; 46var summary = 'Using |instanceof| to check if f() is called as constructor'; 47var status = ''; 48var statusitems = []; 49var actual = ''; 50var actualvalues = []; 51var expect= ''; 52var expectedvalues = []; 53 54 55/* 56 * This function is the heart of the test. It sets the result 57 * variable |actual|, which we will compare against |expect|. 58 * 59 * Note |actual| will be set to |true| or |false| according 60 * to whether or not this function is called as a constructor; 61 * i.e. whether it is called via the |new| keyword or not - 62 */ 63function f() 64{ 65 actual = (this instanceof f); 66} 67 68 69/* 70 * Call f as a constructor from global scope 71 */ 72status = inSection(1); 73new f(); // sets |actual| 74expect = true; 75addThis(); 76 77/* 78 * Now, not as a constructor 79 */ 80status = inSection(2); 81f(); // sets |actual| 82expect = false; 83addThis(); 84 85 86/* 87 * Call f as a constructor from function scope 88 */ 89function F() 90{ 91 new f(); 92} 93status = inSection(3); 94F(); // sets |actual| 95expect = true; 96addThis(); 97 98/* 99 * Now, not as a constructor 100 */ 101function G() 102{ 103 f(); 104} 105status = inSection(4); 106G(); // sets |actual| 107expect = false; 108addThis(); 109 110 111/* 112 * Now make F() and G() methods of an object 113 */ 114var obj = {F:F, G:G}; 115status = inSection(5); 116obj.F(); // sets |actual| 117expect = true; 118addThis(); 119 120status = inSection(6); 121obj.G(); // sets |actual| 122expect = false; 123addThis(); 124 125 126/* 127 * Now call F() and G() from yet other functions, and use eval() 128 */ 129function A() 130{ 131 eval('F();'); 132} 133status = inSection(7); 134A(); // sets |actual| 135expect = true; 136addThis(); 137 138 139function B() 140{ 141 eval('G();'); 142} 143status = inSection(8); 144B(); // sets |actual| 145expect = false; 146addThis(); 147 148 149 150 151//----------------------------------------------------------------------------- 152test(); 153//----------------------------------------------------------------------------- 154 155 156 157function addThis() 158{ 159 statusitems[UBound] = status; 160 actualvalues[UBound] = actual; 161 expectedvalues[UBound] = expect; 162 UBound++; 163} 164 165 166function test() 167{ 168 enterFunc('test'); 169 printBugNumber(bug); 170 printStatus(summary); 171 172 for (var i=0; i<UBound; i++) 173 { 174 reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]); 175 } 176 177 exitFunc ('test'); 178} 179