[MacRuby-devel] Help with bug from Cucumber codebase

M. Scott Ford scott at vaderpi.com
Wed Feb 11 11:48:18 PST 2009


Sorry to reply to my own post but I have been playing with this all  
day to figure out what is wrong. I have narrowed the problem down to  
the merge method, but I am not sure how to fix it. Here are some test  
cases. These all pass in ruby 1.9.1. The first one fails in MacRuby  
trunk, but the other two pass.

h = Hash.new do |h, k|
   12
end
h = h.merge({1 => 2})
assert_equal(h[1], 2)
assert_equal(h[:random], 12)

h = Hash.new do |h, k|
   12
end
h.merge!({1 => 2})
assert_equal(h[1], 2)
assert_equal(h[:random], 12)

h = Hash.new do |h, k|
   12
end
h.merge({1 => 2})
assert_equal(h[1], 12)
assert_equal(h[:random], 12)


On Feb 11, 2009, at 11:53 AM, M. Scott Ford wrote:

> Hello,
>
> I have been trying to get cucumber working with MacRuby, and I have  
> run into a bug. I have tracked the source of it down to a block of  
> code in cucumber's code base[BLOCK 1]. I have condensed this down to  
> a much smaller example[BLOCK 2]. In ruby 1.9.1 the second block  
> results in 'yellow,bold', but in macruby the second block results in  
> nil.
>
> My guess is that there is a bug in the merge implementation or the  
> constructor implementation. I am not familiar enough with ruby to  
> know which, so I will take a look at both. I feel this should be  
> added as a test case, but I am not sure where to put that, since I  
> am new to the project. Any tips?
>
> -Scott
>
> ----- BLOCK 1 ----------
>      ALIASES = Hash.new do |h,k|
>        if k.to_s =~ /(.*)_param/
>          h[$1] + ',bold'
>        end
>      end.merge({
>        'missing' => 'yellow',
>        'pending' => 'yellow',
>        'failed'  => 'red',
>        'passed'  => 'green',
>        'outline' => 'cyan',
>        'skipped' => 'cyan',
>        'comment' => 'grey',
>        'tag'     => 'blue'
>      })
>
>      if ENV['CUCUMBER_COLORS'] # Example: export  
> CUCUMBER_COLORS="passed=red:failed=yellow"
>        ENV['CUCUMBER_COLORS'].split(':').each do |pair|
>          a = pair.split('=')
>          ALIASES[a[0]] = a[1]
>        end
>      end
>
>      ALIASES.each do |method, color|
>        unless method =~ /.*_param/
>          code = <<-EOF
>          def #{method}(string=nil, &proc)
>            #{ALIASES[method].split(",").join("(") + "(string, &proc"  
> + ")" * ALIASES[method].split(",").length}
>          end
>          # This resets the colour to the non-param colour
>          def #{method}_param(string=nil, &proc)
>            #{ALIASES[method+'_param'].split(",").join("(") +  
> "(string, &proc" + ")" * ALIASES[method+'_param'].split(",").length}  
> + #{ALIASES[method].split(",").join(' + ')}
>          end
>          EOF
>          eval(code)
>        end
>      end
> -------------- END BLOCK 1 --------------
>
> ------- BLOCK 2 ------------------
>
> ALIASES = Hash.new do |h,k|
>  if k.to_s =~ /(.*)_param/
>    h[$1] + ',bold'
>  end
> end.merge({
>  'missing' => 'yellow'
> })
>
> puts ALIASES['missing_param']
>
> --------- END BLOCK 2 ---------
> _______________________________________________
> MacRuby-devel mailing list
> MacRuby-devel at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel



More information about the MacRuby-devel mailing list