Torsten Rüger
1ee01622c3
All preloading where it needs to be (some)tests for the preload split compiler test remembered binary tests (usually just run on travis)
73 lines
1.8 KiB
Ruby
73 lines
1.8 KiB
Ruby
require_relative 'helper'
|
|
|
|
module Mains
|
|
class TestArm < MiniTest::Test
|
|
@Qemu = "qemu-arm"
|
|
@Linker = "arm-linux-gnueabi-ld"
|
|
def self.Linker
|
|
@Linker
|
|
end
|
|
def self.Qemu
|
|
@Qemu
|
|
end
|
|
DEBUG = false
|
|
|
|
# runnable_methods is called by minitest to determine which tests to run
|
|
def self.runnable_methods
|
|
all = Dir["test/mains/source/*_*.rb"]
|
|
tests =[]
|
|
return tests unless has_qemu
|
|
all.each do |file_name|
|
|
fullname = file_name.split("/").last.split(".").first
|
|
name , stdout , exit_code = fullname.split("_")
|
|
method_name = "test_#{name}"
|
|
input = File.read(file_name)
|
|
tests << method_name
|
|
self.send(:define_method, method_name ) do
|
|
out , code = run_code(input , name)
|
|
assert_equal stdout , out , "Wrong stdout #{name}"
|
|
assert_equal exit_code , code.to_s , "Wrong exit code #{name}"
|
|
end
|
|
end
|
|
tests
|
|
end
|
|
|
|
def self.has_qemu
|
|
if `uname -a`.include?("torsten")
|
|
@Linker = "arm-linux-gnu-ld"
|
|
return false unless DEBUG
|
|
end
|
|
begin
|
|
`#{@Qemu} -version`
|
|
`#{@Linker} -v`
|
|
rescue => e
|
|
puts e
|
|
return false
|
|
end
|
|
true
|
|
end
|
|
|
|
def run_code(input , name )
|
|
puts "Compiling #{name}.o" if DEBUG
|
|
code = Vool::Builtin.builtin_code + input
|
|
|
|
linker = ::RubyX::RubyXCompiler.new({}).ruby_to_binary( code , :arm )
|
|
writer = Elf::ObjectWriter.new(linker)
|
|
|
|
writer.save "mains.o"
|
|
|
|
puts "Linking #{name}" if DEBUG
|
|
|
|
`#{TestArm.Linker} -N mains.o`
|
|
assert_equal 0 , $?.exitstatus , "Linking #{name} failed #{$?}"
|
|
|
|
puts "Running #{name}" if DEBUG
|
|
stdout = `#{TestArm.Qemu} ./a.out`
|
|
exit_code = $?.exitstatus
|
|
puts "Result #{stdout} #{exit_code}" if DEBUG
|
|
return stdout , exit_code
|
|
end
|
|
|
|
end
|
|
end
|