start a new ruby layer to do the to_vool conversion

the "normalization" is getting more and more complicated and is not tested
And it seems i really don't like working with the untyped ast
This commit is contained in:
Torsten Ruger
2018-07-19 14:46:51 +03:00
parent f624e38dbb
commit 38350dd198
36 changed files with 642 additions and 60 deletions

View File

@ -1,9 +0,0 @@
require_relative "../../helper"
module Vool
module RubyTests
def compile(input)
RubyX::RubyCompiler.compile(input)
end
end
end

View File

@ -1,20 +0,0 @@
require_relative "helper"
module Vool
class TestArrayX < MiniTest::Test
include RubyTests
def test_empty
lst = compile( "[]")
assert_equal ArrayStatement , lst.class
end
def test_one
lst = compile( "[1]")
assert_equal ArrayStatement , lst.class
end
def test_two
lst = compile( "[1,2]")
assert_equal ArrayStatement , lst.class
end
end
end

View File

@ -1,80 +0,0 @@
require_relative "helper"
module Vool
class TestBasicValuesX < MiniTest::Test
include RubyTests
def test_self
lst = compile( "self")
assert_equal SelfExpression , lst.class
end
def test_nil
lst = compile( "nil")
assert_equal NilConstant , lst.class
end
def test_false
lst = compile( "false")
assert_equal FalseConstant , lst.class
end
def test_true
lst = compile( "true")
assert_equal TrueConstant , lst.class
end
def test_integer
lst = compile( "123")
assert_equal IntegerConstant , lst.class
end
def test_string
lst = compile( "'string'")
assert_equal StringConstant , lst.class , lst.inspect
end
def test_sym
lst = compile( ":symbol")
assert_equal SymbolConstant , lst.class , lst.inspect
end
def test_dstr
assert_raises RuntimeError do
compile( '"dstr#{self}"')
end
end
def test_scope
lst = compile( "begin ; 1 ; end")
assert_equal ScopeStatement , lst.class , lst.inspect
end
def test_scope_contents
lst = compile( "begin ; 1 ; end")
assert_equal 1 , lst.statements.first.value
end
end
class TestBasicTypesX < MiniTest::Test
include RubyTests
def setup
Parfait.boot!
end
def compile_ct( input )
lst = compile( input )
lst.ct_type
end
def test_integer
assert_equal "Integer_Type" , compile_ct( "123").name
end
def test_string
assert_equal "Word_Type" , compile_ct( "'string'").name
end
def test_sym
assert_equal "Word_Type" , compile_ct( ":symbol").name
end
# classes fot these are not implemented in parfait yet
def pest_nil
assert_equal "Nil_Type" , compile_ct( "nil").name
end
def pest_false
assert_equal "False_Type" , compile_ct( "false").name
end
def pest_true
assert_equal "True_Type" , compile_ct( "true").name
end
end
end

View File

@ -1,30 +0,0 @@
require_relative "helper"
module Vool
class TestBlockStatementX < MiniTest::Test
include RubyTests
def setup()
input = "plus_one{|arg1| arg1 + 1 } "
@lst = compile( input )
end
def test_method
assert_equal SendStatement , @lst.class
end
def test_block
assert_equal BlockStatement , @lst.block.class
end
def test_method_name
assert_equal :plus_one , @lst.name
end
def test_block_args
assert_equal [:arg1] , @lst.block.args
end
def test_block_body
assert_equal SendStatement , @lst.block.body.class
assert_equal 1 , @lst.block.body.arguments.length
end
end
end

View File

@ -1,44 +0,0 @@
require_relative "helper"
module Vool
class TestEmptyClassStatementX < MiniTest::Test
include RubyTests
def setup
input = "class Tryout < Base;end"
@lst = compile( input )
end
def test_compile_class
assert_equal ClassStatement , @lst.class
end
def test_compile_class_name
assert_equal :Tryout , @lst.name
end
def test_compile_class_super
assert_equal :Base , @lst.super_class_name
end
def test_compile_class_body
assert @lst.body.empty?
end
end
class TestBasicClassStatementX < MiniTest::Test
include ScopeHelper
include RubyTests
def test_compile_one_method
lst = compile( as_test_main("@ivar = 4") )
assert_equal IvarAssignment , lst.body.first.body.class
end
def test_compile_two_stats
lst = compile( as_test_main("false; true;") )
assert_equal ScopeStatement , lst.body.first.body.class
assert_equal TrueConstant , lst.body.first.body.statements[1].class
end
end
end

