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)
49 lines
1.3 KiB
Ruby
49 lines
1.3 KiB
Ruby
require_relative "helper"
|
|
|
|
module Vool
|
|
class TestClassMethodExpression < MiniTest::Test
|
|
include VoolCompile
|
|
|
|
def class_code
|
|
"class Space;def self.meth; return meth(22 + 22) ; end;end"
|
|
end
|
|
def setup
|
|
Parfait.boot!(Parfait.default_test_options)
|
|
ruby_tree = Ruby::RubyCompiler.compile( class_code )
|
|
@clazz = ruby_tree.to_vool
|
|
end
|
|
def method
|
|
@clazz.body.first
|
|
end
|
|
def test_setup
|
|
assert_equal ClassExpression , @clazz.class
|
|
assert_equal Statements , @clazz.body.class
|
|
assert_equal ClassMethodExpression , method.class
|
|
end
|
|
def test_fail
|
|
assert_raises{ method.to_parfait }
|
|
end
|
|
def test_creates_class_method
|
|
clazz = @clazz.to_parfait
|
|
m = clazz.single_class.get_instance_method(:meth)
|
|
assert m , "no method :meth"
|
|
end
|
|
def test_creates_type_method
|
|
clazz = @clazz.to_parfait
|
|
m = clazz.single_class.instance_type.get_method(:meth)
|
|
assert m , "no type method :meth"
|
|
end
|
|
def as_mom
|
|
@clazz.to_parfait
|
|
@clazz.to_mom(nil)
|
|
end
|
|
def test_mom
|
|
assert_equal :meth , as_mom.method_compilers.callable.name
|
|
end
|
|
def test_mom_frame
|
|
callable = as_mom.method_compilers.callable
|
|
assert callable.frame_type.names.last.to_s.start_with?("tmp_") , "no tmp_ variable #{callable.frame_type.names}"
|
|
end
|
|
end
|
|
end
|