getset-004.js (4680B)
1 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 /* 7 * Date: 14 April 2001 8 * 9 * SUMMARY: Testing obj.__defineSetter__(), obj.__defineGetter__() 10 * Note: this is a non-ECMA language extension 11 */ 12 //----------------------------------------------------------------------------- 13 var UBound = 0; 14 var BUGNUMBER = '(none)'; 15 var summary = 'Testing obj.__defineSetter__(), obj.__defineGetter__()'; 16 var statprefix = 'Status: '; 17 var status = ''; 18 var statusitems = [ ]; 19 var actual = ''; 20 var actualvalues = [ ]; 21 var expect= ''; 22 var expectedvalues = [ ]; 23 var cnDEFAULT = 'default name'; 24 var cnFRED = 'Fred'; 25 var obj = {}; 26 var obj2 = {}; 27 var s = ''; 28 29 30 // SECTION1: define getter/setter directly on an object (not its prototype) 31 obj = new Object(); 32 obj.nameSETS = 0; 33 obj.nameGETS = 0; 34 obj.__defineSetter__('name', function(newValue) {this._name=newValue; this.nameSETS++;}); 35 obj.__defineGetter__('name', function() {this.nameGETS++; return this._name;}); 36 37 status = 'In SECTION1 of test after 0 sets, 0 gets'; 38 actual = [obj.nameSETS,obj.nameGETS]; 39 expect = [0,0]; 40 addThis(); 41 42 s = obj.name; 43 status = 'In SECTION1 of test after 0 sets, 1 get'; 44 actual = [obj.nameSETS,obj.nameGETS]; 45 expect = [0,1]; 46 addThis(); 47 48 obj.name = cnFRED; 49 status = 'In SECTION1 of test after 1 set, 1 get'; 50 actual = [obj.nameSETS,obj.nameGETS]; 51 expect = [1,1]; 52 addThis(); 53 54 obj.name = obj.name; 55 status = 'In SECTION1 of test after 2 sets, 2 gets'; 56 actual = [obj.nameSETS,obj.nameGETS]; 57 expect = [2,2]; 58 addThis(); 59 60 61 // SECTION2: define getter/setter in Object.prototype 62 Object.prototype.nameSETS = 0; 63 Object.prototype.nameGETS = 0; 64 Object.prototype.__defineSetter__('name', function(newValue) {this._name=newValue; this.nameSETS++;}); 65 Object.prototype.__defineGetter__('name', function() {this.nameGETS++; return this._name;}); 66 67 obj = new Object(); 68 status = 'In SECTION2 of test after 0 sets, 0 gets'; 69 actual = [obj.nameSETS,obj.nameGETS]; 70 expect = [0,0]; 71 addThis(); 72 73 s = obj.name; 74 status = 'In SECTION2 of test after 0 sets, 1 get'; 75 actual = [obj.nameSETS,obj.nameGETS]; 76 expect = [0,1]; 77 addThis(); 78 79 obj.name = cnFRED; 80 status = 'In SECTION2 of test after 1 set, 1 get'; 81 actual = [obj.nameSETS,obj.nameGETS]; 82 expect = [1,1]; 83 addThis(); 84 85 obj.name = obj.name; 86 status = 'In SECTION2 of test after 2 sets, 2 gets'; 87 actual = [obj.nameSETS,obj.nameGETS]; 88 expect = [2,2]; 89 addThis(); 90 91 92 // SECTION 3: define getter/setter in prototype of user-defined constructor 93 function TestObject() 94 { 95 } 96 TestObject.prototype.nameSETS = 0; 97 TestObject.prototype.nameGETS = 0; 98 TestObject.prototype.__defineSetter__('name', function(newValue) {this._name=newValue; this.nameSETS++;}); 99 TestObject.prototype.__defineGetter__('name', function() {this.nameGETS++; return this._name;}); 100 TestObject.prototype.name = cnDEFAULT; 101 102 obj = new TestObject(); 103 status = 'In SECTION3 of test after 1 set, 0 gets'; // (we set a default value in the prototype) 104 actual = [obj.nameSETS,obj.nameGETS]; 105 expect = [1,0]; 106 addThis(); 107 108 s = obj.name; 109 status = 'In SECTION3 of test after 1 set, 1 get'; 110 actual = [obj.nameSETS,obj.nameGETS]; 111 expect = [1,1]; 112 addThis(); 113 114 obj.name = cnFRED; 115 status = 'In SECTION3 of test after 2 sets, 1 get'; 116 actual = [obj.nameSETS,obj.nameGETS]; 117 expect = [2,1]; 118 addThis(); 119 120 obj.name = obj.name; 121 status = 'In SECTION3 of test after 3 sets, 2 gets'; 122 actual = [obj.nameSETS,obj.nameGETS]; 123 expect = [3,2]; 124 addThis(); 125 126 obj2 = new TestObject(); 127 status = 'obj2 = new TestObject() after 1 set, 0 gets'; 128 actual = [obj2.nameSETS,obj2.nameGETS]; 129 expect = [1,0]; // we set a default value in the prototype - 130 addThis(); 131 132 // Use both obj and obj2 - 133 obj2.name = obj.name + obj2.name; 134 status = 'obj2 = new TestObject() after 2 sets, 1 get'; 135 actual = [obj2.nameSETS,obj2.nameGETS]; 136 expect = [2,1]; 137 addThis(); 138 139 status = 'In SECTION3 of test after 3 sets, 3 gets'; 140 actual = [obj.nameSETS,obj.nameGETS]; 141 expect = [3,3]; // we left off at [3,2] above - 142 addThis(); 143 144 145 //--------------------------------------------------------------------------------- 146 test(); 147 //--------------------------------------------------------------------------------- 148 149 150 function addThis() 151 { 152 statusitems[UBound] = status; 153 actualvalues[UBound] = actual.toString(); 154 expectedvalues[UBound] = expect.toString(); 155 UBound++; 156 } 157 158 159 function test() 160 { 161 printBugNumber(BUGNUMBER); 162 printStatus (summary); 163 164 for (var i = 0; i < UBound; i++) 165 { 166 reportCompare(expectedvalues[i], actualvalues[i], getStatus(i)); 167 } 168 } 169 170 171 function getStatus(i) 172 { 173 return statprefix + statusitems[i]; 174 }