View File

@ -1,36 +0,0 @@
require_relative "helper"
module Vool
class HashArrayX < MiniTest::Test
include RubyTests
def test_empty
lst = compile( "{}")
assert_equal HashStatement , lst.class
end
def test_empty_length
lst = compile( "{}")
assert_equal 0 , lst.length
end
def test_one
lst = compile( "{ 1 => 2}")
assert_equal HashStatement , lst.class
end
def test_one_length
lst = compile( "{ 1 => 2}")
assert_equal 1 , lst.length
end
def test_one_pair
lst = compile( "{ 1 => 2}")
assert_equal 1 , lst.hash.keys.first.value
end
def test_two_length
lst = compile( "{ sym: :works , 'string_too' => 2}")
assert_equal 2 , lst.length
end
def test_two_key_one
lst = compile( "{ sym: :works , 'string_too' => 2}")
assert_equal :sym , lst.hash.keys.first.value
end
end
end

View File

@ -1,92 +0,0 @@
require_relative 'helper'
module Vool
class TestIfStatementX < MiniTest::Test
include RubyTests
def basic_if
"if(10 < 12) ; true ; end"
end
def test_if_basic
lst = compile( basic_if )
assert_equal IfStatement , lst.class
end
def test_if_basic_cond
lst = compile( basic_if )
assert_equal ScopeStatement , lst.condition.class
end
def test_if_basic_branches
lst = compile( basic_if )
assert_equal TrueConstant , lst.if_true.class
assert_nil lst.if_false
end
def double_if
"if(false) ; true ; else ; false; end"
end
def test_if_double
lst = compile( double_if )
assert_equal IfStatement , lst.class
end
def test_if_double_cond
lst = compile( double_if )
assert_equal ScopeStatement , lst.condition.class
end
def test_if_double_branches
lst = compile( double_if )
assert_equal TrueConstant , lst.if_true.class
assert_equal FalseConstant, lst.if_false.class
end
def reverse_if
"true if(false)"
end
def test_if_reverse
lst = compile( reverse_if )
assert_equal IfStatement , lst.class
end
def test_if_reverse_cond
lst = compile( reverse_if )
assert_equal FalseConstant , lst.condition.class
end
def test_if_reverse_branches
lst = compile( reverse_if )
assert_equal TrueConstant , lst.if_true.class
assert_nil lst.if_false
end
def reverse_unless
"true unless(false)"
end
def test_if_reverse
lst = compile( reverse_unless )
assert_equal IfStatement , lst.class
end
def test_if_reverse_cond
lst = compile( reverse_unless )
assert_equal ScopeStatement , lst.condition.class
end
def test_if_reverse_branches
lst = compile( reverse_unless )
assert_nil lst.if_true
assert_equal TrueConstant ,lst.if_false.class
end
def ternary
"false ? true : false"
end
def test_if_ternary
lst = compile( ternary )
assert_equal IfStatement , lst.class
end
def test_if_ternary_cond
lst = compile( ternary )
assert_equal FalseConstant , lst.condition.class
end
def test_if_ternary_branches
lst = compile( ternary )
assert_equal TrueConstant , lst.if_true.class
assert_equal FalseConstant, lst.if_false.class
end
end
end

View File

@ -1,32 +0,0 @@
require_relative "helper"
module Vool
class TestIvarAssignmentX < MiniTest::Test
include RubyTests
def test_local
lst = compile( "foo = bar")
assert_equal LocalAssignment , lst.class
end
def test_local_name
lst = compile( "foo = bar")
assert_equal :foo , lst.name
end
def test_instance
lst = compile( "@foo = bar")
assert_equal IvarAssignment , lst.class
end
def test_instance_name
lst = compile( "@foo = bar")
assert_equal :foo , lst.name
end
def test_const
lst = compile( "@foo = 5")
assert_equal IvarAssignment , lst.class
end
end
end

View File

