add basic compiler expression tests (back)

This commit is contained in:
Torsten Ruger
2016-12-10 04:01:47 +02:00
parent 5c2f545f8e
commit de5d87cde7
8 changed files with 78 additions and 98 deletions

View File

@ -0,0 +1,28 @@
require_relative '../helper'
Typed::Compiler.class_eval do
def set_main main
@clazz = Register.machine.space.get_class_by_name :Object
@method = main
@current = main.instructions.next
end
end
module ExpressionHelper
def set_main compiler
compiler.set_main Register.machine.space.get_main
end
def check
machine = Register.machine
machine.boot unless machine.booted
compiler = Typed::Compiler.new
set_main(compiler)
code = Typed.ast_to_code @input
produced = compiler.process( code )
assert @output , "No output given"
assert_equal produced.class , @output , "Wrong class"
produced
end
end

View File

@ -0,0 +1,4 @@
require_relative "test_basic"
require_relative "test_call"
require_relative "test_field_access"
require_relative "test_ops"

View File

@ -0,0 +1,38 @@
require_relative "helper"
class TestBasic < MiniTest::Test
include ExpressionHelper
include AST::Sexp
def setup
@output = Register::RegisterValue
end
def test_number
@input = s(:int , 42)
assert_equal 42 , check.value
end
def test_true
@input = s(:true)
check
end
def test_false
@input = s(:false)
check
end
def test_nil
@input = s(:nil)
check
end
def test_self
@input = s(:name, :self)
check
end
def test_string
@input = s(:string , "hello")
check
end
end

View File

@ -0,0 +1,40 @@
require_relative "helper"
module Register
class TestCall < MiniTest::Test
include ExpressionHelper
def setup
Register.machine.boot
@root = :call_site
@output = Register::RegisterValue
end
def test_call_main_plain
@input = 'main()'
check
end
def test_call_main_int
@input = 'main(1)'
check
end
def test_call_main_string
@input = 'main("1")'
check
end
def test_call_main_op
Register.machine.space.get_main.ensure_local(:bar , :Integer)
@input = 'main( bar )'
check
end
def test_call_string_put
@input = '"Hello Raisa, I am salama".putstring()'
check
end
end
end

View File

@ -0,0 +1,61 @@
require_relative "helper"
module Register
class TestFields < MiniTest::Test
include ExpressionHelper
def setup
Register.machine.boot
end
def test_field_not_defined
@root = :field_access
@input = <<HERE
self.a
HERE
assert_raises(RuntimeError) { check }
end
def test_field_not_space
@root = :field_access
@input = <<HERE
self.space
HERE
assert_raises(RuntimeError) { check }
end
def test_field
Register.machine.space.get_class_by_name(:Object).instance_type.add_instance_variable(:bro,:Object)
@root = :field_access
@input = <<HERE
self.bro
HERE
@output = Register::RegisterValue
check
end
def test_local
Register.machine.space.get_main.ensure_local(:bar , :Integer)
@root = :name
@input = 'bar '
@output = Register::RegisterValue
check
end
def test_space
@root = :name
@input = 'space '
@output = Register::RegisterValue
check
end
def test_args
Register.machine.space.get_main.arguments.push Parfait::Variable.new(:Integer , :bar)
@root = :name
@input = 'bar '
@output = Register::RegisterValue
check
end
end
end

View File

@ -0,0 +1,45 @@
require_relative "helper"
module Register
class TestOps < MiniTest::Test
include ExpressionHelper
def setup
Register.machine.boot
@root = :operator_value
@output = Register::RegisterValue
end
def operators
["+" , "-" , "*" , "/" , "=="]
end
def test_ints
operators.each do |op|
@input = '2 + 3'.sub("+" , op)
check
end
end
def test_local_int
Register.machine.space.get_main.ensure_local(:bar , :Integer)
@input = 'bar + 3'
check
end
def test_int_local
Register.machine.space.get_main.ensure_local(:bar , :Integer)
@input = '3 + bar'
check
end
def test_field_int
Register.machine.space.get_class_by_name(:Object).instance_type.add_instance_variable(:bro,:int)
@input = "self.bro + 3"
check
end
def test_int_field
Register.machine.space.get_class_by_name(:Object).instance_type.add_instance_variable(:bro,:int)
@input = "3 + self.bro"
check
end
end
end