tenderlove-rkelly 0.0.0.20080909095845

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 (196) hide show
  1. data/CHANGELOG.txt +7 -0
  2. data/Manifest.txt +197 -0
  3. data/README.txt +49 -0
  4. data/Rakefile +85 -0
  5. data/lib/parser.y +870 -0
  6. data/lib/rkelly.rb +8 -0
  7. data/lib/rkelly/constants.rb +3 -0
  8. data/lib/rkelly/js.rb +14 -0
  9. data/lib/rkelly/js/array.rb +15 -0
  10. data/lib/rkelly/js/base.rb +91 -0
  11. data/lib/rkelly/js/boolean.rb +21 -0
  12. data/lib/rkelly/js/function.rb +39 -0
  13. data/lib/rkelly/js/function_prototype.rb +15 -0
  14. data/lib/rkelly/js/global_object.rb +52 -0
  15. data/lib/rkelly/js/math.rb +10 -0
  16. data/lib/rkelly/js/nan.rb +18 -0
  17. data/lib/rkelly/js/number.rb +22 -0
  18. data/lib/rkelly/js/object.rb +30 -0
  19. data/lib/rkelly/js/object_prototype.rb +14 -0
  20. data/lib/rkelly/js/property.rb +20 -0
  21. data/lib/rkelly/js/scope.rb +6 -0
  22. data/lib/rkelly/js/string.rb +21 -0
  23. data/lib/rkelly/lexeme.rb +18 -0
  24. data/lib/rkelly/nodes.rb +5 -0
  25. data/lib/rkelly/nodes/binary_node.rb +18 -0
  26. data/lib/rkelly/nodes/bracket_accessor_node.rb +11 -0
  27. data/lib/rkelly/nodes/case_clause_node.rb +11 -0
  28. data/lib/rkelly/nodes/comma_node.rb +11 -0
  29. data/lib/rkelly/nodes/conditional_node.rb +11 -0
  30. data/lib/rkelly/nodes/dot_accessor_node.rb +11 -0
  31. data/lib/rkelly/nodes/for_in_node.rb +12 -0
  32. data/lib/rkelly/nodes/for_node.rb +13 -0
  33. data/lib/rkelly/nodes/function_call_node.rb +16 -0
  34. data/lib/rkelly/nodes/function_decl_node.rb +6 -0
  35. data/lib/rkelly/nodes/function_expr_node.rb +12 -0
  36. data/lib/rkelly/nodes/if_node.rb +12 -0
  37. data/lib/rkelly/nodes/label_node.rb +11 -0
  38. data/lib/rkelly/nodes/new_expr_node.rb +11 -0
  39. data/lib/rkelly/nodes/node.rb +80 -0
  40. data/lib/rkelly/nodes/not_strict_equal_node.rb +6 -0
  41. data/lib/rkelly/nodes/op_equal_node.rb +16 -0
  42. data/lib/rkelly/nodes/postfix_node.rb +11 -0
  43. data/lib/rkelly/nodes/prefix_node.rb +6 -0
  44. data/lib/rkelly/nodes/property_node.rb +13 -0
  45. data/lib/rkelly/nodes/resolve_node.rb +19 -0
  46. data/lib/rkelly/nodes/strict_equal_node.rb +6 -0
  47. data/lib/rkelly/nodes/try_node.rb +13 -0
  48. data/lib/rkelly/nodes/var_decl_node.rb +15 -0
  49. data/lib/rkelly/parser.rb +98 -0
  50. data/lib/rkelly/runtime.rb +36 -0
  51. data/lib/rkelly/runtime/ruby_function.rb +13 -0
  52. data/lib/rkelly/runtime/scope_chain.rb +57 -0
  53. data/lib/rkelly/token.rb +15 -0
  54. data/lib/rkelly/tokenizer.rb +122 -0
  55. data/lib/rkelly/visitable.rb +16 -0
  56. data/lib/rkelly/visitors.rb +4 -0
  57. data/lib/rkelly/visitors/dot_visitor.rb +228 -0
  58. data/lib/rkelly/visitors/ecma_visitor.rb +314 -0
  59. data/lib/rkelly/visitors/enumerable_visitor.rb +18 -0
  60. data/lib/rkelly/visitors/evaluation_visitor.rb +419 -0
  61. data/lib/rkelly/visitors/function_visitor.rb +46 -0
  62. data/lib/rkelly/visitors/pointcut_visitor.rb +18 -0
  63. data/lib/rkelly/visitors/sexp_visitor.rb +374 -0
  64. data/lib/rkelly/visitors/visitor.rb +136 -0
  65. data/test/ecma_script_test_case.rb +21 -0
  66. data/test/execute_test_case.rb +16 -0
  67. data/test/execution_contexts/test_10_1_3-1.rb +32 -0
  68. data/test/expressions/test_11_3_1.rb +64 -0
  69. data/test/expressions/test_11_3_2.rb +64 -0
  70. data/test/expressions/test_11_4_2.rb +13 -0
  71. data/test/expressions/test_11_4_3.rb +52 -0
  72. data/test/expressions/test_11_4_4.rb +68 -0
  73. data/test/expressions/test_11_4_5.rb +69 -0
  74. data/test/expressions/test_11_4_6.rb +88 -0
  75. data/test/expressions/test_11_4_8.rb +28 -0
  76. data/test/expressions/test_11_4_9.rb +103 -0
  77. data/test/expressions/test_11_5_1.rb +51 -0
  78. data/test/expressions/test_11_5_2.rb +80 -0
  79. data/test/expressions/test_11_5_3.rb +88 -0
  80. data/test/expressions/test_11_6_1-1.rb +19 -0
  81. data/test/expressions/test_11_9_1.rb +19 -0
  82. data/test/function/test_15_3_1_1-1.rb +34 -0
  83. data/test/global_object/test_15_1_1_1.rb +29 -0
  84. data/test/global_object/test_15_1_1_2.rb +17 -0
  85. data/test/global_object/test_15_1_1_3.rb +9 -0
  86. data/test/helper.rb +5 -0
  87. data/test/node_test_case.rb +11 -0
  88. data/test/object/test_15_2_1_1.rb +257 -0
  89. data/test/object/test_15_2_1_2.rb +21 -0
  90. data/test/object/test_15_2_2_1.rb +52 -0
  91. data/test/statements/test_12_5-1.rb +27 -0
  92. data/test/test_add_node.rb +8 -0
  93. data/test/test_arguments_node.rb +8 -0
  94. data/test/test_array_node.rb +9 -0
  95. data/test/test_assign_expr_node.rb +8 -0
  96. data/test/test_automatic_semicolon_insertion.rb +137 -0
  97. data/test/test_bit_and_node.rb +8 -0
  98. data/test/test_bit_or_node.rb +8 -0
  99. data/test/test_bit_x_or_node.rb +8 -0
  100. data/test/test_bitwise_not_node.rb +8 -0
  101. data/test/test_block_node.rb +14 -0
  102. data/test/test_bracket_accessor_node.rb +16 -0
  103. data/test/test_break_node.rb +11 -0
  104. data/test/test_case_block_node.rb +11 -0
  105. data/test/test_case_clause_node.rb +15 -0
  106. data/test/test_comma_node.rb +13 -0
  107. data/test/test_comments.rb +44 -0
  108. data/test/test_conditional_node.rb +17 -0
  109. data/test/test_const_statement_node.rb +14 -0
  110. data/test/test_continue_node.rb +11 -0
  111. data/test/test_delete_node.rb +8 -0
  112. data/test/test_divide_node.rb +8 -0
  113. data/test/test_do_while_node.rb +13 -0
  114. data/test/test_dot_accessor_node.rb +9 -0
  115. data/test/test_ecma_visitor.rb +192 -0
  116. data/test/test_element_node.rb +8 -0
  117. data/test/test_empty_statement_node.rb +8 -0
  118. data/test/test_equal_node.rb +8 -0
  119. data/test/test_evaluation_visitor.rb +66 -0
  120. data/test/test_expression_statement_node.rb +10 -0
  121. data/test/test_false_node.rb +8 -0
  122. data/test/test_for_in_node.rb +17 -0
  123. data/test/test_for_node.rb +24 -0
  124. data/test/test_function_body_node.rb +8 -0
  125. data/test/test_function_call_node.rb +10 -0
  126. data/test/test_function_decl_node.rb +16 -0
  127. data/test/test_function_expr_node.rb +16 -0
  128. data/test/test_function_visitor.rb +26 -0
  129. data/test/test_getter_property_node.rb +10 -0
  130. data/test/test_global_object.rb +49 -0
  131. data/test/test_greater_node.rb +8 -0
  132. data/test/test_greater_or_equal_node.rb +8 -0
  133. data/test/test_if_node.rb +17 -0
  134. data/test/test_in_node.rb +8 -0
  135. data/test/test_instance_of_node.rb +8 -0
  136. data/test/test_label_node.rb +13 -0
  137. data/test/test_left_shift_node.rb +8 -0
  138. data/test/test_less_node.rb +8 -0
  139. data/test/test_less_or_equal_node.rb +8 -0
  140. data/test/test_line_number.rb +23 -0
  141. data/test/test_logical_and_node.rb +8 -0
  142. data/test/test_logical_not_node.rb +8 -0
  143. data/test/test_logical_or_node.rb +8 -0
  144. data/test/test_modulus_node.rb +8 -0
  145. data/test/test_multiply_node.rb +8 -0
  146. data/test/test_new_expr_node.rb +9 -0
  147. data/test/test_not_equal_node.rb +8 -0
  148. data/test/test_not_strict_equal_node.rb +8 -0
  149. data/test/test_null_node.rb +8 -0
  150. data/test/test_number_node.rb +8 -0
  151. data/test/test_object_literal_node.rb +9 -0
  152. data/test/test_op_and_equal_node.rb +10 -0
  153. data/test/test_op_divide_equal_node.rb +10 -0
  154. data/test/test_op_equal_node.rb +10 -0
  155. data/test/test_op_l_shift_equal_node.rb +10 -0
  156. data/test/test_op_minus_equal_node.rb +10 -0
  157. data/test/test_op_mod_equal_node.rb +10 -0
  158. data/test/test_op_multiply_equal_node.rb +10 -0
  159. data/test/test_op_or_equal_node.rb +10 -0
  160. data/test/test_op_plus_equal_node.rb +10 -0
  161. data/test/test_op_r_shift_equal_node.rb +10 -0
  162. data/test/test_op_u_r_shift_equal_node.rb +10 -0
  163. data/test/test_op_x_or_equal_node.rb +10 -0
  164. data/test/test_parameter_node.rb +8 -0
  165. data/test/test_parser.rb +1355 -0
  166. data/test/test_pointcut_visitor.rb +34 -0
  167. data/test/test_postfix_node.rb +8 -0
  168. data/test/test_prefix_node.rb +8 -0
  169. data/test/test_property_node.rb +8 -0
  170. data/test/test_regexp_node.rb +8 -0
  171. data/test/test_resolve_node.rb +22 -0
  172. data/test/test_return_node.rb +11 -0
  173. data/test/test_right_shift_node.rb +8 -0
  174. data/test/test_runtime.rb +12 -0
  175. data/test/test_scope_chain.rb +50 -0
  176. data/test/test_setter_property_node.rb +10 -0
  177. data/test/test_source_elements.rb +9 -0
  178. data/test/test_strict_equal_node.rb +8 -0
  179. data/test/test_string_node.rb +8 -0
  180. data/test/test_subtract_node.rb +8 -0
  181. data/test/test_switch_node.rb +12 -0
  182. data/test/test_this_node.rb +8 -0
  183. data/test/test_throw_node.rb +7 -0
  184. data/test/test_tokenizer.rb +143 -0
  185. data/test/test_true_node.rb +8 -0
  186. data/test/test_try_node.rb +59 -0
  187. data/test/test_type_of_node.rb +8 -0
  188. data/test/test_unary_minus_node.rb +8 -0
  189. data/test/test_unary_plus_node.rb +8 -0
  190. data/test/test_unsigned_right_shift_node.rb +8 -0
  191. data/test/test_var_decl_node.rb +21 -0
  192. data/test/test_var_statement_node.rb +14 -0
  193. data/test/test_void_node.rb +8 -0
  194. data/test/test_while_node.rb +15 -0
  195. data/test/test_with_node.rb +8 -0
  196. metadata +385 -0
