mirror of
https://github.com/safiire/n65.git
synced 2024-12-12 15:29:12 +00:00
Converted symbol arithmetic tests to spec, removed mintest
This commit is contained in:
parent
96b7fcf3ef
commit
2b5e170922
@ -54,7 +54,7 @@ module N65
|
||||
scope[symbol.to_sym] = value
|
||||
end
|
||||
|
||||
# Separate arithmetic from scope name
|
||||
# Separate arithmetic from symbol
|
||||
def find_arithmetic(name)
|
||||
last_name = name.split('.').last
|
||||
md = last_name.match(%r{([+\-*/])(\d+)$})
|
||||
@ -62,7 +62,7 @@ module N65
|
||||
|
||||
unless md.nil?
|
||||
full_match, operator, argument = md.to_a
|
||||
name.gsub!(full_match, '')
|
||||
name = name.gsub(full_match, '')
|
||||
f = ->(value) { value.send(operator.to_sym, argument.to_i) }
|
||||
end
|
||||
|
||||
|
@ -22,7 +22,6 @@ Gem::Specification.new do |spec|
|
||||
spec.required_ruby_version = '>= 2.4.0'
|
||||
|
||||
spec.add_development_dependency 'bundler'
|
||||
spec.add_development_dependency 'minitest'
|
||||
spec.add_development_dependency 'rake'
|
||||
spec.add_development_dependency 'rubocop'
|
||||
spec.add_development_dependency 'rspec'
|
||||
|
@ -203,7 +203,7 @@ RSpec.describe(N65::SymbolTable) do
|
||||
0xea, # NOP
|
||||
0xea, # NOP
|
||||
0xea, # NOP
|
||||
0x60 # RTS forward_symbol
|
||||
0x60 # RTS
|
||||
]
|
||||
end
|
||||
let(:emitted_rom) { assembler.emit_binary_rom.bytes[16...26] }
|
||||
@ -214,4 +214,78 @@ RSpec.describe(N65::SymbolTable) do
|
||||
expect(emitted_rom).to eq(correct_binary)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when setting a symbols value' do
|
||||
before do
|
||||
subject.define_symbol('variable', 0xff)
|
||||
end
|
||||
|
||||
it 'can resolve to that value' do
|
||||
expect(subject.resolve_symbol('variable')).to eq(0xff)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when performing artithmetic on a symbol' do
|
||||
before do
|
||||
subject.define_symbol('variable', 0x20)
|
||||
end
|
||||
|
||||
it 'can perform addition on the symbol' do
|
||||
expect(subject.resolve_symbol('variable+1')).to eq(0x21)
|
||||
end
|
||||
|
||||
it 'can perform subtraction on the symbol' do
|
||||
expect(subject.resolve_symbol('variable-16')).to eq(0x10)
|
||||
end
|
||||
|
||||
it 'can perform multiplication on the symbol' do
|
||||
expect(subject.resolve_symbol('variable*2')).to eq(0x40)
|
||||
end
|
||||
|
||||
it 'can perform division on the symbol' do
|
||||
expect(subject.resolve_symbol('variable/2')).to eq(0x10)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when performing arithmetic on a scope struct' do
|
||||
let(:assembler) { N65::Assembler.new }
|
||||
let(:program) do
|
||||
<<~'ASM'
|
||||
.ines {"prog": 1, "char": 0, "mapper": 0, "mirror": 0}
|
||||
|
||||
.org $0020
|
||||
.scope struct
|
||||
.space a 1
|
||||
.space b 1
|
||||
.
|
||||
|
||||
.org $8000
|
||||
.scope main
|
||||
sei
|
||||
cld
|
||||
lda struct+1 zp
|
||||
lda struct*2 zp
|
||||
rts
|
||||
.
|
||||
ASM
|
||||
end
|
||||
let(:emitted_rom) { assembler.emit_binary_rom.bytes[16...23] }
|
||||
let(:correct_binary) do
|
||||
[
|
||||
0x78, # sei
|
||||
0xd8, # cld
|
||||
0xa5, # lda
|
||||
0x21, # $20 + 1
|
||||
0xa5, # lda
|
||||
0x40, # $20 * 2
|
||||
0x60 # rts
|
||||
]
|
||||
end
|
||||
|
||||
before { assembler.assemble_string(program) }
|
||||
|
||||
it 'assembles the symbol arithmetic correctly' do
|
||||
expect(emitted_rom).to eq(correct_binary)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -1,69 +0,0 @@
|
||||
gem 'minitest'
|
||||
require 'minitest/autorun'
|
||||
require 'minitest/unit'
|
||||
require_relative '../lib/n65'
|
||||
|
||||
class TestArithmeticSymbols < MiniTest::Test
|
||||
include N65
|
||||
|
||||
def test_identify_plain_symbol
|
||||
re = Regexp.new(Regexes::Sym)
|
||||
assert_match(re, 'dog')
|
||||
assert_match(re, 'animal.dog')
|
||||
assert_match(re, 'global.animal.dog')
|
||||
end
|
||||
|
||||
def test_symbol_values
|
||||
st = SymbolTable.new
|
||||
st.define_symbol('variable', 0xff)
|
||||
assert_equal(0xff, st.resolve_symbol('variable'))
|
||||
end
|
||||
|
||||
def test_perform_symbolic_arithmetic
|
||||
st = SymbolTable.new
|
||||
st.define_symbol('variable', 0x20)
|
||||
assert_equal(0x21, st.resolve_symbol('variable+1'))
|
||||
assert_equal(0x40, st.resolve_symbol('variable*2'))
|
||||
end
|
||||
|
||||
def test_symbol_addition
|
||||
program = <<-ASM
|
||||
.ines {"prog": 1, "char": 0, "mapper": 0, "mirror": 0}
|
||||
|
||||
.org $0020
|
||||
.scope struct
|
||||
.space a 1
|
||||
.space b 1
|
||||
.
|
||||
|
||||
.org $8000
|
||||
.scope main
|
||||
sei
|
||||
cld
|
||||
lda struct+1 zp
|
||||
lda struct*2 zp
|
||||
rts
|
||||
.
|
||||
ASM
|
||||
|
||||
assembler = Assembler.new
|
||||
program.split(/\n/).each do |line|
|
||||
assembler.assemble_one_line(line)
|
||||
end
|
||||
assembler.fulfill_promises
|
||||
|
||||
binary = assembler.emit_binary_rom[16...23].split(//).map(&:ord)
|
||||
|
||||
## So yay, arithmetic on symbols works now :)
|
||||
correct = [
|
||||
0x78, # sei
|
||||
0xd8, # cld
|
||||
0xa5, # lda
|
||||
0x21, # $20 + 1
|
||||
0xa5, # lda
|
||||
0x40, # $20 * 2
|
||||
0x60 # rts
|
||||
]
|
||||
assert_equal(binary, correct)
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue
Block a user