Torsten Rüger
2dcb2a9a72
Just for future, as this gives us a way to know immediately in the type, which represent normal, and which singleton classes Also instantiate singleton class lazily (with singleton type) This makes the type of class single, ie unique, immediately when it is used, ie methods or variables defined. Fixes a design mistake, where all singletonn classes shared the same type, and thus unique methods per class were impossible (Also some misc in commit)
103 lines
2.7 KiB
Ruby
103 lines
2.7 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_pc
|
|
@interpreter.tick
|
|
assert_equal t = 36104 , @interpreter.pc
|
|
@interpreter.tick
|
|
assert_equal t + 4 , @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
|