require_relative "../helper"

module Risc
  class TestSendDynamic < MiniTest::Test
    include Statements

    def setup
      @preload = "Integer.div4"
      @input = "@classes.div4"
      @expect = [LoadConstant, SlotToReg, SlotToReg, SlotToReg, SlotToReg, #5
                 OperatorInstruction, IsZero, SlotToReg, SlotToReg, SlotToReg, #10
                 LoadConstant, RegToSlot, LoadConstant, LoadConstant, SlotToReg, #15
                 SlotToReg, Label, LoadConstant, OperatorInstruction, IsZero, #20
                 SlotToReg, OperatorInstruction, IsZero, SlotToReg, Branch, #25
                 Label, LoadConstant, SlotToReg, Transfer, Syscall, #30
                 Transfer, Transfer, SlotToReg, RegToSlot, Label, #35
                 RegToSlot, Label, LoadConstant, SlotToReg, SlotToReg, #40
                 RegToSlot, SlotToReg, SlotToReg, SlotToReg, RegToSlot, #45
                 LoadConstant, SlotToReg, RegToSlot, SlotToReg, LoadConstant, #50
                 SlotToReg, DynamicJump, Label, SlotToReg, RegToSlot, #55
                 Branch,] #60
    end

    def test_send_instructions
      assert_nil msg = check_nil , msg
    end
    def test_sys
      produced = produce_body
      assert_equal Syscall , produced.next(29).class
      assert_equal :died , produced.next(29).name
    end
    def test_load_address
      produced = produce_body
      assert_equal LoadConstant , produced.next(26).class
      assert_equal Parfait::Factory , produced.next(26).constant.class
    end
    def test_function_call
      produced = produce_body
      assert_equal DynamicJump , produced.next(51).class
    end
    def test_cache_check
      produced = produce_body
      assert_equal IsZero , produced.next(6).class
      assert_equal Label , produced.next(36).class
      assert_equal produced.next(36) , produced.next(6).label
    end
  end
end