@ -1,26 +0,0 @@
require_relative "helper"
module Vool
class TestLocalAssignmentX < MiniTest::Test
include RubyTests
def test_local
lst = compile( "foo = bar")
assert_equal LocalAssignment , lst.class
end
def test_local_name
lst = compile( "foo = bar")
assert_equal :foo , lst.name
end
def test_local_const
lst = compile( "foo = 5")
assert_equal LocalAssignment , lst.class
end
def test_local_ivar
lst = compile( "foo = @iv")
assert_equal LocalAssignment , lst.class
assert_equal InstanceVariable , lst.value.class
end
end
end

View File

@ -1,41 +0,0 @@
require_relative "helper"
module Vool
class TestLogicalX < MiniTest::Test
include RubyTests
def simple
compile( "@a and @b")
end
def test_simple
lst = simple
assert_equal LogicalStatement , lst.class
end
def test_simple_name
lst = simple
assert_equal :and , lst.name
end
def test_simple_left
lst = simple
assert_equal InstanceVariable , lst.left.class
end
def test_simple_right
lst = simple
assert_equal InstanceVariable , lst.right.class
end
def test_or
lst = compile( "@a or @b")
assert_equal :or , lst.name
end
def test_or2
lst = compile( "@a || @b")
assert_equal :or , lst.name
end
def test_and2
lst = compile( "@a && @b")
assert_equal :and , lst.name
end
end
end

View File

@ -1,41 +0,0 @@
require_relative "helper"
module Vool
class TestMethodStatementX < MiniTest::Test
include RubyTests
def basic_setup()
input = "def tryout(arg1, arg2) ; true ; false ; end "
@lst = compile( input )
end
def test_method
basic_setup
assert_equal MethodStatement , @lst.class
end
def test_method_name
basic_setup
assert_equal :tryout , @lst.name
end
def test_method_args
basic_setup
assert_equal [:arg1, :arg2] , @lst.args
end
def test_basic_body
basic_setup
assert_equal ScopeStatement , @lst.body.class
assert_equal 2 , @lst.body.length
end
def test_body_is_scope_one_statement
input = "def tryout(arg1, arg2) ; a = true ; end "
lst = compile( input )
assert_equal LocalAssignment , lst.body.class
end
def test_body_is_scope_zero_statement
input = "def tryout(arg1, arg2) ; arg1 = arg2 ; end "
lst = compile( input )
assert_equal LocalAssignment , lst.body.class
end
end
end

View File

@ -1,41 +0,0 @@
require_relative "helper"
module Vool
module OpAss
def test_local_name
assert_equal :foo , @lst.name
end
def test_local_value
assert_equal SendStatement , @lst.value.class
end
def test_local_method
assert_equal :+ , @lst.value.name
end
def test_local_receiver
assert_equal :foo , @lst.value.receiver.name
end
def test_local_receiver
assert_equal 5 , @lst.value.arguments.first.value
end
end
class TestLocalOpAssignX < MiniTest::Test
include OpAss
include RubyTests
def setup
@lst = compile( "foo += 5")
end
def test_local_ass
assert_equal LocalAssignment , @lst.class
end
end
class TestIvarOpAssignX < MiniTest::Test
include OpAss
include RubyTests
def setup
@lst = compile( "@foo += 5")
end
def test_ivar_ass
assert_equal IvarAssignment , @lst.class
end
end
end

View File

@ -1,24 +0,0 @@
require_relative "helper"
module Vool
class TestReturnStatementX < MiniTest::Test
include RubyTests
def test_return_const
lst = compile( "return 1" )
assert_equal ReturnStatement , lst.class
end
def test_return_value
lst = compile( "return 1" )
assert_equal 1 , lst.return_value.value
end
def test_return_send
lst = compile( "return foo" )
assert_equal SendStatement , lst.return_value.class
assert_equal :foo , lst.return_value.name
end
end
end

View File

