[Yarv-devel] Some tests for test_jump.rb

George Marrows george.marrows at ntlworld.com
Mon Apr 4 16:35:25 EDT 2005


Hi son-shi :)

Nice work with getting the go-ahead for Rite, and for all implementing
all the stack caching and instruction unification cleverness.

Anyway, I finally got round to submitting some YARV patches, as
initially promised last October. For my first batch, I'd like to offer
some additional tests for test_jump.rb - see attachment. They're some
old tests I've cannabalised from my defunct ByteCodeRuby project.

Unfortunately 8 of the tests fail - see dump at the end. The ones that
fail with '<false> is not true', I've had to skip because they cause
errors like the following

test_exception_overrides_break(TestJump): <*YARV eval*>:9: [BUG]
thread_backtrace: unkown instruction (-172128)
ruby 1.9.0 (2005-03-04) [i686-linux]

on my box (Mandrake Linux 8.1 x86)

Hope they're of some use - do you want any more tests like this? I've
got lots going free (~600)!

-- George

[georgem at triptych yarv-0.2.0]$ testrb-yarv test/test_jump.rb --verbose
Loaded suite test_jump.rb
Started
test_(TestJump): .
test_break(TestJump): .
test_break_ensure_interaction1(TestJump): .
test_break_ensure_interaction2(TestJump): F
test_break_in_block_runs_ensure(TestJump): F
test_break_overrides_exception(TestJump): E
test_break_through_2_ensures(TestJump): F
test_complex_jump(TestJump): .
test_ensure_break_ensure(TestJump): F
test_ensure_exception(TestJump): F
test_ensure_normal_flow(TestJump): .
test_exception_and_break(TestJump): .
test_exception_overrides_break(TestJump): F
test_next(TestJump): .
test_next_in_block_runs_ensure(TestJump): F
test_next_with_val(TestJump): .
test_redo(TestJump): .
test_retry(TestJump): .
test_return(TestJump): .
test_return2(TestJump): .
test_return_from(TestJump): .
test_return_from_method_runs_ensure(TestJump): .
test_(YarvTestBase): .

Finished in 0.483567 seconds.

   1) Failure:
test_break_ensure_interaction2(TestJump)
     [./test/yarvtest.rb:29:in `ae'
      ./test/yarvtest.rb:52:in `ae_flow'
      ./test/test_jump.rb:287:in `test_break_ensure_interaction2']:
<[1, 2, 3, 5, 6, 7]> expected but was
<[1, 2, 3, 7]>.

   2) Failure:
test_break_in_block_runs_ensure(TestJump) [./test/test_jump.rb:236]:
<false> is not true.

   3) Error:
test_break_overrides_exception(TestJump):
SyntaxError: false
<*YARV eval*>:9: can't put break
     <*YARV eval*>:9:in `initialize'

   4) Failure:
test_break_through_2_ensures(TestJump) [./test/test_jump.rb:291]:
<false> is not true.

   5) Failure:
test_ensure_break_ensure(TestJump) [./test/test_jump.rb:305]:
<false> is not true.

   6) Failure:
test_ensure_exception(TestJump) [./test/test_jump.rb:227]:
<false> is not true.

   7) Failure:
test_exception_overrides_break(TestJump) [./test/test_jump.rb:331]:
<false> is not true.

   8) Failure:
test_next_in_block_runs_ensure(TestJump)
     [./test/yarvtest.rb:29:in `ae'
      ./test/yarvtest.rb:52:in `ae_flow'
      ./test/test_jump.rb:253:in `test_next_in_block_runs_ensure']:
<[1, 2, 3, 5, 2, 3, 5, 7]> expected but was
<[1, 2, 3, 2, 3, 7]>.

23 tests, 22 assertions, 7 failures, 1 errors



-------------- next part --------------
--- yarv-0.2.0.orig/test/test_jump.rb	Thu Mar 31 20:52:34 2005
+++ yarv-0.2.0/test/test_jump.rb	Mon Apr  4 20:55:37 2005
@@ -215,6 +215,129 @@
       m
     }
   end
+
+  def test_ensure_normal_flow
+    ae_flow %{ 
+      begin
+      ensure
+      end }
+  end
+
+  def test_ensure_exception
+    assert false
+    ae_flow %{ 
+      begin
+	raise StandardError
+      ensure
+      end }
+  end
+
+  def test_break_in_block_runs_ensure
+    assert false
+    ae_flow %{ 
+      [1,2].each do
+	begin
+	  break
+	ensure
+	end
+      end }
+  end
+
+  def test_next_in_block_runs_ensure
+    ae_flow %{ 
+      [1,2].each do
+	begin
+	  next
+	ensure
+	end
+      end }
+  end
+
+  def test_return_from_method_runs_ensure
+    ae_flow %{ 
+      o = "test"
+      def o.test(a)
+	return a
+      ensure
+      end
+      o.test(123) }
+  end
+
+  def test_break_ensure_interaction1
+    # make sure that any 'break state' set up in the VM is cleared by
+    # the time of the ensure
+    ae_flow %{ 
+      [1,2].each do
+	break
+      end
+      begin         
+      ensure
+      end }
+  end
+  
+  def test_break_ensure_interaction2
+    
+    # ditto, different arrangement	 
+    ae_flow %{ 
+      begin
+	[1,2].each do
+	  break
+	end
+      ensure
+	end }
+  end
+  
+  def test_break_through_2_ensures
+    assert false
+    ae_flow %{ 
+      [1,2].each do
+	begin
+	  begin
+	    break
+	  ensure
+	  end
+	ensure
+	end
+      end }
+  end
+  
+  def test_ensure_break_ensure
+    assert false
+    # break through an ensure; run 2nd normally
+    ae_flow %{ 
+      begin
+	[1,2].each do
+	  begin
+	    break
+	  ensure
+	  end
+	end
+      ensure
+      end }
+  end
+  
+  def test_break_overrides_exception
+    ae_flow %{ 
+      [1,2].each do
+	begin
+	  raise StandardError
+	ensure
+	  break
+	end
+      end }
+  end
+  
+  def test_exception_overrides_break
+    assert false
+    ae_flow %{ 
+      [1,2].each do
+	begin
+	  break
+	ensure
+	  raise StandardError
+	end
+      end }
+  end
   
 end
 
--- yarv-0.2.0.orig/test/yarvtest.rb	Thu Mar 31 20:52:34 2005
+++ yarv-0.2.0/test/yarvtest.rb	Mon Apr  4 20:52:56 2005
@@ -20,12 +20,38 @@
     # puts YARVUtil.parse(str, $0, 0).disasm
 
     ruby = YARVUtil.eval_in_wrap(str)
+#    puts str
+#    puts "Ruby => #{ruby.inspect}"
     yield if block_given?
     yarv = YARVUtil.eval(str)
     yield if block_given?
-
+#    puts "Yarv => #{yarv.inspect}"
     assert_equal(ruby, yarv)
   end
+
+  def ae_flow(src, for_value=true)
+    # Tracks flow through the code
+    # A test like
+    #   begin
+    #   ensure
+    #   end
+    # gets transformed into
+    #   a = []
+    #   begin
+    #     begin; a << 1
+    #     ensure; a << 2
+    #     end; a << 3
+    #   rescue Exception
+    #     a << 99
+    #   end
+    #   a
+    # before being run. This tracks control flow through the code.
+    
+    cnt = 0
+    src = src.gsub(/(\n|$)/) { "; a << #{cnt+=1}\n" }
+    ae("a = []; begin; #{src}; rescue Exception; a << 99; end; a")
+  end
+
 
   def test_
   end



More information about the Yarv-devel mailing list