diff --git a/test/slot_machine/macro/helper.rb b/test/slot_machine/macro/helper.rb index fd37eba9..ce5bdd3f 100644 --- a/test/slot_machine/macro/helper.rb +++ b/test/slot_machine/macro/helper.rb @@ -12,6 +12,50 @@ module SlotMachine @method end + def risc(at) + @risc_i = @method.to_risc.risc_instructions unless @risc_i + return @risc_i if at == 0 + @risc_i.next( at ) + end + + def assert_return(at) + assert_label risc(at) , "return_label" + assert_slot_to_reg risc(at + 1) , :r0 , 5 , :r1 + assert_slot_to_reg risc(at + 2) , :r0 , 6 , :r2 + assert_reg_to_slot risc(at + 3) ,:r1 , :r2 , 5 + assert_slot_to_reg risc(at + 4) , :r0 , 4 , :r3 + assert_slot_to_reg risc(at + 5) , :r3 , 2 , :r3 + assert_slot_to_reg risc(at + 6) , :r0 , 6 , :r0 + assert_equal Risc::FunctionReturn , risc(at + 7).class + assert_label risc(at + 8) , "unreachable" + end + def assert_allocate + assert_load risc(1) , Parfait::Factory + assert_slot_to_reg risc(2) , :r2 , 2 , :r1 + assert_load risc(3) , Parfait::NilClass + assert_operator risc(4) , :- , :r3 , :r1 + assert_equal Risc::IsNotZero , risc(5).class + assert risc(5).label.name.to_s.start_with?("cont_label") + assert_slot_to_reg risc(6) , :r2 , 3 , :r4 + assert_reg_to_slot risc(7) ,:r4 , :r2 , 2 + assert_load risc(8) , Parfait::CallableMethod + assert_slot_to_reg risc(9) , :r0 , 1 , :r6 + assert_reg_to_slot risc(10) , :r5 , :r6 , 7 + assert_load risc(11) , Parfait::Factory + assert_reg_to_slot risc(12) , :r7 , :r0 , 2 + assert_load risc(13) , Risc::Label + assert_slot_to_reg risc(14) , :r0 , 1 , :r9 + assert_slot_to_reg risc(14),:r0,1,:r9 + assert_reg_to_slot risc(15),:r8,:r9,4 + assert_slot_to_reg risc(16),:r0 , 1 , :r0 + assert_equal Risc::FunctionCall, risc(17).class + assert_equal :main, risc(17).method.name + assert_label risc(18) , "continue_" + assert_slot_to_reg risc(19) , :r2 , 2 , :r1 + assert_label risc(20) ,"cont_label_" + assert_slot_to_reg risc(21) , :r1 , 1 , :r4 + assert_reg_to_slot risc(22) , :r4 , :r2 , 2 + end end end end diff --git a/test/slot_machine/macro/test_comparison.rb b/test/slot_machine/macro/test_comparison.rb index b94361d7..1a0a7ebe 100644 --- a/test/slot_machine/macro/test_comparison.rb +++ b/test/slot_machine/macro/test_comparison.rb @@ -32,6 +32,27 @@ module SlotMachine def test_risc_length assert_equal 24 , @method.to_risc.risc_instructions.length end + def test_all + assert_slot_to_reg risc(1),:r0 , 2 , :r1 + assert_slot_to_reg risc(2),:r1 , 2 , :r1 + assert_slot_to_reg risc(3),:r0 , 9 , :r2 + assert_slot_to_reg risc(4),:r2 , 2 , :r2 + assert_operator risc(5) , :- , :r1 , :r2 + assert_minus risc(6) , "false_label_" + assert_zero risc(7) , "false_label_" + assert_load risc(8) , Parfait::TrueClass + assert_branch risc(9) , "merge_label_" + assert_label risc(10) , "false_label_" + assert_load risc(11) , Parfait::FalseClass + assert_label risc(12) , "merge_label_" + assert_reg_to_slot risc(13) , :r3 , :r0 , 5 + assert_slot_to_reg risc(14),:r0 , 5 , :r2 + assert_reg_to_slot risc(15) , :r2 , :r0 , 5 + assert_branch risc(16) , "return_label" + end + def test_return + assert_return(17) + end end end end diff --git a/test/slot_machine/macro/test_div10.rb b/test/slot_machine/macro/test_div10.rb index 88891b3b..389d1c37 100644 --- a/test/slot_machine/macro/test_div10.rb +++ b/test/slot_machine/macro/test_div10.rb @@ -16,6 +16,52 @@ module SlotMachine def test_risc_length assert_equal 69 , @method.to_risc.risc_instructions.length end + def test_allocate + assert_allocate + end + def test_return + assert_return(61) + end + def test_all + assert_slot_to_reg risc(23) , :r0 , 2 , :r2 + assert_slot_to_reg risc(24) , :r2 , 2 , :r2 + assert_transfer risc(25) , :r2 , :r3 + assert_transfer risc(26) , :r2 , :r4 + assert_data risc(27) , 1 + assert_operator risc(28) , :>> , :r3 , :r5 + assert_data risc(29) , 2 + assert_operator risc(30) , :>> , :r4 , :r5 + assert_operator risc(31) , :+ , :r4 , :r3 + assert_data risc(32) , 4 + assert_transfer risc(33) , :r4 , :r3 + assert_operator risc(34) , :>> , :r4 , :r3 + assert_operator risc(35) , :+ , :r4 , :r3 + assert_data risc(36) , 8 + assert_transfer risc(37) , :r4 , :r3 + assert_operator risc(38) , :>> , :r3 , :r5 + assert_operator risc(39) , :+ , :r4 , :r3 + assert_data risc(40) , 16 + assert_transfer risc(41) , :r4 , :r3 + assert_operator risc(42) , :>> , :r3 , :r5 + assert_operator risc(43) , :+ , :r4 , :r3 + assert_data risc(44) , 3 + assert_operator risc(45) , :>> , :r4 , :r5 + assert_data risc(46) , 10 + assert_transfer risc(47) , :r4 , :r3 + assert_operator risc(48) , :* , :r3 , :r5 + assert_operator risc(49) , :- , :r2 , :r3 + assert_transfer risc(50) , :r2 , :r3 + assert_data risc(51) , 6 + assert_operator risc(52) , :+ , :r3 , :r5 + assert_data risc(53) , 4 + assert_operator risc(54) , :>> , :r3 , :r5 + assert_operator risc(55) , :+ , :r4 , :r3 + assert_reg_to_slot risc(56) , :r4 , :r1 , 2 + assert_reg_to_slot risc(57) , :r1 , :r0 , 5 + assert_slot_to_reg risc(58),:r0 , 5 , :r2 + assert_reg_to_slot risc(59) , :r2 , :r0 , 5 + assert_branch risc(60) , "return_label" + end end end end diff --git a/test/slot_machine/macro/test_div4.rb b/test/slot_machine/macro/test_div4.rb index 39d7c00d..13cf9281 100644 --- a/test/slot_machine/macro/test_div4.rb +++ b/test/slot_machine/macro/test_div4.rb @@ -17,6 +17,23 @@ module SlotMachine def test_risc_length assert_equal 41 , @method.to_risc.risc_instructions.length end + def test_allocate + assert_allocate + end + def test_return + assert_return(32) + end + def test_all + assert_slot_to_reg risc(23) , :r0 , 2 , :r2 + assert_slot_to_reg risc(24) , :r2 , 2 , :r2 + assert_data risc(25) , 2 + assert_operator risc(26) , :>> , :r2 , :r3 + assert_reg_to_slot risc(27) ,:r2 , :r1 , 2 + assert_reg_to_slot risc(28) ,:r1 , :r0 , 5 + assert_slot_to_reg risc(29) , :r0 , 5 , :r2 + assert_reg_to_slot risc(30) ,:r2 , :r0 , 5 + assert_branch risc(31) , "return_label" + end end end end diff --git a/test/slot_machine/macro/test_exit.rb b/test/slot_machine/macro/test_exit.rb index 61049eff..dbc0a10f 100644 --- a/test/slot_machine/macro/test_exit.rb +++ b/test/slot_machine/macro/test_exit.rb @@ -17,6 +17,24 @@ module SlotMachine def test_risc_length assert_equal 40 , @method.to_risc.risc_instructions.length end + def test_allocate + assert_allocate + end + def test_all + assert_reg_to_slot risc(23) , :r1 , :r0 , 5 + assert_transfer risc(24) , :r0 , :r8 + assert_slot_to_reg risc(25),:r0 , 5 , :r0 + assert_slot_to_reg risc(26),:r0 , 2 , :r0 + assert_equal Risc::Syscall, risc(27).class + assert_equal :exit , risc(27).name + assert_slot_to_reg risc(28),:r0 , 5 , :r2 + assert_reg_to_slot risc(29) , :r2 , :r0 , 5 + assert_branch risc(30) , "return_label" + assert_label risc(31) , "return_label" + end + def test_return + assert_return(31) + end end end end diff --git a/test/slot_machine/macro/test_get_internal_byte.rb b/test/slot_machine/macro/test_get_internal_byte.rb index fe80106b..12f92c04 100644 --- a/test/slot_machine/macro/test_get_internal_byte.rb +++ b/test/slot_machine/macro/test_get_internal_byte.rb @@ -17,6 +17,31 @@ module SlotMachine def test_risc_length assert_equal 41 , @method.to_risc.risc_instructions.length end + def test_allocate + assert_allocate + end + def test_all + assert_slot_to_reg risc(23),:r0 , 2 , :r2 + assert_slot_to_reg risc(24),:r0 , 9 , :r3 + assert_slot_to_reg risc(25),:r3 , 2 , :r3 + + assert_equal Risc::ByteToReg , risc(26).class + assert_equal :r2 , risc(26).array.symbol + assert_equal :r2 , risc(26).register.symbol + assert_equal :r3 , risc(26).index.symbol + + + assert_reg_to_slot risc(27) , :r2 , :r1 , 2 + assert_reg_to_slot risc(28) , :r1 , :r0 , 5 + assert_slot_to_reg risc(29),:r0 , 5 , :r2 + assert_reg_to_slot risc(30) , :r2 , :r0 , 5 + + assert_branch risc(31) , "return_label" + assert_label risc(32) , "return_label" + end + def test_return + assert_return(32) + end end end end diff --git a/test/slot_machine/macro/test_get_internal_word.rb b/test/slot_machine/macro/test_get_internal_word.rb index 27063b4a..42c79082 100644 --- a/test/slot_machine/macro/test_get_internal_word.rb +++ b/test/slot_machine/macro/test_get_internal_word.rb @@ -17,6 +17,20 @@ module SlotMachine def test_risc_length assert_equal 18 , @method.to_risc.risc_instructions.length end + def test_all + assert_slot_to_reg risc(1),:r0 , 2 , :r1 + assert_slot_to_reg risc(2),:r0 , 9 , :r2 + assert_slot_to_reg risc(3),:r2 , 2 , :r2 + assert_slot_to_reg risc(4),:r1 , :r2 , :r1 + assert_reg_to_slot risc(5) , :r1 , :r0 , 5 + assert_slot_to_reg risc(6),:r0 , 5 , :r2 + assert_reg_to_slot risc(7) , :r2 , :r0 , 5 + assert_branch risc(8) , "return_label" + assert_label risc(9) , "return_label" + end + def test_return + assert_return(9) + end end end end diff --git a/test/slot_machine/macro/test_init.rb b/test/slot_machine/macro/test_init.rb index 5489538e..f9791f6e 100644 --- a/test/slot_machine/macro/test_init.rb +++ b/test/slot_machine/macro/test_init.rb @@ -18,6 +18,28 @@ module SlotMachine def test_risc_length assert_equal 19 , @method.to_risc.risc_instructions.length end + def test_all + assert_load risc(1) , Parfait::Factory + assert_slot_to_reg risc(2) , :r1 , 2 , :r0 + assert_slot_to_reg risc(3),:r0 , 1 , :r2 + assert_reg_to_slot risc(4) , :r2 , :r1 , 2 + assert_load risc(5) , Parfait::CallableMethod + assert_slot_to_reg risc(6),:r0 , 1 , :r2 + assert_reg_to_slot risc(7) , :r1 , :r2 , 7 + assert_slot_to_reg risc(8),:r0 , 1 , :r0 + assert_load risc(9) , Parfait::Space + assert_reg_to_slot risc(10) , :r3 , :r0 , 2 + assert_load risc(11) , Risc::Label + assert_reg_to_slot risc(12) , :r4 , :r0 , 4 + assert_equal Risc::FunctionCall, risc(13).class + assert_equal :main, risc(13).method.name + assert_label risc(14) , "Object.__init__" + assert_transfer risc(15) , :r0 , :r8 + assert_slot_to_reg risc(16),:r0 , 5 , :r0 + assert_slot_to_reg risc(17),:r0 , 2 , :r0 + assert_equal Risc::Syscall, risc(18).class + assert_equal :exit, risc(18).name + end end end end diff --git a/test/slot_machine/macro/test_method_missing.rb b/test/slot_machine/macro/test_method_missing.rb index a252bd19..3e41d233 100644 --- a/test/slot_machine/macro/test_method_missing.rb +++ b/test/slot_machine/macro/test_method_missing.rb @@ -16,6 +16,18 @@ module SlotMachine def test_risc_length assert_equal 15 , @method.to_risc.risc_instructions.length end + def test_all + assert_transfer risc(1) , :r1 , :r1 + assert_equal Risc::Syscall, risc(2).class + assert_slot_to_reg risc(3),:r0 , 5 , :r2 + assert_slot_to_reg risc(3),:r0 , 5 , :r2 + assert_reg_to_slot risc(4) , :r2 , :r0 , 5 + assert_branch risc(5) , "return_label" + assert_label risc(6) , "return_label" + end + def test_return + assert_return(6) + end end end end diff --git a/test/slot_machine/macro/test_operator.rb b/test/slot_machine/macro/test_operator.rb index 1602f1ce..ec55b49a 100644 --- a/test/slot_machine/macro/test_operator.rb +++ b/test/slot_machine/macro/test_operator.rb @@ -31,6 +31,25 @@ module SlotMachine def test_risc_length assert_equal 42 , @method.to_risc.risc_instructions.length end + def test_allocate + assert_allocate + end + def test_all + assert_slot_to_reg risc(23),:r0 , 2 , :r2 + assert_slot_to_reg risc(24),:r2 , 2 , :r2 + assert_slot_to_reg risc(25),:r0 , 9 , :r3 + assert_slot_to_reg risc(26),:r3 , 2 , :r3 + assert_operator risc(27) , :| , :r2 , :r3 + assert_reg_to_slot risc(28) , :r2 , :r1 , 2 + assert_reg_to_slot risc(29) , :r1 , :r0 , 5 + assert_slot_to_reg risc(30),:r0 , 5 , :r2 + assert_reg_to_slot risc(31) , :r2 , :r0 , 5 + assert_branch risc(32) , "return_label" + assert_label risc(33) , "return_label" + end + def test_return + assert_return(33) + end end end end diff --git a/test/slot_machine/macro/test_putstring.rb b/test/slot_machine/macro/test_putstring.rb index 9fee8c08..bee638ee 100644 --- a/test/slot_machine/macro/test_putstring.rb +++ b/test/slot_machine/macro/test_putstring.rb @@ -16,6 +16,27 @@ module SlotMachine def test_risc_length assert_equal 44 , @method.to_risc.risc_instructions.length end + def test_allocate + assert_allocate + end + def test_all + assert_reg_to_slot risc(23) , :r1 , :r0 , 5 + assert_slot_to_reg risc(24),:r0 , 2 , :r1 + assert_slot_to_reg risc(25),:r1 , 1 , :r2 + assert_transfer risc(26) , :r0 , :r8 + assert_equal Risc::Syscall, risc(27).class + assert_transfer risc(28) , :r0 , :r3 + assert_transfer risc(29) , :r8 , :r0 + assert_slot_to_reg risc(30),:r0 , 5 , :r4 + assert_reg_to_slot risc(31) , :r3 , :r4 , 2 + assert_slot_to_reg risc(32),:r0 , 5 , :r2 + assert_reg_to_slot risc(33) , :r2 , :r0 , 5 + assert_branch risc(34) , "return_label" + assert_label risc(35) , "return_label" + end + def test_return + assert_return(35) + end end end end diff --git a/test/slot_machine/macro/test_set_internal_byte.rb b/test/slot_machine/macro/test_set_internal_byte.rb index a1a53ff1..9b4ac1f5 100644 --- a/test/slot_machine/macro/test_set_internal_byte.rb +++ b/test/slot_machine/macro/test_set_internal_byte.rb @@ -17,6 +17,22 @@ module SlotMachine def test_risc_length assert_equal 20 , @method.to_risc.risc_instructions.length end + def test_all + assert_slot_to_reg risc(1),:r0 , 2 , :r1 + assert_slot_to_reg risc(2),:r0 , 10 , :r2 + assert_reg_to_slot risc(3) , :r2 , :r0 , 5 + assert_slot_to_reg risc(4),:r0 , 9 , :r3 + assert_slot_to_reg risc(5),:r3 , 2 , :r3 + assert_slot_to_reg risc(6),:r2 , 2 , :r2 + assert_equal Risc::RegToByte , risc(7).class + assert_slot_to_reg risc(8),:r0 , 5 , :r2 + assert_reg_to_slot risc(9) , :r2 , :r0 , 5 + assert_branch risc(10) , "return_label" + assert_label risc(11) , "return_label" + end + def test_return + assert_return(11) + end end end end diff --git a/test/slot_machine/macro/test_set_internal_word.rb b/test/slot_machine/macro/test_set_internal_word.rb index a809b2a0..f8f81dec 100644 --- a/test/slot_machine/macro/test_set_internal_word.rb +++ b/test/slot_machine/macro/test_set_internal_word.rb @@ -16,6 +16,21 @@ module SlotMachine def test_risc_length assert_equal 20 , @method.to_risc.risc_instructions.length end + def test_all + assert_slot_to_reg risc(1),:r0 , 2 , :r1 + assert_slot_to_reg risc(2),:r0 , 10 , :r2 + assert_reg_to_slot risc(3) , :r2 , :r0 , 5 + assert_slot_to_reg risc(4),:r0 , 9 , :r3 + assert_slot_to_reg risc(5),:r3 , 2 , :r3 + assert_slot_to_reg risc(6),:r2 , 2 , :r2 + assert_equal Risc::RegToByte , risc(7).class + assert_slot_to_reg risc(8),:r0 , 5 , :r2 + assert_reg_to_slot risc(9) , :r2 , :r0 , 5 + assert_branch risc(10) , "return_label" + end + def test_return + assert_return(11) + end end end end diff --git a/test/support/risc_assert.rb b/test/support/risc_assert.rb index ca7d150a..67c791f1 100644 --- a/test/support/risc_assert.rb +++ b/test/support/risc_assert.rb @@ -19,14 +19,23 @@ module Minitest def assert_slot_to_reg( slot , array = nil, index = nil , register = nil) assert_equal Risc::SlotToReg , slot.class assert_register( :source , array , slot.array) - assert_equal( index , slot.index, "wrong source index") if index assert_register( :destination , register , slot.register ) + assert_index( :source , slot , index) end def assert_reg_to_slot( slot , register = nil, array = nil, index = nil ) assert_equal Risc::RegToSlot , slot.class assert_register( :source , register , slot.register ) assert_register( :destination , array , slot.array) - assert_equal( index , slot.index, "wrong destination index") if index + assert_index( :destination , slot , index) + end + def assert_index(kind , slot , index) + return unless index + if(slot.index.is_a?(Risc::RegisterValue)) + assert_equal( Symbol , index.class, "wrong #{kind} index class") + assert_equal( index , slot.index.symbol, "wrong #{kind} index") + else + assert_equal( index , slot.index, "wrong #{kind} index") + end end def assert_load(load , clazz = nil , register = nil) assert_equal Risc::LoadConstant , load.class @@ -61,6 +70,10 @@ module Minitest assert_register :right , right , ins.right end def assert_zero ins , label + assert_equal Risc::IsNotZero , ins.class + assert_label ins.label , label + end + def assert_not_zero ins , label assert_equal Risc::IsZero , ins.class assert_label ins.label , label end @@ -68,6 +81,13 @@ module Minitest assert_equal Risc::Syscall , ins.class assert_equal ins.name , name end - + def assert_minus ins , label + assert_equal Risc::IsMinus , ins.class + assert_label ins.label , label + end + def assert_data(ins , data) + assert_equal Risc::LoadData , ins.class + assert_equal data , ins.constant + end end end