require_relative "../helper"

module Risc
  class TestInstructions < MiniTest::Test
    def setup
      @label = Label.new("test" , "test")
      @branch = Branch.new("test" , @label)
      @instruction = Instruction.new("test")
    end
    def test_branch_tos1
      assert @branch.to_s.include?("Branch")
      assert @branch.to_s.include?("test")
    end
    def test_branch_tos2
      branch = Branch.new(nil ,nil)
      assert branch.to_s.include?("Branch")
    end
    def test_label_tos1
      assert @label.to_s.include?("Label")
    end
    def test_label_tos2
      assert Label.new(nil,nil).to_s.include?("Label")
    end
    def test_last_empty
      assert_equal @instruction, @instruction.last
    end
    def test_last_not_empty
      @instruction.set_next @branch
      assert_equal @branch, @instruction.last
    end
    def test_append_empty
      @instruction.append @branch
      assert_equal @branch, @instruction.last
    end
    def test_insert
      @instruction.insert @branch
      assert_equal @branch, @instruction.last
    end
    def test_append_not_empty
      @instruction.append @branch
      @instruction.append @label
      assert_equal @label, @instruction.last
    end
    def test_next1
      assert_nil  @instruction.next
    end
    def test_next2
      @instruction.set_next @label
      assert_equal @label , @instruction.next
      assert_nil  @instruction.next(2)
    end
    def test_replace
      @instruction.append @branch
      @instruction.replace_next @label
      assert_equal @label, @instruction.last
      assert_equal @label, @instruction.next
      assert_equal 2 , @instruction.length , @instruction.to_arr
    end
    def test_each_label1
      @instruction.set_next @label
      start = Label.new("test" , "test" , @instruction)
      count = 0
      start.each_label { |l| count += 1 }
      assert_equal 2 , count
    end
    def test_each_label2
      @instruction.set_next @branch
      start = Label.new("test" , "test" , @instruction)
      count = 0
      start.each_label { |l| count += 1 }
      assert_equal 2 , count
    end
    def test_label_is_method
      label = Label.new("test" , "Object.test")
      assert label.is_method
    end
    def test_label_is_not_method
      assert ! @label.is_method
    end
  end
end