rubyx/test/risc/test_interpreter_platform.rb
Torsten Ruger 8322fca7b3 give labels an integer that will end up being the position at runtime
Since integers are first class objects, we need to use an integer object
as the return address. The actual address can not be stored in an
instance variable since it is not an object.
The address is unique to the label and never changes after positioning
(using the int is next up)
2018-05-29 20:26:00 +03:00

68 lines
1.8 KiB
Ruby

require_relative "helper"
module Risc
class TestInterpreterPlatform < MiniTest::Test
def setup
@inter = Platform.for("Interpreter")
end
def test_platform_class
assert_equal Risc::InterpreterPlatform , @inter.class
end
def test_platform_translator_class
assert_equal Risc::IdentityTranslator , @inter.translator.class
end
def test_platform_loaded_class
assert_equal Fixnum , @inter.loaded_at.class
end
def test_translator
assert IdentityTranslator.new
end
end
class TestIdentityTranslator < MiniTest::Test
def setup
@machine = Risc.machine.boot
@translator = IdentityTranslator.new
end
def test_load_translates_label
label = Risc.label("test" , "test",nil)
load = Risc.load_constant("source" , label , :r1)
translated = @translator.translate(load)
assert label != translated.constant
end
def test_translate_first_label
label = Parfait.object_space.get_main.risc_instructions
assert_equal "Space_Type.main" ,label.to_cpu(@translator).name , label
end
def test_translate_space
assert @machine.translate(:interpreter)
end
def test_no_loops_in_chain
@machine.translate(:interpreter)
@machine.position_all
init = Parfait.object_space.get_init
all = []
init.cpu_instructions.each do |ins|
assert !all.include?(ins)
all << ins
end
end
def test_no_risc
@machine.translate(:interpreter)
@machine.position_all
@machine.create_binary
@machine.objects.each do |id , method|
next unless method.is_a? Parfait::TypedMethod
method.cpu_instructions.each do |ins|
ins.assemble(DevNull.new)
end
end
end
end
end