aboutsummaryrefslogtreecommitdiffstats
path: root/yarvtest/yarvtest.rb
diff options
context:
space:
mode:
Diffstat (limited to 'yarvtest/yarvtest.rb')
-rw-r--r--yarvtest/yarvtest.rb136
1 files changed, 136 insertions, 0 deletions
diff --git a/yarvtest/yarvtest.rb b/yarvtest/yarvtest.rb
new file mode 100644
index 0000000000..906af727b4
--- /dev/null
+++ b/yarvtest/yarvtest.rb
@@ -0,0 +1,136 @@
+require 'test/unit'
+
+if defined? YARV_PATCHED
+require 'yarvutil'
+
+class YarvTestBase < Test::Unit::TestCase
+
+ def remove_const sym
+ Object.module_eval{
+ remove_const sym
+ }
+ end
+
+ def remove_method sym
+ Object.module_eval{
+ undef sym
+ }
+ end
+
+ def ae str
+ # puts str
+ # puts YARVUtil.parse(str, $0, 0).disasm
+
+ ruby = YARVUtil.eval_in_wrap(str)
+ yield if block_given?
+
+ yarv = YARVUtil.eval(str)
+ yield if block_given?
+
+ assert_equal(ruby, yarv)
+ end
+
+ def test_
+ end
+
+end
+
+else
+
+require 'rbconfig'
+class YarvTestBase < Test::Unit::TestCase
+ def initialize *args
+ super
+
+ if /mswin32/ !~ RUBY_PLATFORM
+ @yarv = './miniruby'
+ else
+ @yarv = 'miniruby'
+ end
+ @ruby = Config::CONFIG['ruby_install_name']
+ end
+
+ def remove_const sym
+ Object.module_eval{
+ remove_const sym
+ }
+ end
+
+ def remove_method sym
+ Object.module_eval{
+ undef sym
+ }
+ end
+
+ require 'tempfile'
+ def exec exec_file, program
+ dir = []
+ dir << ENV['RAMDISK'] if ENV['RAMDISK']
+ tmpf = Tempfile.new("yarvtest_#{Process.pid}_#{Time.now.to_i}", *dir)
+ tmpf.write program
+ tmpf.close
+ result = `#{exec_file} #{tmpf.path}`
+ tmpf.open
+ tmpf.close(true)
+ result
+ end
+
+ def dump_and_exec exec_file, str
+ asmstr = <<-EOASMSTR
+ iseq = YARVCore::InstructionSequence.compile(<<-'EOS__')
+ #{str}
+ EOS__
+ p YARVCore::InstructionSequence.load(iseq.to_a).eval
+ EOASMSTR
+
+ exec(exec_file, asmstr)
+ end
+
+ def exec_ exec_file, program
+ exec_file.tr!('\\', '/')
+ r = ''
+ IO.popen("#{exec_file}", 'r+'){|io|
+ #
+ io.write program
+ io.close_write
+ begin
+ while line = io.gets
+ r << line
+ # p line
+ end
+ rescue => e
+ # p e
+ end
+ }
+ r
+ end
+
+ def ae str
+ evalstr = %{
+ p eval(%q{
+ #{str}
+ })
+ }
+
+ ruby = exec(@ruby, evalstr)
+ yarv = exec(@yarv, evalstr)
+
+ if $DEBUG #|| true
+ puts "yarv (#@yarv): #{yarv}"
+ puts "ruby (#@ruby): #{ruby}"
+ end
+
+ assert_equal(ruby.gsub(/\r/, ''), yarv.gsub(/\r/, ''))
+
+ # store/load test
+ if false # || true
+ yarvasm = dump_and_exec(@yarv, str)
+ assert_equal(ruby.gsub(/\r/, ''), yarvasm.gsub(/\r/, ''))
+ end
+ end
+
+ def test_
+ end
+end
+
+end