mirror of
https://github.com/safiire/n65.git
synced 2024-12-13 22:30:11 +00:00
2c938f7312
bank management, Use of promises to resolve symbols that are used before they are defined. A base class for all instructions and assembler directives. Hopefully my scoped symbols can be used to create C like data structures in the zero page, ie sprite.x New code to prodce the final ROM. Basically everything was rewritten.
129 lines
3.2 KiB
Ruby
129 lines
3.2 KiB
Ruby
gem 'minitest'
|
|
require 'minitest/autorun'
|
|
require 'minitest/unit'
|
|
|
|
require_relative '../lib/symbol_table.rb'
|
|
|
|
|
|
class TestSymbolTable < MiniTest::Test
|
|
include Assembler6502
|
|
|
|
####
|
|
## Test that we can make simple global symbols
|
|
def _test_define_global_symbols
|
|
st = SymbolTable.new
|
|
st.define_symbol('dog', 'woof')
|
|
assert_equal('woof', st.resolve_symbol('dog'))
|
|
end
|
|
|
|
|
|
####
|
|
## Test entering into a sub scope, and setting and retrieving values
|
|
def _test_enter_scope
|
|
st = SymbolTable.new
|
|
st.enter_scope('animals')
|
|
st.define_symbol('dog', 'woof')
|
|
assert_equal('woof', st.resolve_symbol('dog'))
|
|
end
|
|
|
|
|
|
####
|
|
## Test exiting a sub scope, and seeing that the variable is unavailable by simple name
|
|
def _test_exit_scope
|
|
st = SymbolTable.new
|
|
st.enter_scope('animals')
|
|
st.define_symbol('dog', 'woof')
|
|
assert_equal('woof', st.resolve_symbol('dog'))
|
|
|
|
st.exit_scope
|
|
|
|
assert_raises(SymbolTable::UndefinedSymbol) do
|
|
assert_equal('woof', st.resolve_symbol('dog'))
|
|
end
|
|
end
|
|
|
|
|
|
####
|
|
## Test exiting a sub scope, and being able to access a symbol through a full path
|
|
def test_exit_scope
|
|
st = SymbolTable.new
|
|
st.enter_scope('animals')
|
|
st.define_symbol('dog', 'woof')
|
|
assert_equal('woof', st.resolve_symbol('dog'))
|
|
|
|
st.exit_scope
|
|
|
|
assert_equal('woof', st.resolve_symbol('animals.dog'))
|
|
end
|
|
|
|
|
|
####
|
|
## Have two symbols that are the same but are in different scopes
|
|
def test_two_scopes_same_symbol
|
|
st = SymbolTable.new
|
|
st.define_symbol('dog', 'woof')
|
|
assert_equal('woof', st.resolve_symbol('dog'))
|
|
|
|
st.enter_scope('animals')
|
|
|
|
st.define_symbol('dog', 'woofwoof')
|
|
assert_equal('woofwoof', st.resolve_symbol('dog'))
|
|
|
|
st.exit_scope
|
|
|
|
assert_equal('woof', st.resolve_symbol('dog'))
|
|
assert_equal('woofwoof', st.resolve_symbol('animals.dog'))
|
|
end
|
|
|
|
|
|
####
|
|
## How do you get stuff out of the global scope when you are in
|
|
## a sub scope?
|
|
def test_access_global_scope
|
|
st = SymbolTable.new
|
|
st.define_symbol('dog', 'woof')
|
|
assert_equal('woof', st.resolve_symbol('dog'))
|
|
|
|
st.enter_scope('animals')
|
|
st.define_symbol('pig', 'oink')
|
|
assert_equal('oink', st.resolve_symbol('pig'))
|
|
|
|
## Ok, now I want to access global.dog basically from the previous scope
|
|
assert_equal('woof', st.resolve_symbol('global.dog'))
|
|
end
|
|
|
|
|
|
####
|
|
## Now I want to just test making an anonymous scope
|
|
def test_anonymous_scope
|
|
st = SymbolTable.new
|
|
st.define_symbol('dog', 'woof')
|
|
assert_equal('woof', st.resolve_symbol('dog'))
|
|
|
|
st.enter_scope
|
|
st.define_symbol('pig', 'oink')
|
|
assert_equal('oink', st.resolve_symbol('pig'))
|
|
|
|
## Ok, now I want to access global.dog basically from the previous scope
|
|
assert_equal('woof', st.resolve_symbol('global.dog'))
|
|
|
|
## Now exit the anonymous scope and get dog
|
|
st.exit_scope
|
|
assert_equal('woof', st.resolve_symbol('global.dog'))
|
|
assert_equal('woof', st.resolve_symbol('dog'))
|
|
end
|
|
|
|
|
|
####
|
|
## Now I want to test that I cannot exist the outer-most
|
|
## global scope by mistake
|
|
def test_cant_exit_global
|
|
st = SymbolTable.new
|
|
assert_raises(SymbolTable::CantExitScope) do
|
|
st.exit_scope
|
|
end
|
|
end
|
|
|
|
end
|
|
|