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: 11.2.1-1.js 24 ECMA Section: 11.2.1 Property Accessors 25 Description: 26 27 Properties are accessed by name, using either the dot notation: 28 MemberExpression . Identifier 29 CallExpression . Identifier 30 31 or the bracket notation: MemberExpression [ Expression ] 32 CallExpression [ Expression ] 33 34 The dot notation is explained by the following syntactic conversion: 35 MemberExpression . Identifier 36 is identical in its behavior to 37 MemberExpression [ <identifier-string> ] 38 and similarly 39 CallExpression . Identifier 40 is identical in its behavior to 41 CallExpression [ <identifier-string> ] 42 where <identifier-string> is a string literal containing the same sequence 43 of characters as the Identifier. 44 45 The production MemberExpression : MemberExpression [ Expression ] is 46 evaluated as follows: 47 48 1. Evaluate MemberExpression. 49 2. Call GetValue(Result(1)). 50 3. Evaluate Expression. 51 4. Call GetValue(Result(3)). 52 5. Call ToObject(Result(2)). 53 6. Call ToString(Result(4)). 54 7. Return a value of type Reference whose base object is Result(5) and 55 whose property name is Result(6). 56 57 The production CallExpression : CallExpression [ Expression ] is evaluated 58 in exactly the same manner, except that the contained CallExpression is 59 evaluated in step 1. 60 61 Author: christine (at) netscape.com 62 Date: 12 november 1997 63 */ 64 var SECTION = "11.2.1-1"; 65 var VERSION = "ECMA_1"; 66 startTest(); 67 var TITLE = "Property Accessors"; 68 writeHeaderToLog( SECTION + " "+TITLE ); 69 70 var testcases = new Array(); 71 72 // go through all Native Function objects, methods, and properties and get their typeof. 73 74 var PROPERTY = new Array(); 75 var p = 0; 76 77 // properties and functions of the global object 78 79 PROPERTY[p++] = new Property( "this", "NaN", "number" ); 80 PROPERTY[p++] = new Property( "this", "Infinity", "number" ); 81 PROPERTY[p++] = new Property( "this", "eval", "function" ); 82 PROPERTY[p++] = new Property( "this", "parseInt", "function" ); 83 PROPERTY[p++] = new Property( "this", "parseFloat", "function" ); 84 PROPERTY[p++] = new Property( "this", "escape", "function" ); 85 PROPERTY[p++] = new Property( "this", "unescape", "function" ); 86 PROPERTY[p++] = new Property( "this", "isNaN", "function" ); 87 PROPERTY[p++] = new Property( "this", "isFinite", "function" ); 88 PROPERTY[p++] = new Property( "this", "Object", "function" ); 89 PROPERTY[p++] = new Property( "this", "Number", "function" ); 90 PROPERTY[p++] = new Property( "this", "Function", "function" ); 91 PROPERTY[p++] = new Property( "this", "Array", "function" ); 92 PROPERTY[p++] = new Property( "this", "String", "function" ); 93 PROPERTY[p++] = new Property( "this", "Boolean", "function" ); 94 PROPERTY[p++] = new Property( "this", "Date", "function" ); 95 PROPERTY[p++] = new Property( "this", "Math", "object" ); 96 97 // properties and methods of Object objects 98 99 PROPERTY[p++] = new Property( "Object", "prototype", "object" ); 100 PROPERTY[p++] = new Property( "Object", "toString", "function" ); 101 PROPERTY[p++] = new Property( "Object", "valueOf", "function" ); 102 PROPERTY[p++] = new Property( "Object", "constructor", "function" ); 103 104 // properties of the Function object 105 106 PROPERTY[p++] = new Property( "Function", "prototype", "function" ); 107 PROPERTY[p++] = new Property( "Function.prototype", "toString", "function" ); 108 PROPERTY[p++] = new Property( "Function.prototype", "length", "number" ); 109 PROPERTY[p++] = new Property( "Function.prototype", "valueOf", "function" ); 110 111 Function.prototype.myProperty = "hi"; 112 113 PROPERTY[p++] = new Property( "Function.prototype", "myProperty", "string" ); 114 115 // properties of the Array object 116 PROPERTY[p++] = new Property( "Array", "prototype", "object" ); 117 PROPERTY[p++] = new Property( "Array", "length", "number" ); 118 PROPERTY[p++] = new Property( "Array.prototype", "constructor", "function" ); 119 PROPERTY[p++] = new Property( "Array.prototype", "toString", "function" ); 120 PROPERTY[p++] = new Property( "Array.prototype", "join", "function" ); 121 PROPERTY[p++] = new Property( "Array.prototype", "reverse", "function" ); 122 PROPERTY[p++] = new Property( "Array.prototype", "sort", "function" ); 123 124 // properties of the String object 125 PROPERTY[p++] = new Property( "String", "prototype", "object" ); 126 PROPERTY[p++] = new Property( "String", "fromCharCode", "function" ); 127 PROPERTY[p++] = new Property( "String.prototype", "toString", "function" ); 128 PROPERTY[p++] = new Property( "String.prototype", "constructor", "function" ); 129 PROPERTY[p++] = new Property( "String.prototype", "valueOf", "function" ); 130 PROPERTY[p++] = new Property( "String.prototype", "charAt", "function" ); 131 PROPERTY[p++] = new Property( "String.prototype", "charCodeAt", "function" ); 132 PROPERTY[p++] = new Property( "String.prototype", "indexOf", "function" ); 133 PROPERTY[p++] = new Property( "String.prototype", "lastIndexOf", "function" ); 134 PROPERTY[p++] = new Property( "String.prototype", "split", "function" ); 135 PROPERTY[p++] = new Property( "String.prototype", "substring", "function" ); 136 PROPERTY[p++] = new Property( "String.prototype", "toLowerCase", "function" ); 137 PROPERTY[p++] = new Property( "String.prototype", "toUpperCase", "function" ); 138 PROPERTY[p++] = new Property( "String.prototype", "length", "number" ); 139 140 // properties of the Boolean object 141 PROPERTY[p++] = new Property( "Boolean", "prototype", "object" ); 142 PROPERTY[p++] = new Property( "Boolean", "constructor", "function" ); 143 PROPERTY[p++] = new Property( "Boolean.prototype", "valueOf", "function" ); 144 PROPERTY[p++] = new Property( "Boolean.prototype", "toString", "function" ); 145 146 // properties of the Number object 147 148 PROPERTY[p++] = new Property( "Number", "MAX_VALUE", "number" ); 149 PROPERTY[p++] = new Property( "Number", "MIN_VALUE", "number" ); 150 PROPERTY[p++] = new Property( "Number", "NaN", "number" ); 151 PROPERTY[p++] = new Property( "Number", "NEGATIVE_INFINITY", "number" ); 152 PROPERTY[p++] = new Property( "Number", "POSITIVE_INFINITY", "number" ); 153 PROPERTY[p++] = new Property( "Number.prototype", "toString", "function" ); 154 PROPERTY[p++] = new Property( "Number.prototype", "constructor", "function" ); 155 PROPERTY[p++] = new Property( "Number.prototype", "valueOf", "function" ); 156 157 // properties of the Math Object. 158 PROPERTY[p++] = new Property( "Math", "E", "number" ); 159 PROPERTY[p++] = new Property( "Math", "LN10", "number" ); 160 PROPERTY[p++] = new Property( "Math", "LN2", "number" ); 161 PROPERTY[p++] = new Property( "Math", "LOG2E", "number" ); 162 PROPERTY[p++] = new Property( "Math", "LOG10E", "number" ); 163 PROPERTY[p++] = new Property( "Math", "PI", "number" ); 164 PROPERTY[p++] = new Property( "Math", "SQRT1_2", "number" ); 165 PROPERTY[p++] = new Property( "Math", "SQRT2", "number" ); 166 PROPERTY[p++] = new Property( "Math", "abs", "function" ); 167 PROPERTY[p++] = new Property( "Math", "acos", "function" ); 168 PROPERTY[p++] = new Property( "Math", "asin", "function" ); 169 PROPERTY[p++] = new Property( "Math", "atan", "function" ); 170 PROPERTY[p++] = new Property( "Math", "atan2", "function" ); 171 PROPERTY[p++] = new Property( "Math", "ceil", "function" ); 172 PROPERTY[p++] = new Property( "Math", "cos", "function" ); 173 PROPERTY[p++] = new Property( "Math", "exp", "function" ); 174 PROPERTY[p++] = new Property( "Math", "floor", "function" ); 175 PROPERTY[p++] = new Property( "Math", "log", "function" ); 176 PROPERTY[p++] = new Property( "Math", "max", "function" ); 177 PROPERTY[p++] = new Property( "Math", "min", "function" ); 178 PROPERTY[p++] = new Property( "Math", "pow", "function" ); 179 PROPERTY[p++] = new Property( "Math", "random", "function" ); 180 PROPERTY[p++] = new Property( "Math", "round", "function" ); 181 PROPERTY[p++] = new Property( "Math", "sin", "function" ); 182 PROPERTY[p++] = new Property( "Math", "sqrt", "function" ); 183 PROPERTY[p++] = new Property( "Math", "tan", "function" ); 184 185 // properties of the Date object 186 PROPERTY[p++] = new Property( "Date", "parse", "function" ); 187 PROPERTY[p++] = new Property( "Date", "prototype", "object" ); 188 PROPERTY[p++] = new Property( "Date", "UTC", "function" ); 189 PROPERTY[p++] = new Property( "Date.prototype", "constructor", "function" ); 190 PROPERTY[p++] = new Property( "Date.prototype", "toString", "function" ); 191 PROPERTY[p++] = new Property( "Date.prototype", "valueOf", "function" ); 192 PROPERTY[p++] = new Property( "Date.prototype", "getTime", "function" ); 193 PROPERTY[p++] = new Property( "Date.prototype", "getYear", "function" ); 194 PROPERTY[p++] = new Property( "Date.prototype", "getFullYear", "function" ); 195 PROPERTY[p++] = new Property( "Date.prototype", "getUTCFullYear", "function" ); 196 PROPERTY[p++] = new Property( "Date.prototype", "getMonth", "function" ); 197 PROPERTY[p++] = new Property( "Date.prototype", "getUTCMonth", "function" ); 198 PROPERTY[p++] = new Property( "Date.prototype", "getDate", "function" ); 199 PROPERTY[p++] = new Property( "Date.prototype", "getUTCDate", "function" ); 200 PROPERTY[p++] = new Property( "Date.prototype", "getDay", "function" ); 201 PROPERTY[p++] = new Property( "Date.prototype", "getUTCDay", "function" ); 202 PROPERTY[p++] = new Property( "Date.prototype", "getHours", "function" ); 203 PROPERTY[p++] = new Property( "Date.prototype", "getUTCHours", "function" ); 204 PROPERTY[p++] = new Property( "Date.prototype", "getMinutes", "function" ); 205 PROPERTY[p++] = new Property( "Date.prototype", "getUTCMinutes", "function" ); 206 PROPERTY[p++] = new Property( "Date.prototype", "getSeconds", "function" ); 207 PROPERTY[p++] = new Property( "Date.prototype", "getUTCSeconds", "function" ); 208 PROPERTY[p++] = new Property( "Date.prototype", "getMilliseconds","function" ); 209 PROPERTY[p++] = new Property( "Date.prototype", "getUTCMilliseconds", "function" ); 210 PROPERTY[p++] = new Property( "Date.prototype", "setTime", "function" ); 211 PROPERTY[p++] = new Property( "Date.prototype", "setMilliseconds","function" ); 212 PROPERTY[p++] = new Property( "Date.prototype", "setUTCMilliseconds", "function" ); 213 PROPERTY[p++] = new Property( "Date.prototype", "setSeconds", "function" ); 214 PROPERTY[p++] = new Property( "Date.prototype", "setUTCSeconds", "function" ); 215 PROPERTY[p++] = new Property( "Date.prototype", "setMinutes", "function" ); 216 PROPERTY[p++] = new Property( "Date.prototype", "setUTCMinutes", "function" ); 217 PROPERTY[p++] = new Property( "Date.prototype", "setHours", "function" ); 218 PROPERTY[p++] = new Property( "Date.prototype", "setUTCHours", "function" ); 219 PROPERTY[p++] = new Property( "Date.prototype", "setDate", "function" ); 220 PROPERTY[p++] = new Property( "Date.prototype", "setUTCDate", "function" ); 221 PROPERTY[p++] = new Property( "Date.prototype", "setMonth", "function" ); 222 PROPERTY[p++] = new Property( "Date.prototype", "setUTCMonth", "function" ); 223 PROPERTY[p++] = new Property( "Date.prototype", "setFullYear", "function" ); 224 PROPERTY[p++] = new Property( "Date.prototype", "setUTCFullYear", "function" ); 225 PROPERTY[p++] = new Property( "Date.prototype", "setYear", "function" ); 226 PROPERTY[p++] = new Property( "Date.prototype", "toLocaleString", "function" ); 227 PROPERTY[p++] = new Property( "Date.prototype", "toUTCString", "function" ); 228 PROPERTY[p++] = new Property( "Date.prototype", "toGMTString", "function" ); 229 230 for ( var i = 0, RESULT; i < PROPERTY.length; i++ ) { 231 RESULT = eval("typeof " + PROPERTY[i].object + "." + PROPERTY[i].name ); 232 233 testcases[tc++] = new TestCase( SECTION, 234 "typeof " + PROPERTY[i].object + "." + PROPERTY[i].name, 235 PROPERTY[i].type, 236 RESULT ); 237 238 RESULT = eval("typeof " + PROPERTY[i].object + "['" + PROPERTY[i].name +"']"); 239 240 testcases[tc++] = new TestCase( SECTION, 241 "typeof " + PROPERTY[i].object + "['" + PROPERTY[i].name +"']", 242 PROPERTY[i].type, 243 RESULT ); 244 } 245 246 test(); 247 248 function test() { 249 for ( tc=0; tc < testcases.length; tc++ ) { 250 testcases[tc].passed = writeTestCaseResult( 251 testcases[tc].expect, 252 testcases[tc].actual, 253 testcases[tc].description +" = "+ 254 testcases[tc].actual ); 255 256 testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value "; 257 } 258 stopTest(); 259 return ( testcases ); 260 } 261 function MyObject( arg0, arg1, arg2, arg3, arg4 ) { 262 this.name = arg0; 263 } 264 function Property( object, name, type ) { 265 this.object = object; 266 this.name = name; 267 this.type = type; 268 } 269