Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

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  
    2323  }, 
    2424 
    2525  all: function(iterator, context) { 
     26    if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 
    2627    iterator = iterator ? iterator.bind(context) : Prototype.K; 
    2728    var result = true; 
    2829    this.each(function(value, index) { 
     
    3334  }, 
    3435 
    3536  any: function(iterator, context) { 
     37    if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 
    3638    iterator = iterator ? iterator.bind(context) : Prototype.K; 
    3739    var result = false; 
    3840    this.each(function(value, index) { 
     
    4345  }, 
    4446 
    4547  collect: function(iterator, context) { 
     48    if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 
    4649    iterator = iterator ? iterator.bind(context) : Prototype.K; 
    4750    var results = []; 
    4851    this.each(function(value, index) { 
     
    5255  }, 
    5356   
    5457  detect: function(iterator, context) { 
     58    if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 
    5559    iterator = iterator.bind(context); 
    5660    var result; 
    5761    this.each(function(value, index) { 
     
    6468  }, 
    6569   
    6670  findAll: function(iterator, context) { 
     71    if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 
    6772    iterator = iterator.bind(context); 
    6873    var results = []; 
    6974    this.each(function(value, index) { 
     
    125130  }, 
    126131   
    127132  max: function(iterator, context) { 
     133    if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 
    128134    iterator = iterator ? iterator.bind(context) : Prototype.K; 
    129135    var result; 
    130136    this.each(function(value, index) { 
     
    136142  }, 
    137143   
    138144  min: function(iterator, context) { 
     145    if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 
    139146    iterator = iterator ? iterator.bind(context) : Prototype.K; 
    140147    var result; 
    141148    this.each(function(value, index) { 
     
    147154  }, 
    148155   
    149156  partition: function(iterator, context) { 
     157    if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 
    150158    iterator = iterator ? iterator.bind(context) : Prototype.K; 
    151159    var trues = [], falses = []; 
    152160    this.each(function(value, index) { 
     
    165173  }, 
    166174   
    167175  reject: function(iterator, context) { 
     176    if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 
    168177    iterator = iterator.bind(context); 
    169178    var results = []; 
    170179    this.each(function(value, index) { 
     
    175184  }, 
    176185   
    177186  sortBy: function(iterator, context) { 
     187    if (iterator && iterator.toFunction) iterator = iterator.toFunction(); 
    178188    iterator = iterator.bind(context); 
    179189    return this.map(function(value, index) { 
    180190      return {value: value, criteria: iterator(value, index)}; 
  • src/string.js

    old new  
    112112  toArray: function() { 
    113113    return this.split(''); 
    114114  }, 
    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   
    116130  succ: function() { 
    117131    return this.slice(0, this.length - 1) + 
    118132      String.fromCharCode(this.charCodeAt(this.length - 1) + 1); 
  • test/unit/enumerable.html

    old new  
    3232</tbody> 
    3333</table> 
    3434 
     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 
    3539<!-- Tests follow --> 
    3640<script type="text/javascript" language="javascript" charset="utf-8"> 
    3741// <![CDATA[ 
     
    4549     
    4650    Nicknames: $w('sam- noradio htonl Ulysses'), 
    4751     
     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     
    4866    Basic: [1, 2, 3], 
    4967     
    5068    Primes: [ 
     
    122140      assert(!Fixtures.Basic.any(function(value) { 
    123141        return value > 5; 
    124142      })); 
     143      assert(Fixtures.Radios.any('checked')); 
     144      assert(Fixtures.Records.any('valid')); 
    125145    }}, 
    126146     
    127147    testAll: function() {with(this) { 
     
    137157      assert(!Fixtures.Basic.all(function(value) { 
    138158        return value > 1; 
    139159      })); 
     160      assert([{checked: true}, {checked: 12}, {checked: 'foo'}].all('checked')); 
     161      assert(!Fixtures.Radios.all('checked')); 
     162      assert(!Fixtures.Records.all('valid')); 
    140163    }}, 
    141164     
    142165    testCollect: function() {with(this) { 
     
    146169        }).join(", ")); 
    147170       
    148171      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(', ')); 
    149187    }}, 
    150188     
    151189    testDetect: function() {with(this) { 
     
    153191        Fixtures.People.detect(function(person) { 
    154192          return person.nickname.match(/no/); 
    155193        }).name); 
     194      assertEqual(true, Fixtures.Radios.detect('checked').checked); 
     195      assertEqual('Bob', Fixtures.Records.detect('valid').name); 
    156196    }}, 
    157197     
    158198    testEachSlice: function() {with(this) { 
     
    181221    testFindAll: function() {with(this) { 
    182222      assertEqual(Fixtures.Primes.join(', '), 
    183223        Fixtures.Z.findAll(prime).join(', ')); 
     224      assertEqual(5, Fixtures.Radios.findAll('checked').length); 
     225      assertEqual(2, $$('div.finder').findAll('visible').length); 
    184226    }}, 
    185227     
    186228    testGrep: function() {with(this) { 
     
    257299      assertEqual(97, Fixtures.Primes.max()); 
    258300      assertEqual(2, [ -9, -8, -7, -6, -4, -3, -2,  0, -1,  2 ].max()); 
    259301      assertEqual('sam-', Fixtures.Nicknames.max()); // ?s > ?U 
     302      assertEqual(12, Fixtures.Values.max('value')); 
    260303    }}, 
    261304     
    262305    testMin: function() {with(this) { 
    263306      assertEqual(1, Fixtures.Z.min()); 
    264307      assertEqual(0, [  1, 2, 3, 4, 5, 6, 7, 8, 0, 9 ].min()); 
    265308      assertEqual('Ulysses', Fixtures.Nicknames.min()); // ?U < ?h 
     309      assertEqual(-5, Fixtures.Values.min('value')); 
    266310    }}, 
    267311     
    268312    testPartition: function() {with(this) { 
     
    273317      assertEqual(2, result.length); 
    274318      assertEqual('sam-, htonl', result[0].join(', ')); 
    275319      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); 
    276324    }}, 
    277325     
    278326    testPluck: function() {with(this) { 
     
    284332      assertEqual(0,  
    285333        Fixtures.Nicknames.reject(Prototype.K).length); 
    286334         
     335      assertEqual(3, 
     336        Fixtures.Radios.reject('checked').length); 
     337         
     338      assertEqual(1, 
     339        Fixtures.Records.reject('valid').length); 
     340         
    287341      assertEqual('sam-, noradio, htonl', 
    288342        Fixtures.Nicknames.reject(function(nickname) { 
    289343          return nickname != nickname.toLowerCase(); 
     
    295349        Fixtures.People.sortBy(function(value) { 
    296350          return value.nickname.toLowerCase(); 
    297351        }).pluck('nickname').join(', ')); 
     352         
     353      assertEqual('-5, 6, 9, 12', 
     354        Fixtures.Values.sortBy('value').pluck('value').join(', ')); 
    298355    }}, 
    299356     
    300357    testToArray: function() {with(this) {