require_relative "helper"

module Risc
  class TestInterpretRegToByte < MiniTest::Test
    include Ticker

    def setup
        @string_input = <<HERE
  class Space
    int main()
      "Hello".set_internal_byte(1,104)
    end
  end
HERE
      @input =  s(:statements, s(:call,
                     :set_internal_byte ,
                    s(:arguments, s(:int, 1), s(:int, 104)),
                      s(:receiver, s(:string, "Hello"))))
      super
    end

    def pest_chain
      #show_ticks # get output of what is
      check_chain [Branch, Label, LoadConstant, SlotToReg, RegToSlot,
             LoadConstant, RegToSlot, FunctionCall, Label, SlotToReg,
             LoadConstant, RegToSlot, LoadConstant, RegToSlot, LoadConstant,
             SlotToReg, RegToSlot, LoadConstant, SlotToReg, RegToSlot,
             LoadConstant, SlotToReg, RegToSlot, LoadConstant, RegToSlot,
             RiscTransfer, FunctionCall, Label, LoadConstant, SlotToReg,
             RegToSlot, SlotToReg, SlotToReg, SlotToReg, SlotToReg,
             SlotToReg, RegToByte, Label, FunctionReturn, RiscTransfer,
             SlotToReg, SlotToReg, LoadConstant, SlotToReg, RegToSlot,
             Label, FunctionReturn, RiscTransfer, Syscall, NilClass]
    end

    def pest_branch
      was = @interpreter.instruction
      assert_equal Branch , ticks(1).class
      assert was != @interpreter.instruction
      assert @interpreter.instruction , "should have gone to next instruction"
    end
    def pest_load
      assert_equal LoadConstant ,  ticks(3).class
      assert_equal Parfait::Space , @interpreter.get_register(:r2).class
      assert_equal :r2,  @interpreter.instruction.array.symbol
    end
    def pest_get
      assert_equal SlotToReg , ticks(4).class
      assert @interpreter.get_register( :r1 )
      assert Integer , @interpreter.get_register( :r1 ).class
    end
    def pest_call
      assert_equal FunctionCall ,  ticks(8).class
    end
    def pest_exit
      done = ticks(50)
      assert_equal NilClass ,  done.class
    end

    def pest_reg_to_byte
      done = ticks(37)
      assert_equal RegToByte ,  done.class
      assert_equal "h".ord ,  @interpreter.get_register(done.register)
    end

  end
end