require_relative "../helper"
require "interpreter/interpreter"

module Ticker

  def setup
    machine = Register.machine.boot
    syntax  = Parser::Salama.new.parse_with_debug(@string_input)
    parts = Parser::Transform.new.apply(syntax)
    #puts parts.inspect
    Soml.compile( parts )
    machine.collect
    @interpreter = Interpreter::Interpreter.new
    @interpreter.start Register.machine.init
  end

  def check_chain should
    should.each_with_index do |name , index|
      got = ticks(1)
      assert got.class.name.index(name) , "Wrong class for #{index+1}, expect #{name} , got #{got}"
    end
  end

  def check_return val
    assert_equal Parfait::Message , @interpreter.get_register(:r0).class
    assert_equal val , @interpreter.get_register(:r0).return_value
  end

  def ticks num
    last = nil
    num.times do
      last = @interpreter.instruction
      @interpreter.tick
    end
    return last
  end

  def show_ticks
    classes = []
    tick = 1
    begin
      while true and (classes.length < 200)
        cl = ticks(1).class
        tick += 1
        classes << cl
        break if cl == NilClass
      end
    rescue => e
      puts "Error at tick #{tick}"
      puts e
    end
    classes = classes.collect {|c| '"' + c.name.sub("Register::","")  + '",' }
    classes << "length = #{classes.length}"
    classes.each_slice(5).each do |line|
      puts "     " + line.join
    end
    exit(1)
  end
end