require_relative "helper"

module Risc
  class IfCalledTest < MiniTest::Test
    include Ticker
    include Compiling

    def setup
      @string_input = <<HERE
  class Space
    int itest(int n)
      if_zero( n - 12)
        "then".putstring()
      else
        "else".putstring()
      end
    end

    int main()
      itest(20)
    end
  end
HERE
      @input = s(:statements, s(:call, :itest , s(:arguments, s(:int, 20))))
      super
    end

    # must be after boot, but before main compile, to define method
    def do_clean_compile
      clean_compile :Space , :itest , {:n => :Integer} ,
            s(:statements, s(:if_statement, :zero, s(:condition, s(:operator_value, :-, s(:arg, :n), s(:int, 12))),
                    s(:true_statements, s(:call, :putstring , s(:arguments), s(:receiver, s(:string, "then")))),
                    s(:false_statements, s(:call, :putstring , s(:arguments), s(:receiver, s(:string, "else"))))))
    end
    def test_if
        #show_ticks # get output of what is
        check_chain [Branch, Label, LoadConstant, SlotToReg, RegToSlot,
             LoadConstant, RegToSlot, FunctionCall, Label, SlotToReg,
             SlotToReg, RegToSlot, LoadConstant, RegToSlot, LoadConstant,
             SlotToReg, RegToSlot, LoadConstant, SlotToReg, RegToSlot,
             LoadConstant, RegToSlot, RiscTransfer, FunctionCall, Label,
             LoadConstant, SlotToReg, RegToSlot, SlotToReg, SlotToReg,
             LoadConstant, OperatorInstruction, IsZero, SlotToReg, LoadConstant,
             RegToSlot, LoadConstant, RegToSlot, LoadConstant, SlotToReg,
             RegToSlot, LoadConstant, RegToSlot, RiscTransfer, FunctionCall,
             Label, LoadConstant, SlotToReg, RegToSlot, SlotToReg,
             SlotToReg, RiscTransfer, Syscall, RiscTransfer, RiscTransfer,
             RegToSlot, Label, FunctionReturn, RiscTransfer, SlotToReg,
             SlotToReg, Branch, Label, Label, FunctionReturn,
             RiscTransfer, SlotToReg, SlotToReg, LoadConstant, SlotToReg,
             RegToSlot, Label, FunctionReturn, RiscTransfer, Syscall,
             NilClass]
    end
  end
end