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

Ticket #9611: string_to_function_with_tests.diff

File string_to_function_with_tests.diff, 7.6 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  
    113113    return this.split(''); 
    114114  }, 
    115115 
     116  toFunction: function() { 
     117    var property = this; 
     118    if (!property) return Prototype.K; 
     119    return function(o) { 
     120      var member = o[property]; 
     121      return (typeof member == 'function') ? member.apply(o) : member; 
     122    }; 
     123  }, 
     124 
    116125  succ: function() { 
    117126    return this.slice(0, this.length - 1) + 
    118127      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     
    4864    Basic: [1, 2, 3], 
    4965     
    5066    Primes: [ 
     
    122138      assert(!Fixtures.Basic.any(function(value) { 
    123139        return value > 5; 
    124140      })); 
     141      assert(Fixtures.Radios.any('checked')); 
     142      assert(Fixtures.Records.any('valid')); 
    125143    }}, 
    126144     
    127145    testAll: function() {with(this) { 
     
    137155      assert(!Fixtures.Basic.all(function(value) { 
    138156        return value > 1; 
    139157      })); 
     158      assert([{checked: true}, {checked: 12}, {checked: 'foo'}].all('checked')); 
     159      assert(!Fixtures.Radios.all('checked')); 
     160      assert(!Fixtures.Records.all('valid')); 
    140161    }}, 
    141162     
    142163    testCollect: function() {with(this) { 
     
    146167        }).join(", ")); 
    147168       
    148169      assertEqual(26,  Fixtures.Primes.map().length); 
     170       
     171      assertEqual(Fixtures.Nicknames.join(', '), 
     172        Fixtures.People.collect('nickname').join(', ')); 
    149173    }}, 
    150174     
    151175    testDetect: function() {with(this) { 
     
    153177        Fixtures.People.detect(function(person) { 
    154178          return person.nickname.match(/no/); 
    155179        }).name); 
     180      assertEqual(true, Fixtures.Radios.detect('checked').checked); 
     181      assertEqual('Bob', Fixtures.Records.detect('valid').name); 
    156182    }}, 
    157183     
    158184    testEachSlice: function() {with(this) { 
     
    181207    testFindAll: function() {with(this) { 
    182208      assertEqual(Fixtures.Primes.join(', '), 
    183209        Fixtures.Z.findAll(prime).join(', ')); 
     210      assertEqual(5, Fixtures.Radios.findAll('checked').length); 
     211      assertEqual(2, $$('div.finder').findAll('visible').length); 
    184212    }}, 
    185213     
    186214    testGrep: function() {with(this) { 
     
    257285      assertEqual(97, Fixtures.Primes.max()); 
    258286      assertEqual(2, [ -9, -8, -7, -6, -4, -3, -2,  0, -1,  2 ].max()); 
    259287      assertEqual('sam-', Fixtures.Nicknames.max()); // ?s > ?U 
     288      assertEqual(12, Fixtures.Values.max('value')); 
    260289    }}, 
    261290     
    262291    testMin: function() {with(this) { 
    263292      assertEqual(1, Fixtures.Z.min()); 
    264293      assertEqual(0, [  1, 2, 3, 4, 5, 6, 7, 8, 0, 9 ].min()); 
    265294      assertEqual('Ulysses', Fixtures.Nicknames.min()); // ?U < ?h 
     295      assertEqual(-5, Fixtures.Values.min('value')); 
    266296    }}, 
    267297     
    268298    testPartition: function() {with(this) { 
     
    273303      assertEqual(2, result.length); 
    274304      assertEqual('sam-, htonl', result[0].join(', ')); 
    275305      assertEqual('noradio, Ulysses', result[1].join(', ')); 
     306       
     307      result = Fixtures.Radios.partition('checked'); 
     308      assertEqual(5, result[0].length); 
     309      assertEqual(3, result[1].length); 
    276310    }}, 
    277311     
    278312    testPluck: function() {with(this) { 
     
    284318      assertEqual(0,  
    285319        Fixtures.Nicknames.reject(Prototype.K).length); 
    286320         
     321      assertEqual(3, 
     322        Fixtures.Radios.reject('checked').length); 
     323         
     324      assertEqual(1, 
     325        Fixtures.Records.reject('valid').length); 
     326         
    287327      assertEqual('sam-, noradio, htonl', 
    288328        Fixtures.Nicknames.reject(function(nickname) { 
    289329          return nickname != nickname.toLowerCase(); 
     
    295335        Fixtures.People.sortBy(function(value) { 
    296336          return value.nickname.toLowerCase(); 
    297337        }).pluck('nickname').join(', ')); 
     338         
     339      assertEqual('-5, 6, 9, 12', 
     340        Fixtures.Values.sortBy('value').pluck('value').join(', ')); 
    298341    }}, 
    299342     
    300343    testToArray: function() {with(this) {