rkelly-turbo 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.rdoc +38 -0
  3. data/Manifest.txt +203 -0
  4. data/README.rdoc +135 -0
  5. data/Rakefile +41 -0
  6. data/lib/parser.y +883 -0
  7. data/lib/rkelly.rb +14 -0
  8. data/lib/rkelly/char_pos.rb +39 -0
  9. data/lib/rkelly/char_range.rb +33 -0
  10. data/lib/rkelly/constants.rb +3 -0
  11. data/lib/rkelly/generated_parser.rb +3380 -0
  12. data/lib/rkelly/js.rb +14 -0
  13. data/lib/rkelly/js/array.rb +15 -0
  14. data/lib/rkelly/js/base.rb +91 -0
  15. data/lib/rkelly/js/boolean.rb +21 -0
  16. data/lib/rkelly/js/function.rb +39 -0
  17. data/lib/rkelly/js/function_prototype.rb +15 -0
  18. data/lib/rkelly/js/global_object.rb +52 -0
  19. data/lib/rkelly/js/math.rb +10 -0
  20. data/lib/rkelly/js/nan.rb +18 -0
  21. data/lib/rkelly/js/number.rb +22 -0
  22. data/lib/rkelly/js/object.rb +30 -0
  23. data/lib/rkelly/js/object_prototype.rb +14 -0
  24. data/lib/rkelly/js/property.rb +20 -0
  25. data/lib/rkelly/js/scope.rb +6 -0
  26. data/lib/rkelly/js/string.rb +21 -0
  27. data/lib/rkelly/lexeme.rb +18 -0
  28. data/lib/rkelly/nodes.rb +25 -0
  29. data/lib/rkelly/nodes/binary_node.rb +18 -0
  30. data/lib/rkelly/nodes/bracket_accessor_node.rb +11 -0
  31. data/lib/rkelly/nodes/case_clause_node.rb +11 -0
  32. data/lib/rkelly/nodes/comma_node.rb +11 -0
  33. data/lib/rkelly/nodes/conditional_node.rb +11 -0
  34. data/lib/rkelly/nodes/dot_accessor_node.rb +11 -0
  35. data/lib/rkelly/nodes/for_in_node.rb +12 -0
  36. data/lib/rkelly/nodes/for_node.rb +13 -0
  37. data/lib/rkelly/nodes/function_call_node.rb +16 -0
  38. data/lib/rkelly/nodes/function_decl_node.rb +6 -0
  39. data/lib/rkelly/nodes/function_expr_node.rb +12 -0
  40. data/lib/rkelly/nodes/if_node.rb +12 -0
  41. data/lib/rkelly/nodes/label_node.rb +11 -0
  42. data/lib/rkelly/nodes/new_expr_node.rb +11 -0
  43. data/lib/rkelly/nodes/node.rb +116 -0
  44. data/lib/rkelly/nodes/not_strict_equal_node.rb +6 -0
  45. data/lib/rkelly/nodes/op_equal_node.rb +16 -0
  46. data/lib/rkelly/nodes/postfix_node.rb +11 -0
  47. data/lib/rkelly/nodes/prefix_node.rb +6 -0
  48. data/lib/rkelly/nodes/property_node.rb +13 -0
  49. data/lib/rkelly/nodes/resolve_node.rb +19 -0
  50. data/lib/rkelly/nodes/strict_equal_node.rb +6 -0
  51. data/lib/rkelly/nodes/try_node.rb +13 -0
  52. data/lib/rkelly/nodes/var_decl_node.rb +15 -0
  53. data/lib/rkelly/parser.rb +106 -0
  54. data/lib/rkelly/runtime.rb +36 -0
  55. data/lib/rkelly/runtime/ruby_function.rb +13 -0
  56. data/lib/rkelly/runtime/scope_chain.rb +57 -0
  57. data/lib/rkelly/syntax_error.rb +4 -0
  58. data/lib/rkelly/token.rb +27 -0
  59. data/lib/rkelly/tokenizer.rb +255 -0
  60. data/lib/rkelly/visitable.rb +31 -0
  61. data/lib/rkelly/visitors.rb +4 -0
  62. data/lib/rkelly/visitors/dot_visitor.rb +228 -0
  63. data/lib/rkelly/visitors/ecma_visitor.rb +328 -0
  64. data/lib/rkelly/visitors/enumerable_visitor.rb +18 -0
  65. data/lib/rkelly/visitors/evaluation_visitor.rb +419 -0
  66. data/lib/rkelly/visitors/function_visitor.rb +46 -0
  67. data/lib/rkelly/visitors/pointcut_visitor.rb +31 -0
  68. data/lib/rkelly/visitors/real_sexp_visitor.rb +16 -0
  69. data/lib/rkelly/visitors/sexp_visitor.rb +373 -0
  70. data/lib/rkelly/visitors/visitor.rb +149 -0
  71. data/test/ecma_script_test_case.rb +21 -0
  72. data/test/execute_test_case.rb +16 -0
  73. data/test/execution_contexts/test_10_1_3-1.rb +32 -0
  74. data/test/expressions/test_11_3_1.rb +64 -0
  75. data/test/expressions/test_11_3_2.rb +64 -0
  76. data/test/expressions/test_11_4_2.rb +13 -0
  77. data/test/expressions/test_11_4_3.rb +52 -0
  78. data/test/expressions/test_11_4_4.rb +68 -0
  79. data/test/expressions/test_11_4_5.rb +69 -0
  80. data/test/expressions/test_11_4_6.rb +94 -0
  81. data/test/expressions/test_11_4_8.rb +28 -0
  82. data/test/expressions/test_11_4_9.rb +103 -0
  83. data/test/expressions/test_11_5_1.rb +51 -0
  84. data/test/expressions/test_11_5_2.rb +80 -0
  85. data/test/expressions/test_11_5_3.rb +88 -0
  86. data/test/expressions/test_11_6_1-1.rb +19 -0
  87. data/test/expressions/test_11_9_1.rb +19 -0
  88. data/test/function/test_15_3_1_1-1.rb +34 -0
  89. data/test/global_object/test_15_1_1_1.rb +29 -0
  90. data/test/global_object/test_15_1_1_2.rb +17 -0
  91. data/test/global_object/test_15_1_1_3.rb +9 -0
  92. data/test/helper.rb +5 -0
  93. data/test/node_test_case.rb +11 -0
  94. data/test/object/test_15_2_1_1.rb +257 -0
  95. data/test/object/test_15_2_1_2.rb +21 -0
  96. data/test/object/test_15_2_2_1.rb +52 -0
  97. data/test/statements/test_12_5-1.rb +27 -0
  98. data/test/test_add_node.rb +8 -0
  99. data/test/test_arguments_node.rb +8 -0
  100. data/test/test_array_node.rb +9 -0
  101. data/test/test_assign_expr_node.rb +8 -0
  102. data/test/test_automatic_semicolon_insertion.rb +137 -0
  103. data/test/test_bit_and_node.rb +8 -0
  104. data/test/test_bit_or_node.rb +8 -0
  105. data/test/test_bit_x_or_node.rb +8 -0
  106. data/test/test_bitwise_not_node.rb +8 -0
  107. data/test/test_block_node.rb +14 -0
  108. data/test/test_bracket_accessor_node.rb +16 -0
  109. data/test/test_break_node.rb +11 -0
  110. data/test/test_case_block_node.rb +11 -0
  111. data/test/test_case_clause_node.rb +15 -0
  112. data/test/test_char_pos.rb +39 -0
  113. data/test/test_char_range.rb +29 -0
  114. data/test/test_comma_node.rb +13 -0
  115. data/test/test_comments.rb +45 -0
  116. data/test/test_conditional_node.rb +17 -0
  117. data/test/test_const_statement_node.rb +14 -0
  118. data/test/test_continue_node.rb +11 -0
  119. data/test/test_delete_node.rb +8 -0
  120. data/test/test_divide_node.rb +8 -0
  121. data/test/test_do_while_node.rb +13 -0
  122. data/test/test_dot_accessor_node.rb +9 -0
  123. data/test/test_ecma_visitor.rb +213 -0
  124. data/test/test_element_node.rb +8 -0
  125. data/test/test_empty_statement_node.rb +8 -0
  126. data/test/test_equal_node.rb +8 -0
  127. data/test/test_evaluation_visitor.rb +66 -0
  128. data/test/test_expression_statement_node.rb +10 -0
  129. data/test/test_false_node.rb +8 -0
  130. data/test/test_for_in_node.rb +17 -0
  131. data/test/test_for_node.rb +24 -0
  132. data/test/test_function_body_node.rb +8 -0
  133. data/test/test_function_call_node.rb +10 -0
  134. data/test/test_function_decl_node.rb +16 -0
  135. data/test/test_function_expr_node.rb +16 -0
  136. data/test/test_function_visitor.rb +26 -0
  137. data/test/test_getter_property_node.rb +10 -0
  138. data/test/test_global_object.rb +49 -0
  139. data/test/test_greater_node.rb +8 -0
  140. data/test/test_greater_or_equal_node.rb +8 -0
  141. data/test/test_if_node.rb +17 -0
  142. data/test/test_in_node.rb +8 -0
  143. data/test/test_instance_of_node.rb +8 -0
  144. data/test/test_label_node.rb +13 -0
  145. data/test/test_left_shift_node.rb +8 -0
  146. data/test/test_less_node.rb +8 -0
  147. data/test/test_less_or_equal_node.rb +8 -0
  148. data/test/test_line_number.rb +81 -0
  149. data/test/test_logical_and_node.rb +8 -0
  150. data/test/test_logical_not_node.rb +8 -0
  151. data/test/test_logical_or_node.rb +8 -0
  152. data/test/test_modulus_node.rb +8 -0
  153. data/test/test_multiply_node.rb +8 -0
  154. data/test/test_new_expr_node.rb +9 -0
  155. data/test/test_not_equal_node.rb +8 -0
  156. data/test/test_not_strict_equal_node.rb +8 -0
  157. data/test/test_null_node.rb +8 -0
  158. data/test/test_number_node.rb +8 -0
  159. data/test/test_object_literal_node.rb +9 -0
  160. data/test/test_op_and_equal_node.rb +10 -0
  161. data/test/test_op_divide_equal_node.rb +10 -0
  162. data/test/test_op_equal_node.rb +10 -0
  163. data/test/test_op_l_shift_equal_node.rb +10 -0
  164. data/test/test_op_minus_equal_node.rb +10 -0
  165. data/test/test_op_mod_equal_node.rb +10 -0
  166. data/test/test_op_multiply_equal_node.rb +10 -0
  167. data/test/test_op_or_equal_node.rb +10 -0
  168. data/test/test_op_plus_equal_node.rb +10 -0
  169. data/test/test_op_r_shift_equal_node.rb +10 -0
  170. data/test/test_op_u_r_shift_equal_node.rb +10 -0
  171. data/test/test_op_x_or_equal_node.rb +10 -0
  172. data/test/test_parameter_node.rb +8 -0
  173. data/test/test_parser.rb +1434 -0
  174. data/test/test_pointcut_visitor.rb +34 -0
  175. data/test/test_postfix_node.rb +8 -0
  176. data/test/test_prefix_node.rb +8 -0
  177. data/test/test_property_node.rb +8 -0
  178. data/test/test_regexp_node.rb +8 -0
  179. data/test/test_resolve_node.rb +22 -0
  180. data/test/test_return_node.rb +11 -0
  181. data/test/test_right_shift_node.rb +8 -0
  182. data/test/test_rkelly.rb +19 -0
  183. data/test/test_runtime.rb +12 -0
  184. data/test/test_scope_chain.rb +50 -0
  185. data/test/test_setter_property_node.rb +10 -0
  186. data/test/test_source_elements.rb +9 -0
  187. data/test/test_strict_equal_node.rb +8 -0
  188. data/test/test_string_node.rb +8 -0
  189. data/test/test_subtract_node.rb +8 -0
  190. data/test/test_switch_node.rb +12 -0
  191. data/test/test_this_node.rb +8 -0
  192. data/test/test_throw_node.rb +7 -0
  193. data/test/test_tokenizer.rb +285 -0
  194. data/test/test_true_node.rb +8 -0
  195. data/test/test_try_node.rb +59 -0
  196. data/test/test_type_of_node.rb +8 -0
  197. data/test/test_unary_minus_node.rb +8 -0
  198. data/test/test_unary_plus_node.rb +8 -0
  199. data/test/test_unsigned_right_shift_node.rb +8 -0
  200. data/test/test_var_decl_node.rb +21 -0
  201. data/test/test_var_statement_node.rb +14 -0
  202. data/test/test_void_node.rb +8 -0
  203. data/test/test_while_node.rb +15 -0
  204. data/test/test_with_node.rb +8 -0
  205. metadata +293 -0
