rubyx/test/risc/test_builder.rb
Torsten Ruger 1132309f6a unify space collection attribute naming
currently space is still acting as a sort of memory manager.
For proper linking, all objects must be reachable from space, hence the plural versions like messages and addresses (even they are instances, it is the list that is important)
To dish out instance to use, the head must be kept, ie next_XXX for intergers, return addresses and messages
2018-07-02 15:49:51 +03:00

117 lines
3.4 KiB
Ruby

require_relative "../helper"
module Risc
class TestCodeBuilder < MiniTest::Test
def setup
Parfait.boot!
Risc.boot!
init = Parfait.object_space.get_init
@builder = Risc::MethodCompiler.new( init ).code_builder(init)
@label = Risc.label("source","name")
end
def test_has_build
assert @builder.respond_to?(:build)
end
def test_has_attribute
assert_nil @builder.built
end
def test_alloc_space
reg = @builder.space
assert_equal RegisterValue , reg.class
assert_equal :Space , reg.type
end
def test_next_message
reg = @builder.next_message
assert_equal :r1 , reg.symbol
assert_equal :Message , reg.type
end
def test_message
reg = @builder.message
assert_equal :r0 , reg.symbol
assert_equal :Message , reg.type
end
def test_returns_built
r1 = RegisterValue.new(:r1 , :Space)
built = @builder.build{ space << r1 }
assert_equal Transfer , built.class
end
def test_returns_two
r1 = RegisterValue.new(:r1 , :Space)
built = @builder.build{ space << r1 ; space << r1}
assert_equal Transfer , built.next.class
end
def test_returns_slot
r2 = RegisterValue.new(:r2 , :Message)
r2.builder = @builder
built = @builder.build{ r2 << space[:next_message] }
assert_equal SlotToReg , built.class
assert_equal :r1 , built.array.symbol
end
def test_returns_slot_reverse
r2 = RegisterValue.new(:r2 , :Message)
r2.builder = @builder
built = @builder.build{ r2 << space[:next_message] }
assert_equal SlotToReg , built.class
assert_equal :r1 , built.array.symbol
end
def test_reuses_names
r1 = RegisterValue.new(:r1 , :Space)
built = @builder.build{ space << r1 ; space << r1}
assert_equal built.to.symbol , built.next.to.symbol
end
def test_uses_message_as_message
r1 = RegisterValue.new(:r1 , :Space)
built = @builder.build{ message[:receiver] << r1}
assert_equal RegToSlot , built.class
assert_equal :r0 , built.array.symbol
end
def test_label
label = @builder.exit_label
assert_equal Label , label.class
assert label.name.index("exit")
end
def test_two_label
label1 = @builder.exit_label
label2 = @builder.exit_label
assert_equal label1 , label2
end
def test_if_zero
ret = @builder.if_zero @label
assert_equal IsZero , ret.class
assert_equal @label , ret.label
end
def test_if_not_zero
ret = @builder.if_not_zero @label
assert_equal IsNotZero , ret.class
assert_equal @label , ret.label
end
def test_branch
ret = @builder.branch @label
assert_equal Branch , ret.class
assert_equal @label , ret.label
end
def test_minus
op = @builder.build {space - typed_method}
assert_equal OperatorInstruction , op.class
assert_equal :- , op.operator
assert_equal :Space , op.left.type
end
end
class TestCompilerBuilder < MiniTest::Test
def setup
Parfait.boot!
Risc.boot!
@init = Parfait.object_space.get_init
@builder = Risc::MethodCompiler.new( @init ).compiler_builder(@init)
end
def test_inserts_built
r1 = RegisterValue.new(:r1 , :Space)
@builder.build{ space << r1 }
assert_equal Transfer , @init.risc_instructions.next.class , @init.risc_instructions.next
end
end
end