[Ironruby-core] Code Review: Fix for File.print misbehavior

Shri Borde Shri.Borde at microsoft.com
Sun May 17 01:24:15 EDT 2009


The "output" matcher from the snippet below swaps stdout with IOStub in order to be able to capture the output of the block. Swapping IOStub back with real stdout will not work as you will not know what the block printed...

    lambda { $stdout.print(o, o2) }.should output("#{o.to_s}#{o2.to_s}#{$\}")

One hybrid way to fix this would be for the "output" matcher to take an IO object as a second optional parameter that is used to capture the output intead of using IOStub. Then print_spec.rb could provide a StringIO object. Currently, print_spec.rb is busted and does not test what it is supposed to. Taking a dependency on a stdlib (stringio) would not be worse thing in this case.

I do not feel strongly about fixing this right now...
________________________________________
From: ironruby-core-bounces at rubyforge.org [ironruby-core-bounces at rubyforge.org] On Behalf Of Jim Deville [jdeville at microsoft.com]
Sent: Saturday, May 16, 2009 4:05 PM
To: ironruby-core at rubyforge.org
Subject: Re: [Ironruby-core] Code Review: Fix for File.print misbehavior

I would be opposed to making the MSpec runner depend on any more stdlibs. I would suggest making a helper that swaps the IOStub with the real stdout for the duration of a block.

JD

....there is no try
Sent from my phone. Please excuse typos and txtspk.

-----Original Message-----
From: Shri Borde <Shri.Borde at microsoft.com>
Sent: May 16, 2009 3:11 PM
To: ironruby-core at rubyforge.org <ironruby-core at rubyforge.org>
Subject: Re: [Ironruby-core] Code Review: Fix for File.print misbehavior


The problem is because of mspec itself. In External.LCA_RESTRICTED\Languages\IronRuby\mspec\mspec\lib\mspec\matchers\output.rb, the code sets $stdout to a helper class (IOStub) so that it can capture the output. However, what this means is that calls to $stdout.print that the test makes now go to IOStub#print rather than to the real implementation of IO#print, and this masks the bug.

A better solution would be to use StringIO in matchers\output.rb rather than IOStub. If you are included to pursue this (which would be great), you could try the change and/or send email to http://groups.google.com/group/rubyspec to discuss the change. However, since this is a preexisting issue, you could leave it for another day if you want.

So consider your change code-reviewed, and you can chose separately to pursue (or not) the issue with matchers\output.rb.

-----Original Message-----
From: ironruby-core-bounces at rubyforge.org [mailto:ironruby-core-bounces at rubyforge.org] On Behalf Of Shay Friedman
Sent: Saturday, May 16, 2009 12:46 AM
To: ironruby-core at rubyforge.org
Subject: Re: [Ironruby-core] Code Review: Fix for File.print misbehavior

I couldn't follow the code exactly but what I did find, was that this
test never reached the code inside IOOps.Print.
The behavior is really strange, I tried to print the value on the screen
and the value were really incorrect (the $\ delimiter is added after
each argument) but the $stdout.print call inside the lambda expression
got it correctly...

I did that:

  it "writes each obj.to_s to the stream and appends $\\ (if any) given
multiple

objects" do
    o, o2 = Object.new, Object.new
    def o.to_s(); 'o'; end
    def o2.to_s(); 'o2'; end

    puts $stdout.print(o, o2)

    lambda { $stdout.print(o, o2) }.should
output("#{o.to_s}#{o2.to_s}#{$\}")
  end


And it wrote "o->o2->nil" on the screen... But when I changed the output
it to "123" the test failed and told me:
Expected:
  $stdout: "123"
      got:
  $stdout: "oo2->"

So I'm really confused... like I said, my breakpoint inside the print
method never gets hit so I can't really tell which "print" method is
invoked...

Shay.
--
Posted via http://www.ruby-forum.com/.
_______________________________________________
Ironruby-core mailing list
Ironruby-core at rubyforge.org
http://rubyforge.org/mailman/listinfo/ironruby-core

_______________________________________________
Ironruby-core mailing list
Ironruby-core at rubyforge.org
http://rubyforge.org/mailman/listinfo/ironruby-core

_______________________________________________
Ironruby-core mailing list
Ironruby-core at rubyforge.org
http://rubyforge.org/mailman/listinfo/ironruby-core


More information about the Ironruby-core mailing list