Torsten Rüger
12b29285d7
so many relied (implicitly( on some builtin function after all can't do much in ruby without calling Now all those dependencies are explicit Small risc changes come because the macro version has a return label and unreachable label
106 lines
2.8 KiB
Ruby
106 lines
2.8 KiB
Ruby
require_relative "helper"
|
|
|
|
module Risc
|
|
class TestInterpreterBasics < MiniTest::Test
|
|
include ScopeHelper
|
|
def setup
|
|
compiler = compiler_with_main()
|
|
@linker = compiler.to_target( :interpreter)
|
|
end
|
|
|
|
def test_class
|
|
assert_equal Risc::Interpreter , Interpreter.new(@linker).class
|
|
end
|
|
def test_starts
|
|
interpreter = Interpreter.new(@linker)
|
|
@linker.position_all
|
|
assert_equal 0 , interpreter.start_program
|
|
end
|
|
def test_starts_stopped
|
|
assert_equal :stopped , Interpreter.new(@linker).state
|
|
end
|
|
def test_has_regs
|
|
assert_equal 12 , Interpreter.new(@linker).registers.length
|
|
end
|
|
def test_has_r0
|
|
assert_equal :r0 , Interpreter.new(@linker).registers.keys.first
|
|
end
|
|
end
|
|
class TestInterpreterStarts < MiniTest::Test
|
|
include Ticker
|
|
def setup
|
|
@string_input = as_main("return 5")
|
|
super
|
|
end
|
|
def test_started
|
|
assert_equal :running , @interpreter.state
|
|
end
|
|
def test_pos
|
|
assert_equal 1 , @interpreter.clock
|
|
end
|
|
end
|
|
class TestInterpreterTicks < MiniTest::Test
|
|
include Ticker
|
|
def setup
|
|
@string_input = as_main("return 5")
|
|
super
|
|
end
|
|
def test_tick1
|
|
assert_equal 2 , @interpreter.tick
|
|
end
|
|
def test_clock1
|
|
@interpreter.tick
|
|
assert_equal 2 , @interpreter.clock
|
|
end
|
|
def test_pc1
|
|
@interpreter.tick
|
|
assert_equal 37704 , @interpreter.pc
|
|
end
|
|
def test_pc2
|
|
@interpreter.tick
|
|
@interpreter.tick
|
|
assert_equal 37708 , @interpreter.pc
|
|
end
|
|
def test_tick2
|
|
@interpreter.tick
|
|
assert_equal 3 , @interpreter.tick
|
|
end
|
|
def test_clock2
|
|
@interpreter.tick
|
|
@interpreter.tick
|
|
assert_equal 3 , @interpreter.clock
|
|
end
|
|
def ttest_tick_14_jump
|
|
30.times { @interpreter.tick ;puts @interpreter.instruction.class}
|
|
assert_equal Branch , @interpreter.instruction.class
|
|
end
|
|
def ttest_tick_14_bin
|
|
29.times {@interpreter.tick}
|
|
binary_pos = binary_position
|
|
@interpreter.tick #jump has no listener
|
|
@interpreter.tick
|
|
assert binary_pos.at != binary_position.at , "#{binary_pos} == #{binary_position}"
|
|
end
|
|
def binary_position
|
|
pos = Position.get(@interpreter.instruction)
|
|
list = pos.event_table[:position_changed].first
|
|
assert_equal InstructionListener, list.class
|
|
Position.get(list.binary)
|
|
end
|
|
def test_tick_15 #more than a binary code worth
|
|
31.times {@interpreter.tick}
|
|
end
|
|
class TestInterpreterDies < MiniTest::Test
|
|
include Ticker
|
|
def setup
|
|
@string_input = as_main("random.call")
|
|
super
|
|
end
|
|
def test_dies
|
|
# no method does syscall :dies that raises
|
|
assert_raises {44.times {@interpreter.tick}}
|
|
end
|
|
end
|
|
end
|
|
end
|