[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