Ticket #9611: string_to_function_recursive_with_tests.diff
| File string_to_function_recursive_with_tests.diff, 8.4 kB (added by jcoglan, 10 months ago) |
|---|
-
src/enumerable.js
old new 23 23 }, 24 24 25 25 all: function(iterator, context) { 26 if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 26 27 iterator = iterator ? iterator.bind(context) : Prototype.K; 27 28 var result = true; 28 29 this.each(function(value, index) { … … 33 34 }, 34 35 35 36 any: function(iterator, context) { 37 if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 36 38 iterator = iterator ? iterator.bind(context) : Prototype.K; 37 39 var result = false; 38 40 this.each(function(value, index) { … … 43 45 }, 44 46 45 47 collect: function(iterator, context) { 48 if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 46 49 iterator = iterator ? iterator.bind(context) : Prototype.K; 47 50 var results = []; 48 51 this.each(function(value, index) { … … 52 55 }, 53 56 54 57 detect: function(iterator, context) { 58 if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 55 59 iterator = iterator.bind(context); 56 60 var result; 57 61 this.each(function(value, index) { … … 64 68 }, 65 69 66 70 findAll: function(iterator, context) { 71 if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 67 72 iterator = iterator.bind(context); 68 73 var results = []; 69 74 this.each(function(value, index) { … … 125 130 }, 126 131 127 132 max: function(iterator, context) { 133 if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 128 134 iterator = iterator ? iterator.bind(context) : Prototype.K; 129 135 var result; 130 136 this.each(function(value, index) { … … 136 142 }, 137 143 138 144 min: function(iterator, context) { 145 if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 139 146 iterator = iterator ? iterator.bind(context) : Prototype.K; 140 147 var result; 141 148 this.each(function(value, index) { … … 147 154 }, 148 155 149 156 partition: function(iterator, context) { 157 if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 150 158 iterator = iterator ? iterator.bind(context) : Prototype.K; 151 159 var trues = [], falses = []; 152 160 this.each(function(value, index) { … … 165 173 }, 166 174 167 175 reject: function(iterator, context) { 176 if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 168 177 iterator = iterator.bind(context); 169 178 var results = []; 170 179 this.each(function(value, index) { … … 175 184 }, 176 185 177 186 sortBy: function(iterator, context) { 187 if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 178 188 iterator = iterator.bind(context); 179 189 return this.map(function(value, index) { 180 190 return {value: value, criteria: iterator(value, index)}; -
src/string.js
old new 112 112 toArray: function() { 113 113 return this.split(''); 114 114 }, 115 115 116 toFunction: function() { 117 var properties = this.split('.'); 118 if (!properties[0]) return Prototype.K; 119 return function(o) { 120 var object, member = o; 121 for (var i = 0, n = properties.length; i < n; i++) { 122 object = member; 123 member = object[properties[i]]; 124 if (typeof member == 'function') member = member.apply(object); 125 } 126 return member; 127 }; 128 }, 129 116 130 succ: function() { 117 131 return this.slice(0, this.length - 1) + 118 132 String.fromCharCode(this.charCodeAt(this.length - 1) + 1); -
test/unit/enumerable.html
old new 32 32 </tbody> 33 33 </table> 34 34 35 <div style="display: block;" class="finder"></div> 36 <div style="display: none;" class="finder"></div> 37 <div style="display: inline;" class="finder"></div> 38 35 39 <!-- Tests follow --> 36 40 <script type="text/javascript" language="javascript" charset="utf-8"> 37 41 // <![CDATA[ … … 45 49 46 50 Nicknames: $w('sam- noradio htonl Ulysses'), 47 51 52 Radios: [ 53 {checked: true}, {checked: false}, {checked: 1}, {checked: true}, 54 {checked: ''}, {checked: 17}, {checked: null}, {checked: 'foo'} 55 ], 56 57 Records: [ 58 {valid: function() { return this.name == 'Bob'; }, name: 'Mike'}, 59 {valid: function() { return this.name == 'Bob'; }, name: 'Bob'} 60 ], 61 62 Values: [{value: 12}, {value: -5}, {value: 9}, {value: 6}], 63 64 Nested: [{value: {integer: 12}}, {value: {integer: -5}}, {value: {integer: 9}}, {value: {integer: 6}}], 65 48 66 Basic: [1, 2, 3], 49 67 50 68 Primes: [ … … 122 140 assert(!Fixtures.Basic.any(function(value) { 123 141 return value > 5; 124 142 })); 143 assert(Fixtures.Radios.any('checked')); 144 assert(Fixtures.Records.any('valid')); 125 145 }}, 126 146 127 147 testAll: function() {with(this) { … … 137 157 assert(!Fixtures.Basic.all(function(value) { 138 158 return value > 1; 139 159 })); 160 assert([{checked: true}, {checked: 12}, {checked: 'foo'}].all('checked')); 161 assert(!Fixtures.Radios.all('checked')); 162 assert(!Fixtures.Records.all('valid')); 140 163 }}, 141 164 142 165 testCollect: function() {with(this) { … … 146 169 }).join(", ")); 147 170 148 171 assertEqual(26, Fixtures.Primes.map().length); 172 173 assertEqual(Fixtures.Nicknames.join(', '), 174 Fixtures.People.collect('nickname').join(', ')); 175 176 assertEqual(Fixtures.Values.pluck('value').join(', '), 177 Fixtures.Nested.collect('value.integer').join(', ')); 178 179 var set = Fixtures.Values.collect(function(v) { 180 return { 181 value: function() { return {quantity: this.k}; }, 182 k: v.value 183 }; 184 }); 185 assertEqual(Fixtures.Values.pluck('value').join(', '), 186 set.collect('value.quantity').join(', ')); 149 187 }}, 150 188 151 189 testDetect: function() {with(this) { … … 153 191 Fixtures.People.detect(function(person) { 154 192 return person.nickname.match(/no/); 155 193 }).name); 194 assertEqual(true, Fixtures.Radios.detect('checked').checked); 195 assertEqual('Bob', Fixtures.Records.detect('valid').name); 156 196 }}, 157 197 158 198 testEachSlice: function() {with(this) { … … 181 221 testFindAll: function() {with(this) { 182 222 assertEqual(Fixtures.Primes.join(', '), 183 223 Fixtures.Z.findAll(prime).join(', ')); 224 assertEqual(5, Fixtures.Radios.findAll('checked').length); 225 assertEqual(2, $$('div.finder').findAll('visible').length); 184 226 }}, 185 227 186 228 testGrep: function() {with(this) { … … 257 299 assertEqual(97, Fixtures.Primes.max()); 258 300 assertEqual(2, [ -9, -8, -7, -6, -4, -3, -2, 0, -1, 2 ].max()); 259 301 assertEqual('sam-', Fixtures.Nicknames.max()); // ?s > ?U 302 assertEqual(12, Fixtures.Values.max('value')); 260 303 }}, 261 304 262 305 testMin: function() {with(this) { 263 306 assertEqual(1, Fixtures.Z.min()); 264 307 assertEqual(0, [ 1, 2, 3, 4, 5, 6, 7, 8, 0, 9 ].min()); 265 308 assertEqual('Ulysses', Fixtures.Nicknames.min()); // ?U < ?h 309 assertEqual(-5, Fixtures.Values.min('value')); 266 310 }}, 267 311 268 312 testPartition: function() {with(this) { … … 273 317 assertEqual(2, result.length); 274 318 assertEqual('sam-, htonl', result[0].join(', ')); 275 319 assertEqual('noradio, Ulysses', result[1].join(', ')); 320 321 result = Fixtures.Radios.partition('checked'); 322 assertEqual(5, result[0].length); 323 assertEqual(3, result[1].length); 276 324 }}, 277 325 278 326 testPluck: function() {with(this) { … … 284 332 assertEqual(0, 285 333 Fixtures.Nicknames.reject(Prototype.K).length); 286 334 335 assertEqual(3, 336 Fixtures.Radios.reject('checked').length); 337 338 assertEqual(1, 339 Fixtures.Records.reject('valid').length); 340 287 341 assertEqual('sam-, noradio, htonl', 288 342 Fixtures.Nicknames.reject(function(nickname) { 289 343 return nickname != nickname.toLowerCase(); … … 295 349 Fixtures.People.sortBy(function(value) { 296 350 return value.nickname.toLowerCase(); 297 351 }).pluck('nickname').join(', ')); 352 353 assertEqual('-5, 6, 9, 12', 354 Fixtures.Values.sortBy('value').pluck('value').join(', ')); 298 355 }}, 299 356 300 357 testToArray: function() {with(this) {