require_relative "../helper"

module Risc
  class TestMessageSetupSimple < MiniTest::Test
    include Statements

    def setup
      super
      @input = "5.div4"
      @expect = [LoadConstant, LoadConstant, SlotToReg, SlotToReg, RegToSlot,
                 RegToSlot, RegToSlot, RegToSlot, LoadConstant, SlotToReg,
                 RegToSlot, LoadConstant, SlotToReg, RegToSlot, SlotToReg,
                 FunctionCall, Label]
      @produced = produce_body
    end

    def test_send_instructions
      assert_nil msg = check_nil , msg
    end
    def test_load_method
      method = @produced
      assert_load( method, Parfait::CallableMethod ,:r1)
      assert_equal :div4 , method.constant.name
    end
    def test_load_space
      space = @produced.next(1)
      assert_load( space , Parfait::Factory , :r2 )
    end
    def test_load_first_message #from space (ie r2)
      sl = @produced.next( 2 )
      assert_slot_to_reg( sl , :r2 ,  2 ,  :r3 )
    end
    def test_get_next_next #reduce onto itself
      sl = @produced.next( 3 )
      assert_slot_to_reg( sl , :r3 ,  1 ,  :r4 )
    end
    def test_store_next_next_in_space
      sl = @produced.next( 4 )
      assert_reg_to_slot( sl , :r4  ,  :r2 ,  2 )
    end
    def test_store_message_in_current
      sl = @produced.next( 5 )
      assert_reg_to_slot( sl , :r3  ,  :r0 ,  1 )
    end
    def test_store_caller_in_message
      sl = @produced.next( 6 )
      assert_reg_to_slot( sl , :r0  ,  :r3 ,  6 )
    end
    def test_store_method_in_message
      sl = @produced.next( 7 )
      assert_reg_to_slot( sl , :r1  ,  :r3 ,  7 )
    end
    def test_label
      sl = @produced.next( 17 )
      assert_equal Risc::Label , sl.class
      assert_equal "return_label" , sl.name
    end
  end
end