1/** 2 File Name: regexp-enumerate-001.js 3 ECMA V2 Section: 4 Description: Regression Test. 5 6 If instance Native Object have properties that are enumerable, 7 JavaScript enumerated through the properties twice. This only 8 happened if objects had been instantiated, but their properties 9 had not been enumerated. ie, the object inherited properties 10 from its prototype that are enumerated. 11 12 In the core JavaScript, this is only a problem with RegExp 13 objects, since the inherited properties of most core JavaScript 14 objects are not enumerated. 15 16 Author: christine@netscape.com, pschwartau@netscape.com 17 Date: 12 November 1997 18 Modified: 14 July 2002 19 Reason: See http://bugzilla.mozilla.org/show_bug.cgi?id=155291 20 ECMA-262 Ed.3 Sections 15.10.7.1 through 15.10.7.5 21 RegExp properties should be DontEnum 22* 23*/ 24// onerror = err; 25 26 var SECTION = "regexp-enumerate-001"; 27 var VERSION = "ECMA_2"; 28 var TITLE = "Regression Test for Enumerating Properties"; 29 30 var BUGNUMBER="339403"; 31 32 startTest(); 33 writeHeaderToLog( SECTION + " "+ TITLE); 34 35 var tc = 0; 36 var testcases = new Array(); 37 38 /* 39 * This test expects RegExp instances to have four enumerated properties: 40 * source, global, ignoreCase, and lastIndex 41 * 42 * 99.01.25: now they also have a multiLine instance property. 43 * 44 */ 45 46 47 var r = new RegExp(); 48 49 var e = new Array(); 50 51 var t = new TestRegExp(); 52 53 for ( p in r ) { e[e.length] = { property:p, value:r[p] }; t.addProperty( p, r[p]) }; 54 55 testcases[testcases.length] = new TestCase( SECTION, 56 "r = new RegExp(); e = new Array(); "+ 57 "for ( p in r ) { e[e.length] = { property:p, value:r[p] }; e.length", 58 0, 59 e.length ); 60 61 test(); 62 63function TestRegExp() { 64 this.addProperty = addProperty; 65} 66function addProperty(name, value) { 67 var pass = false; 68 69 if ( eval("this."+name) != void 0 ) { 70 pass = true; 71 } else { 72 eval( "this."+ name+" = "+ false ); 73 } 74 75 testcases[testcases.length] = new TestCase( SECTION, 76 "Property: " + name +" already enumerated?", 77 false, 78 pass ); 79 80 if ( testcases[ testcases.length-1].passed == false ) { 81 testcases[testcases.length-1].reason = "property already enumerated"; 82 83 } 84 85} 86function test() { 87 for ( tc=0; tc < testcases.length; tc++ ) { 88 testcases[tc].passed = writeTestCaseResult( 89 testcases[tc].expect, 90 testcases[tc].actual, 91 testcases[tc].description +" = "+ 92 testcases[tc].actual ); 93 94 testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value "; 95 } 96 stopTest(); 97 return ( testcases ); 98} 99