@@ -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
@@ -0,0 +1,24 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class ForNodeTest < NodeTestCase
4
+ def test_failure
5
+ initializer = AssignExprNode.new(NumberNode.new(10))
6
+ decl = VarDeclNode.new('foo', initializer)
7
+ stmt = VarStatementNode.new([decl])
8
+
9
+ compare = LessNode.new(ResolveNode.new('foo'), NumberNode.new(10))
10
+ exec = PostfixNode.new(ResolveNode.new('foo'), '++')
11
+
12
+ block = BlockNode.new(SourceElementsNode.new([stmt]))
13
+
14
+ node = ForNode.new(nil, nil, nil, block)
15
+ assert_sexp([:for, nil, nil, nil, [:block, [[:var, [[:var_decl, :foo, [:assign, [:lit, 10]]]]]]]], node)
16
+
17
+ node = ForNode.new(stmt, compare, exec, block)
18
+ assert_sexp([:for,
19
+ [:var, [[:var_decl, :foo, [:assign, [:lit, 10]]]]],
20
+ [:less, [:resolve, 'foo'], [:lit, 10]],
21
+ [:postfix, [:resolve, 'foo'], '++'],
22
+ [:block, [[:var, [[:var_decl, :foo, [:assign, [:lit, 10]]]]]]]], node)
23
+ end
24
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class FunctionBodyNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = FunctionBodyNode.new(SourceElementsNode.new([]))
6
+ assert_sexp([:func_body, []], node)
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class FunctionCallNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ resolve = ResolveNode.new('foo')
6
+ args = ArgumentsNode.new([])
7
+ node = FunctionCallNode.new(resolve, args)
8
+ assert_sexp([:function_call, [:resolve, 'foo'], [:args, []]], node)
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class FunctionDeclNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ body = FunctionBodyNode.new(SourceElementsNode.new([]))
6
+ node = FunctionDeclNode.new(nil, body)
7
+ assert_sexp([:func_decl, nil, [], [:func_body, []]], node)
8
+ end
9
+
10
+ def test_to_sexp_with_args
11
+ body = FunctionBodyNode.new(SourceElementsNode.new([]))
12
+ node = FunctionDeclNode.new(nil, body, [ParameterNode.new('a')])
13
+ assert_sexp([:func_decl, nil, [[:param, 'a']], [:func_body, []]],
14
+ node)
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class FunctionExprNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ body = FunctionBodyNode.new(SourceElementsNode.new([]))
6
+ node = FunctionExprNode.new(nil, body)
7
+ assert_sexp([:func_expr, nil, [], [:func_body, []]], node)
8
+ end
9
+
10
+ def test_to_sexp_with_args
11
+ body = FunctionBodyNode.new(SourceElementsNode.new([]))
12
+ node = FunctionExprNode.new(nil, body, [ParameterNode.new('a')])
13
+ assert_sexp([:func_expr, nil, [[:param, 'a']], [:func_body, []]],
14
+ node)
15
+ end
16
+ end
@@ -0,0 +1,26 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class FunctionVisitorTest < Test::Unit::TestCase
4
+ def setup
5
+ @parser = RKelly::Parser.new
6
+ @scope = RKelly::Runtime::ScopeChain.new
7
+ @visitor = RKelly::Visitors::FunctionVisitor.new(@scope)
8
+ end
9
+
10
+ def test_function
11
+ tree = @parser.parse('function foo() { var x = 10; }')
12
+ @visitor.accept(tree)
13
+ assert @visitor.scope_chain['foo']
14
+
15
+ tree = @parser.parse('function foo() { var x = 10; function bar() {}; }')
16
+ @visitor.accept(tree)
17
+ assert @visitor.scope_chain['foo']
18
+ assert !@visitor.scope_chain.has_property?('bar')
19
+ end
20
+
21
+ def test_function_call
22
+ tree = @parser.parse('var x = foo(); function foo() { return 10; }')
23
+ @visitor.accept(tree)
24
+ assert @visitor.scope_chain['foo']
25
+ end
26
+ end
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class GetterPropertyNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ body = FunctionBodyNode.new(SourceElementsNode.new([]))
6
+ function = FunctionExprNode.new(nil, body)
7
+ node = GetterPropertyNode.new('foo', function)
8
+ assert_sexp([:getter, 'foo', [:func_expr, nil, [], [:func_body, []]]], node)
9
+ end
10
+ end
@@ -0,0 +1,49 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class GlobalObjectTest < Test::Unit::TestCase
4
+ include RKelly::JS
5
+
6
+ def setup
7
+ @object = GlobalObject.new
8
+ end
9
+
10
+ def test_initialize
11
+ assert_equal :undefined, @object['prototype'].value
12
+ assert_equal 'GlobalObject', @object['class'].value
13
+ end
14
+
15
+ def test_braces
16
+ @object['foo'] = 'blah'
17
+ assert @object.has_property?('foo')
18
+ assert @object['foo']
19
+ assert_equal('blah', @object['foo'].value)
20
+ end
21
+
22
+ def test_undefined_brace
23
+ #assert_equal :undefined, @object['foo'].value
24
+ end
25
+
26
+ def test_delete
27
+ assert !@object.has_property?('foo')
28
+ @object['foo'] = 'blah'
29
+ assert @object.has_property?('foo')
30
+ assert @object.delete('foo')
31
+ assert !@object.has_property?('foo')
32
+ end
33
+
34
+ def test_can_put
35
+ @object['foo'] = 'blah'
36
+ @object['foo'].attributes << :read_only
37
+ assert @object['foo'].read_only?
38
+ end
39
+
40
+ def test_prototype
41
+ proto = GlobalObject.new
42
+ proto['foo'] = 'bar'
43
+ assert proto.has_property?('foo')
44
+
45
+ assert !@object.has_property?('foo')
46
+ @object['prototype'] = proto
47
+ assert @object.has_property?('foo')
48
+ end
49
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class GreaterNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = GreaterNode.new(NumberNode.new(5), NumberNode.new(10))
6
+ assert_sexp([:greater, [:lit, 5], [:lit, 10]], node)
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class GreaterOrEqualNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = GreaterOrEqualNode.new(NumberNode.new(5), NumberNode.new(10))
6
+ assert_sexp([:greater_or_equal, [:lit, 5], [:lit, 10]], node)
7
+ end
8
+ end
@@ -0,0 +1,17 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class IfNodeTest < 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 = IfNode.new(and_node, stmt)
10
+
11
+ assert_sexp([:if,
12
+ [:and, [:lit, 5], [:lit, 10]],
13
+ [:var, [[:var_decl, :foo, [:assign, [:lit, 20]]]]]],
14
+ node)
15
+
16
+ end
17
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class InNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = InNode.new(NumberNode.new(5), ResolveNode.new('foo'))
6
+ assert_sexp([:in, [:lit, 5], [:resolve, 'foo']], node)
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class InstanceOfNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = InstanceOfNode.new(NumberNode.new(5), NumberNode.new(10))
6
+ assert_sexp([:instance_of, [:lit, 5], [:lit, 10]], node)
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class LabelNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ initializer = AssignExprNode.new(NumberNode.new(10))
6
+ var = VarDeclNode.new('bar', initializer)
7
+ node = LabelNode.new('foo', var)
8
+ assert_sexp(
9
+ [:label, 'foo',
10
+ [:var_decl, :bar, [:assign, [:lit, 10]]],
11
+ ], node)
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class LeftShiftNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = LeftShiftNode.new(NumberNode.new(5), NumberNode.new(10))
6
+ assert_sexp([:lshift, [:lit, 5], [:lit, 10]], node)
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class LessNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = LessNode.new(NumberNode.new(5), NumberNode.new(10))
6
+ assert_sexp([:less, [:lit, 5], [:lit, 10]], node)
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class LessOrEqualNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = LessOrEqualNode.new(NumberNode.new(5), NumberNode.new(10))
6
+ assert_sexp([:less_or_equal, [:lit, 5], [:lit, 10]], node)
7
+ end
8
+ end
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class LineNumberTest < NodeTestCase
4
+ def test_line_numbers
5
+ parser = RKelly::Parser.new
6
+ ast = parser.parse(<<-eojs)
7
+ /**
8
+ * This is an awesome test comment.
9
+ */
10
+ function aaron() {
11
+ var x = 10;
12
+ return 1 + 1;
13
+ }
14
+ eojs
15
+ func = ast.pointcut(FunctionDeclNode).matches.first
16
+ assert func
17
+ assert_equal(4, func.line)
18
+
19
+ return_node = ast.pointcut(ReturnNode).matches.first
20
+ assert return_node
21
+ assert_equal(6, return_node.line)
22
+ end
23
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class LogicalAndNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = LogicalAndNode.new(NumberNode.new(5), NumberNode.new(10))
6
+ assert_sexp([:and, [:lit, 5], [:lit, 10]], node)
7
+ end
8
+ end