@ -1,81 +0,0 @@
require_relative "helper"
module Vool
class TestSendX < MiniTest::Test
include RubyTests
def test_simple
lst = compile( "foo")
assert_equal SendStatement , lst.class
end
def test_simple_name
lst = compile( "foo")
assert_equal :foo , lst.name
end
def test_simple_receiver
lst = compile( "foo")
assert_equal SelfExpression , lst.receiver.class
end
def test_simple_args
lst = compile( "foo")
assert_equal [] , lst.arguments
end
def test_one_arg
lst = compile( "bar(1)")
assert_equal SendStatement , lst.class
end
def test_one_arg_name
lst = compile( "bar(1)")
assert_equal :bar , lst.name
end
def test_one_arg_receiver
lst = compile( "bar(1)")
assert_equal SelfExpression , lst.receiver.class
end
def test_one_arg_args
lst = compile( "bar(1)")
assert_equal 1 , lst.arguments.first.value
end
def test_super0_receiver
lst = compile( "super")
assert_equal SuperExpression , lst.receiver.class
end
def test_super0
lst = compile( "super")
assert_equal SendStatement , lst.class
end
def test_super_receiver
lst = compile( "super(1)")
assert_equal SuperExpression , lst.receiver.class
end
def test_super_args
lst = compile( "super(1)")
assert_equal 1 , lst.arguments.first.value
end
def test_super_name #is nil
lst = compile( "super(1)")
assert_nil lst.name
end
end
class TestSendReceiverType < MiniTest::Test
include RubyTests
def setup
Parfait.boot!
end
def test_int_receiver
sent = compile( "5.div4")
assert_equal Parfait::Type , sent.receiver.ct_type.class
assert_equal "Integer_Type" , sent.receiver.ct_type.name
end
def test_string_receiver
sent = compile( "'5'.putstring")
assert_equal Parfait::Type , sent.receiver.ct_type.class
assert_equal "Word_Type" , sent.receiver.ct_type.name
end
end
end

View File

@ -1,58 +0,0 @@
require_relative "helper"
module Vool
class TestVariablesX < MiniTest::Test
include RubyTests
# "free standing" local can not be tested as it will result in send
# in other words ther is no way of knowing if a name is variable or method
# one needs an assignemnt first, to "tell" the parser it's a local
def test_local_basic
lst = compile( "foo = 1 ; foo")
assert_equal ScopeStatement , lst.class
assert_equal LocalVariable , lst.statements[1].class
end
def test_local_nane
lst = compile( "foo = 1 ; foo")
assert_equal LocalVariable , lst.statements[1].class
end
def test_instance_basic
lst = compile( "@var" )
assert_equal InstanceVariable , lst.class
assert_equal :var , lst.name
end
def test_instance_return
lst = compile( "return @var" )
assert_equal InstanceVariable , lst.return_value.class
end
def test_class_basic
lst = compile( "@@var" )
assert_equal ClassVariable , lst.class
assert_equal :var , lst.name
end
def test_class_return
lst = compile( "return @@var" )
assert_equal ClassVariable , lst.return_value.class
end
def test_module_basic
lst = compile( "Module" )
assert_equal ModuleName , lst.class
assert_equal :Module , lst.name
end
def test_module_base_scoped
lst = compile( "::Module" )
assert_equal ModuleName , lst.class
assert_equal :Module , lst.name
end
def test_module_module_scoped
assert_raises {compile( "M::Module" ) }
end
end
end

View File

@ -1,40 +0,0 @@
require_relative 'helper'
module Vool
class TestWhileStatementX < MiniTest::Test
include RubyTests
def basic_while
"while(10 < 12) ; true ; end"
end
def test_while_basic
lst = compile( basic_while )
assert_equal WhileStatement , lst.class
end
def test_while_basic_cond
lst = compile( basic_while )
assert_equal ScopeStatement , lst.condition.class
end
def test_while_basic_branches
lst = compile( basic_while )
assert_equal TrueConstant , lst.body.class
end
def reverse_while
"true while(false)"
end
def test_while_reverse_branches
lst = compile( reverse_while )
assert_equal WhileStatement , lst.class
end
def test_while_reverse_cond
lst = compile( reverse_while )
assert_equal ScopeStatement , lst.condition.class
end
def test_while_reverse_branches
lst = compile( reverse_while )
assert_equal TrueConstant , lst.body.class
end
end
end

View File

@ -1,28 +0,0 @@
require_relative "helper"
module Vool
class TestYieldStatementX < MiniTest::Test
include RubyTests
def setup()
input = "def plus_one; yield(0) ; end "
@lst = compile( input )
end
def test_method
assert_equal MethodStatement , @lst.class
end
def test_block
assert_equal YieldStatement , @lst.body.class
end
def test_block_args
assert_equal IntegerConstant , @lst.body.arguments.first.class
end
def test_method_yield?
assert_equal true , @lst.has_yield?
end
def test_method_args
Parfait.boot!
assert_equal 2 , @lst.make_arg_type.get_length
end
end
end