@@ -0,0 +1,17 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class ConditionalNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ initializer = AssignExprNode.new(NumberNode.new(20))
6
+ decl = VarDeclNode.new('foo', initializer)
7
+ stmt = VarStatementNode.new([decl])
8
+ and_node = LogicalAndNode.new(NumberNode.new(5), NumberNode.new(10))
9
+ node = ConditionalNode.new(and_node, stmt, stmt)
10
+ assert_sexp([:conditional,
11
+ [:and, [:lit, 5], [:lit, 10]],
12
+ [:var, [[:var_decl, :foo, [:assign, [:lit, 20]]]]],
13
+ [:var, [[:var_decl, :foo, [:assign, [:lit, 20]]]]]
14
+ ],
15
+ node)
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class ConstStatementNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ initializer = AssignExprNode.new(NumberNode.new(10))
6
+ decl = VarDeclNode.new('foo', initializer, true)
7
+ stmt = ConstStatementNode.new([decl])
8
+
9
+ assert_sexp(
10
+ [:const, [[:const_decl, :foo, [:assign, [:lit, 10]]]]],
11
+ stmt
12
+ )
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class ContinueNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = ContinueNode.new(nil)
6
+ assert_sexp([:continue], node)
7
+
8
+ node = ContinueNode.new('foo')
9
+ assert_sexp([:continue, 'foo'], node)
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class DeleteNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = DeleteNode.new(ResolveNode.new('foo'))
6
+ assert_sexp([:delete, [:resolve, 'foo']], node)
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class DivideNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = DivideNode.new(NumberNode.new(5), NumberNode.new(10))
6
+ assert_sexp([:divide, [:lit, 5], [:lit, 10]], node)
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class DoWhileNodeTest < NodeTestCase
4
+ def test_to_sepx
5
+ initializer = AssignExprNode.new(NumberNode.new(10))
6
+ decl = VarDeclNode.new('foo', initializer)
7
+ stmt = VarStatementNode.new([decl])
8
+ node = DoWhileNode.new(stmt, TrueNode.new('true'))
9
+
10
+ assert_sexp([:do_while, [:var, [[:var_decl, :foo, [:assign, [:lit, 10]]]]],
11
+ [:true]], node)
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class DotAccessorNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ resolve = ResolveNode.new('foo')
6
+ node = DotAccessorNode.new(resolve, 'bar')
7
+ assert_sexp([:dot_access, [:resolve, 'foo'], 'bar', ], node)
8
+ end
9
+ end
@@ -0,0 +1,213 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class ECMAVisitorTest < Test::Unit::TestCase
4
+ def setup
5
+ @parser = RKelly::Parser.new
6
+ end
7
+
8
+ def test_anonymous_function_expr
9
+ assert_to_ecma('a = function() { };')
10
+ end
11
+
12
+ def test_named_function_expr
13
+ assert_to_ecma('a = function b() { };')
14
+ end
15
+
16
+ def test_this_node
17
+ assert_to_ecma('this.foo;')
18
+ end
19
+
20
+ def test_bitwise_not_node
21
+ assert_to_ecma('~10;')
22
+ end
23
+
24
+ def test_delete_node
25
+ assert_to_ecma('delete foo;')
26
+ end
27
+
28
+ def test_element_node
29
+ assert_to_ecma('var foo = [1];')
30
+ end
31
+
32
+ def test_logical_not_node
33
+ assert_to_ecma('!foo;')
34
+ end
35
+
36
+ def test_unary_minus_node
37
+ assert_to_ecma('-0;')
38
+ end
39
+
40
+ def test_return_node
41
+ assert_to_ecma('return foo;')
42
+ assert_to_ecma('return;')
43
+ end
44
+
45
+ def test_throw_node
46
+ assert_to_ecma('throw foo;')
47
+ end
48
+
49
+ def test_type_of_node
50
+ assert_to_ecma('typeof foo;')
51
+ end
52
+
53
+ def test_unary_plus_node
54
+ assert_to_ecma('+10;')
55
+ end
56
+
57
+ def test_void_node
58
+ assert_to_ecma('void(0);')
59
+ end
60
+
61
+ [
62
+ [:add, '+'],
63
+ [:and_equal, '&='],
64
+ [:bit_and, '&'],
65
+ [:bit_or, '|'],
66
+ [:bit_xor, '^'],
67
+ [:divide, '/'],
68
+ [:divide_equal, '/='],
69
+ [:equal_equal, '=='],
70
+ [:greater, '>'],
71
+ [:greater_or_equal, '>='],
72
+ [:left_shift, '<<'],
73
+ [:left_shift_equal, '<<='],
74
+ [:less_or_equal, '<='],
75
+ [:logical_and, '&&'],
76
+ [:logical_or, '||'],
77
+ [:minus_equal, '-='],
78
+ [:mod, '%'],
79
+ [:mod_equal, '%='],
80
+ [:multiply, '*'],
81
+ [:multiply_equal, '*='],
82
+ [:not_equal, '!='],
83
+ [:not_strict_equal, '!=='],
84
+ [:or_equal, '|='],
85
+ [:plus_equal, '+='],
86
+ [:right_shift, '>>'],
87
+ [:right_shift_equal, '>>='],
88
+ [:strict_equal, '==='],
89
+ [:subtract, '-'],
90
+ [:ur_shift, '>>>'],
91
+ [:uright_shift_equal, '>>>='],
92
+ [:xor_equal, '^='],
93
+ [:instanceof, 'instanceof'],
94
+ ].each do |name, value|
95
+ define_method(:"test_#{name}_node") do
96
+ assert_to_ecma("10 #{value} 20;")
97
+ end
98
+ end
99
+
100
+ def test_while_node
101
+ assert_to_ecma("while(true) { foo(); }")
102
+ end
103
+
104
+ def test_switch_node
105
+ assert_to_ecma("switch(a) { }")
106
+ end
107
+
108
+ def test_switch_case_node
109
+ assert_to_ecma("switch(a) {
110
+ case 1:
111
+ foo();
112
+ break;
113
+ }")
114
+ end
115
+
116
+ def test_switch_default_node
117
+ assert_to_ecma("switch(a) {
118
+ case 1:
119
+ foo();
120
+ break;
121
+ default:
122
+ bar();
123
+ break;
124
+ }")
125
+ end
126
+
127
+ def test_do_while_node
128
+ assert_to_ecma("do { foo(); } while(true);")
129
+ end
130
+
131
+ def test_with_node
132
+ assert_to_ecma("with(o) { foo(); }")
133
+ end
134
+
135
+ def test_const_statement_node
136
+ assert_to_ecma("const foo;")
137
+ end
138
+
139
+ def test_label_node
140
+ assert_to_ecma("foo: var foo;")
141
+ end
142
+
143
+ def test_object_literal
144
+ assert_to_ecma("var foo = { };")
145
+ end
146
+
147
+ def test_property
148
+ assert_to_ecma("var foo = { bar: 10 };")
149
+ end
150
+
151
+ def test_getter_node
152
+ assert_to_ecma("var foo = { get a() { } };")
153
+ end
154
+
155
+ def test_setter_node
156
+ assert_to_ecma("var foo = { set a(b) { } };")
157
+ end
158
+
159
+ def test_bracket_access_node
160
+ assert_to_ecma("var foo = foo.bar[10];")
161
+ end
162
+
163
+ def test_new_expr_node
164
+ assert_to_ecma("var foo = new Array();")
165
+ assert_to_ecma("var foo = new Array(10);")
166
+ assert_to_ecma("var foo = new Array(a, 10);")
167
+ end
168
+
169
+ def test_try_finally
170
+ assert_to_ecma('try { var x = 10; } finally { var x = 20; }')
171
+ end
172
+
173
+ def test_try_catch
174
+ assert_to_ecma('try { var x = 10; } catch(a) { var x = 20; }')
175
+ end
176
+
177
+ def test_comma_node
178
+ assert_to_ecma('i = 10, j = 11;')
179
+ end
180
+
181
+ def test_in_node
182
+ assert_to_ecma('var x = 0 in foo;')
183
+ end
184
+
185
+ def test_if_node
186
+ assert_to_ecma('if(5 && 10) var foo = 20;')
187
+ assert_to_ecma('if(5 && 10) { var foo = 20; }')
188
+ assert_to_ecma('if(5 && 10) { var foo = 20; } else var foo = 10;')
189
+ assert_to_ecma('if(5 && 10) { var foo = 20; } else { var foo = 10; }')
190
+ end
191
+
192
+ def test_conditional_node
193
+ assert_to_ecma('var x = 5 < 10 ? 20 : 30;')
194
+ end
195
+
196
+ def test_for_in_node
197
+ assert_to_ecma('for(foo in bar) { var x = 10; }')
198
+ assert_to_ecma('for(var foo in bar) { var x = 10; }')
199
+ end
200
+
201
+ def test_for_node
202
+ assert_to_ecma('for(var i = 0; i < 10; i++) { var x = 10; }')
203
+ assert_to_ecma('var i = 0; for(; i < 10; i++) { var x = 10; }')
204
+ assert_to_ecma('var i; for(i = 0; i < 6; ++i) { var x = 10; }')
205
+ end
206
+
207
+ def assert_to_ecma(expected, actual = nil)
208
+ ecma = @parser.parse(actual || expected).to_ecma
209
+ ecma = ecma.gsub(/\n/, ' ').gsub(/\s+/, ' ')
210
+ expected = expected.gsub(/\n/, ' ').gsub(/\s+/, ' ')
211
+ assert_equal(expected, ecma)
212
+ end
213
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class ElementNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = ElementNode.new(NumberNode.new(10))
6
+ assert_sexp([:element, [:lit, 10]], node)
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class EmptyStatementNodeTest < NodeTestCase
4
+ def test_to_to_sexp
5
+ node = EmptyStatementNode.new(';')
6
+ assert_sexp([:empty], node)
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class EqualNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = EqualNode.new(NumberNode.new(5), NumberNode.new(10))
6
+ assert_sexp([:equal, [:lit, 5], [:lit, 10]], node)
7
+ end
8
+ end
@@ -0,0 +1,66 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class EvaluationVisitorTest < Test::Unit::TestCase
4
+ def setup
5
+ @parser = RKelly::Parser.new
6
+ @scope = RKelly::Runtime::ScopeChain.new
7
+ @visitor = RKelly::Visitors::EvaluationVisitor.new(@scope)
8
+ end
9
+
10
+ def assert_properties(actual, js_code)
11
+ tree = @parser.parse(js_code)
12
+ @visitor.accept(tree)
13
+ actual.each do |property, value|
14
+ assert @visitor.scope_chain.has_property?(property)
15
+ assert_equal value, @visitor.scope_chain[property].value
16
+ end
17
+ end
18
+
19
+ def test_variable
20
+ assert_properties({
21
+ 'foo' => 10,
22
+ }, 'var foo = 10;')
23
+ end
24
+
25
+ def test_add
26
+ assert_properties({
27
+ 'foo' => 6,
28
+ }, 'var foo = 1 + 5;')
29
+ end
30
+
31
+ def test_subtract
32
+ assert_properties({
33
+ 'foo' => 3,
34
+ }, 'var foo = 4 - 1;')
35
+ end
36
+
37
+ def test_multiply
38
+ assert_properties({
39
+ 'foo' => 8,
40
+ }, 'var foo = 4 * 2;')
41
+ end
42
+
43
+ def test_divide
44
+ assert_properties({
45
+ 'foo' => 2,
46
+ }, 'var foo = 4 / 2;')
47
+ end
48
+
49
+ def test_a_bunch
50
+ assert_properties({
51
+ 'foo' => 2,
52
+ }, 'var foo = 1 + 2 * 2 / 4;')
53
+ end
54
+
55
+ def test_add_resolve
56
+ assert_properties({
57
+ 'foo' => 3,
58
+ }, 'foo = 1 + 2;')
59
+ end
60
+
61
+ def test_plus_equal
62
+ assert_properties({
63
+ 'foo' => 3,
64
+ }, 'var foo = 1; foo += 2;')
65
+ end
66
+ end
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class ExpressionStatementNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ resolve = ResolveNode.new('foo')
6
+ access = DotAccessorNode.new(resolve, 'bar')
7
+ node = ExpressionStatementNode.new(access)
8
+ assert_sexp([:expression, [:dot_access, [:resolve, 'foo'], 'bar', ]], node)
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class FalseNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = FalseNode.new('false')
6
+ assert_sexp [:false], node
7
+ end
8
+ end
@@ -0,0 +1,17 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class ForInNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ initializer = AssignExprNode.new(NumberNode.new(10))
6
+ decl = VarDeclNode.new('foo', initializer)
7
+ stmt = VarStatementNode.new([decl])
8
+ block = BlockNode.new(SourceElementsNode.new([stmt]))
9
+
10
+ node = ForInNode.new(ResolveNode.new('foo'), ResolveNode.new('bar'), block)
11
+ assert_sexp([:for_in,
12
+ [:resolve, 'foo'],
13
+ [:resolve, 'bar'],
14
+ [:block, [[:var, [[:var_decl, :foo, [:assign, [:lit, 10]]]]]]]
15
+ ], node)
16
+ end
17
+ end