rubyx/test/mom/helper.rb
Torsten Ruger 393ac873c9 change return sequence to return messages to space
as it was before blocks
(thought blocks would make reuse of messages impossible, but was wrong, this only appilies to lambdas)
(too) many tests affected
2018-08-06 14:07:17 +03:00

73 lines
2.3 KiB
Ruby

require_relative '../helper'
module Risc
module Statements
def setup
Parfait.boot!
Risc::Builtin.boot_functions
end
def preamble
[ Label ]
end
def postamble
[Label, SlotToReg, SlotToReg, RegToSlot, LoadConstant ,
SlotToReg, RegToSlot, RegToSlot, SlotToReg, SlotToReg,
SlotToReg , FunctionReturn, Label]
end
# test hack to in place change object type
def add_space_field(name,type)
class_type = Parfait.object_space.get_type_by_class_name(:Space)
class_type.send(:private_add_instance_variable, name , type)
end
def produce_body
produced = produce_instructions
preamble.each{ produced = produced.next }
produced
end
def as_test_main
"class Test; def main(arg);#{@input};end;end"
end
def produce_instructions
assert @expect , "No output given"
linker = RubyX::RubyXCompiler.new(as_test_main).ruby_to_risc(:interpreter)
compiler = linker.assemblers.find{|c| c.callable.name == :main and c.callable.self_type.object_class.name == :Test}
compiler.instructions
end
def check_nil
produced = produce_instructions
compare_instructions( produced , @expect)
end
def check_return
was = check_nil
raise was if was
test = Parfait.object_space.get_class_by_name :Test
test.instance_type.get_method :main
end
def compare_instructions( instruction , expect )
index = 0
all = instruction.to_arr
full_expect = preamble + expect + postamble
#full_expect = expect
begin
should = full_expect[index]
return "No instruction at #{index-1}\n#{should(all)[0..100]}" unless should
return "Expected at #{index-1}\n#{should(all)} was #{instruction.to_s[0..100]}" unless instruction.class == should
#puts "#{index-1}:#{instruction.to_s}" if (index > preamble.length) and (index + postamble.length <= full_expect.length)
index += 1
instruction = instruction.next
end while( instruction )
nil
end
def should( all )
preamble.each {all.shift}
postamble.each {all.pop}
str = all.collect{|i| i.class.name}.join(", ").gsub("Risc::","")
str = "[#{str}]"
all = str.split(",").each_slice(5).collect { |line| " " + line.join(",")}
all.join(",\n")
end
end
end