summaryrefslogtreecommitdiff
path: root/jni/ruby/test/-ext-/iseq_load/test_iseq_load.rb
diff options
context:
space:
mode:
authorJari Vetoniemi <jari.vetoniemi@indooratlas.com>2020-03-16 18:49:26 +0900
committerJari Vetoniemi <jari.vetoniemi@indooratlas.com>2020-03-30 00:39:06 +0900
commitfcbf63e62c627deae76c1b8cb8c0876c536ed811 (patch)
tree64cb17de3f41a2b6fef2368028fbd00349946994 /jni/ruby/test/-ext-/iseq_load/test_iseq_load.rb
Fresh start
Diffstat (limited to 'jni/ruby/test/-ext-/iseq_load/test_iseq_load.rb')
-rw-r--r--jni/ruby/test/-ext-/iseq_load/test_iseq_load.rb95
1 files changed, 95 insertions, 0 deletions
diff --git a/jni/ruby/test/-ext-/iseq_load/test_iseq_load.rb b/jni/ruby/test/-ext-/iseq_load/test_iseq_load.rb
new file mode 100644
index 0000000..5bbd49e
--- /dev/null
+++ b/jni/ruby/test/-ext-/iseq_load/test_iseq_load.rb
@@ -0,0 +1,95 @@
+require 'test/unit'
+
+class TestIseqLoad < Test::Unit::TestCase
+ require '-test-/iseq_load/iseq_load'
+ ISeq = RubyVM::InstructionSequence
+
+ def test_bug8543
+ assert_iseq_roundtrip <<-'end;'
+ puts "tralivali"
+ def funct(a, b)
+ a**b
+ end
+ 3.times { |i| puts "Hello, world#{funct(2,i)}!" }
+ end;
+ end
+
+ def test_case_when
+ assert_iseq_roundtrip <<-'end;'
+ def user_mask(target)
+ target.each_char.inject(0) do |mask, chr|
+ case chr
+ when "u"
+ mask | 04700
+ when "g"
+ mask | 02070
+ when "o"
+ mask | 01007
+ when "a"
+ mask | 07777
+ else
+ raise ArgumentError, "invalid `who' symbol in file mode: #{chr}"
+ end
+ end
+ end
+ end;
+ end
+
+ def test_splatsplat
+ assert_iseq_roundtrip('def splatsplat(**); end')
+ end
+
+ def test_hidden
+ assert_iseq_roundtrip('def x(a, (b, *c), d: false); end')
+ end
+
+ def assert_iseq_roundtrip(src)
+ a = ISeq.compile(src).to_a
+ b = ISeq.iseq_load(a).to_a
+ warn diff(a, b) if a != b
+ assert_equal a, b
+ assert_equal a, ISeq.iseq_load(b).to_a
+ end
+
+ def test_next_in_block_in_block
+ skip "failing due to stack_max mismatch"
+ assert_iseq_roundtrip <<-'end;'
+ 3.times { 3.times { next } }
+ end;
+ end
+
+ def test_break_ensure
+ skip "failing due to exception entry sp mismatch"
+ assert_iseq_roundtrip <<-'end;'
+ def m
+ bad = true
+ while true
+ begin
+ break
+ ensure
+ bad = false
+ end
+ end
+ end
+ end;
+ end
+
+ # FIXME: still failing
+ def test_require_integration
+ skip "iseq loader require integration tests still failing"
+ f = File.expand_path(__FILE__)
+ # $(top_srcdir)/test/ruby/test_....rb
+ 3.times { f = File.dirname(f) }
+ Dir[File.join(f, 'ruby', '*.rb')].each do |f|
+ iseq = ISeq.compile_file(f)
+ orig = iseq.to_a.freeze
+
+ loaded = ISeq.iseq_load(orig).to_a
+ if loaded != orig
+ warn f
+ warn diff(orig, loaded)
+ end
+ #assert_equal orig, loaded
+ end
+ end
+end