2014-04-28 11:19:28 +03:00
|
|
|
require_relative 'helper'
|
2014-05-03 15:13:44 +03:00
|
|
|
require "yaml"
|
2014-05-08 19:31:36 +03:00
|
|
|
require "parslet/convenience"
|
2014-04-28 11:19:28 +03:00
|
|
|
class TestRunner < MiniTest::Test
|
|
|
|
|
|
|
|
# this creates test methods dynamically , one for each file in runners directory
|
|
|
|
def self.runnable_methods
|
|
|
|
methods = []
|
2014-04-28 16:47:12 +03:00
|
|
|
Dir[File.join(File.dirname(__FILE__) , "runners" , "*.rb")].each do |file|
|
2014-04-28 11:19:28 +03:00
|
|
|
meth = File.basename(file).split(".").first
|
|
|
|
name = "test_#{meth}"
|
|
|
|
methods << name
|
|
|
|
self.send(:define_method, name ) {
|
|
|
|
execute file
|
|
|
|
}
|
|
|
|
end
|
|
|
|
methods
|
|
|
|
end
|
|
|
|
|
|
|
|
def execute file
|
|
|
|
string = File.read(file)
|
2017-01-02 00:29:20 +02:00
|
|
|
parser = Parser::RubyX.new
|
2014-08-22 18:00:23 +03:00
|
|
|
object_space = Register::Program.new "Arm"
|
2016-12-08 19:39:16 +02:00
|
|
|
#TODO : files would have to include s-expressions now
|
2015-11-19 10:10:13 +02:00
|
|
|
syntax = parser.parse_with_debug(string, reporter: Parslet::ErrorReporter::Deepest.new)
|
2014-05-19 11:29:18 +03:00
|
|
|
assert syntax
|
2014-05-10 11:23:45 +03:00
|
|
|
parts = Parser::Transform.new.apply(syntax)
|
2015-10-09 17:51:14 +03:00
|
|
|
# file is a list of statements, all but the last must be a function
|
2014-05-10 11:23:45 +03:00
|
|
|
# and the last is wrapped as a main
|
2014-05-10 10:59:36 +03:00
|
|
|
parts.each_with_index do |part,index|
|
2014-05-14 12:02:54 +03:00
|
|
|
if index == (parts.length - 1)
|
2014-06-10 23:57:56 +03:00
|
|
|
expr = part.compile( program.context )
|
2014-05-14 12:02:54 +03:00
|
|
|
else
|
2014-06-10 23:57:56 +03:00
|
|
|
expr = part.compile( program.context )
|
2014-08-22 18:00:23 +03:00
|
|
|
raise "should be function definition for now" unless expr.is_a? Register::Function
|
2014-05-10 10:59:36 +03:00
|
|
|
end
|
|
|
|
end
|
2014-05-05 11:03:43 +03:00
|
|
|
|
2015-05-16 12:53:10 +03:00
|
|
|
#object writer takes machine
|
2014-05-19 17:32:41 +03:00
|
|
|
writer = Elf::ObjectWriter.new(program , Elf::Constants::TARGET_ARM)
|
2014-05-05 15:59:29 +03:00
|
|
|
|
2014-05-05 22:21:11 +03:00
|
|
|
writer.save(file.gsub(".rb" , ".o"))
|
2014-05-05 15:59:29 +03:00
|
|
|
|
2014-05-10 10:59:36 +03:00
|
|
|
# puts program.to_yaml
|
2014-04-28 11:19:28 +03:00
|
|
|
end
|
|
|
|
|
2015-05-16 12:53:10 +03:00
|
|
|
end
|