Added support for conditionals in Antimony source code.
[antimony.git] / test / ruby_to_ast_proxy_test.rb
blobfda0eb15194013fa45dbb91eb49999625c35a4e3
1 require 'test/unit'
2 require 'antimony/ast'
3 require 'antimony/generators/ruby_to_ast_proxy'
5 include Antimony
7 class GeneratorStub
8   def initialize
9     reset
10   end
12   def add section, *code
13     unless @sections.has_key? section
14       @sections[section] = []
15     end
16     @sections[section] = @sections[section] + code
17   end
19   def reset
20     @sections = {}
21   end
23   attr_accessor :sections
24 end
26 class RubyToAstProxyTest < Test::Unit::TestCase
27   def setup
28     # Create a RubyToAstProxy that feeds the translated code to our
29     # GeneratorStub.
30     @stub = GeneratorStub.new
31     @proxy = RubyToAstProxy.new @stub
32   end
34   def test_add
35     @stub.reset
36     @proxy.add :code, [:label, :test], [:goto, :test]
37     @proxy.add :data, [:label, :x], [:word, 42]
38     assert @stub.sections.has_key? :code
39     assert_equal 2, @stub.sections[:code].length
40     assert @stub.sections.has_key? :data
41     assert_equal 2, @stub.sections[:data].length
42   end
44   def test_function
45     @stub.reset
46     @proxy.add_function [:x, :y], [:return, :add, :x, :y]
47     assert @stub.sections.has_key? :functions
48     code = @stub.sections[:functions]
49     func = nil
50     code.each do |x|
51       if x.kind_of?(Ast::Statement) && x[0].kind_of?(Ast::Symbol) &&
52           x[0].name == :function
53         func = x
54         break
55       end
56     end
57     assert_not_nil func
58     assert_equal 4, func.exprs.length
59     assert_kind_of Ast::Symbol, func[1]
60     assert_equal :x, func[1].name
61     assert_kind_of Ast::Symbol, func[2]
62     assert_equal :y, func[2].name
63     assert_kind_of Ast::Block, func[-1]
64     ret = nil
65     func[-1].each do |x|
66       if x.kind_of? Ast::Statement
67         if x[0].kind_of? Ast::Symbol
68           if x[0].name == :return
69             ret = x
70             break
71           end
72         end
73       end
74     end
75     assert_not_nil ret
76     assert_equal :add, ret[1].name
77     assert_equal :x, ret[2].name
78     assert_equal :y, ret[3].name
79   end
80 end