rkelly 1.0.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 (200) hide show
  1. data/CHANGELOG.txt +7 -0
  2. data/Manifest.txt +199 -0
  3. data/README.txt +58 -0
  4. data/Rakefile +85 -0
  5. data/lib/parser.y +870 -0
  6. data/lib/rkelly.rb +13 -0
  7. data/lib/rkelly/constants.rb +3 -0
  8. data/lib/rkelly/generated_parser.rb +3237 -0
  9. data/lib/rkelly/js.rb +14 -0
  10. data/lib/rkelly/js/array.rb +15 -0
  11. data/lib/rkelly/js/base.rb +91 -0
  12. data/lib/rkelly/js/boolean.rb +21 -0
  13. data/lib/rkelly/js/function.rb +39 -0
  14. data/lib/rkelly/js/function_prototype.rb +15 -0
  15. data/lib/rkelly/js/global_object.rb +52 -0
  16. data/lib/rkelly/js/math.rb +10 -0
  17. data/lib/rkelly/js/nan.rb +18 -0
  18. data/lib/rkelly/js/number.rb +22 -0
  19. data/lib/rkelly/js/object.rb +30 -0
  20. data/lib/rkelly/js/object_prototype.rb +14 -0
  21. data/lib/rkelly/js/property.rb +20 -0
  22. data/lib/rkelly/js/scope.rb +6 -0
  23. data/lib/rkelly/js/string.rb +21 -0
  24. data/lib/rkelly/lexeme.rb +18 -0
  25. data/lib/rkelly/nodes.rb +5 -0
  26. data/lib/rkelly/nodes/binary_node.rb +18 -0
  27. data/lib/rkelly/nodes/bracket_accessor_node.rb +11 -0
  28. data/lib/rkelly/nodes/case_clause_node.rb +11 -0
  29. data/lib/rkelly/nodes/comma_node.rb +11 -0
  30. data/lib/rkelly/nodes/conditional_node.rb +11 -0
  31. data/lib/rkelly/nodes/dot_accessor_node.rb +11 -0
  32. data/lib/rkelly/nodes/for_in_node.rb +12 -0
  33. data/lib/rkelly/nodes/for_node.rb +13 -0
  34. data/lib/rkelly/nodes/function_call_node.rb +16 -0
  35. data/lib/rkelly/nodes/function_decl_node.rb +6 -0
  36. data/lib/rkelly/nodes/function_expr_node.rb +12 -0
  37. data/lib/rkelly/nodes/if_node.rb +12 -0
  38. data/lib/rkelly/nodes/label_node.rb +11 -0
  39. data/lib/rkelly/nodes/new_expr_node.rb +11 -0
  40. data/lib/rkelly/nodes/node.rb +88 -0
  41. data/lib/rkelly/nodes/not_strict_equal_node.rb +6 -0
  42. data/lib/rkelly/nodes/op_equal_node.rb +16 -0
  43. data/lib/rkelly/nodes/postfix_node.rb +11 -0
  44. data/lib/rkelly/nodes/prefix_node.rb +6 -0
  45. data/lib/rkelly/nodes/property_node.rb +13 -0
  46. data/lib/rkelly/nodes/resolve_node.rb +19 -0
  47. data/lib/rkelly/nodes/strict_equal_node.rb +6 -0
  48. data/lib/rkelly/nodes/try_node.rb +13 -0
  49. data/lib/rkelly/nodes/var_decl_node.rb +15 -0
  50. data/lib/rkelly/parser.rb +100 -0
  51. data/lib/rkelly/runtime.rb +36 -0
  52. data/lib/rkelly/runtime/ruby_function.rb +13 -0
  53. data/lib/rkelly/runtime/scope_chain.rb +57 -0
  54. data/lib/rkelly/token.rb +15 -0
  55. data/lib/rkelly/tokenizer.rb +122 -0
  56. data/lib/rkelly/visitable.rb +16 -0
  57. data/lib/rkelly/visitors.rb +4 -0
  58. data/lib/rkelly/visitors/dot_visitor.rb +228 -0
  59. data/lib/rkelly/visitors/ecma_visitor.rb +314 -0
  60. data/lib/rkelly/visitors/enumerable_visitor.rb +18 -0
  61. data/lib/rkelly/visitors/evaluation_visitor.rb +419 -0
  62. data/lib/rkelly/visitors/function_visitor.rb +46 -0
  63. data/lib/rkelly/visitors/pointcut_visitor.rb +31 -0
  64. data/lib/rkelly/visitors/real_sexp_visitor.rb +16 -0
  65. data/lib/rkelly/visitors/sexp_visitor.rb +373 -0
  66. data/lib/rkelly/visitors/visitor.rb +136 -0
  67. data/rkelly.gemspec +33 -0
  68. data/test/ecma_script_test_case.rb +21 -0
  69. data/test/execute_test_case.rb +16 -0
  70. data/test/execution_contexts/test_10_1_3-1.rb +32 -0
  71. data/test/expressions/test_11_3_1.rb +64 -0
  72. data/test/expressions/test_11_3_2.rb +64 -0
  73. data/test/expressions/test_11_4_2.rb +13 -0
  74. data/test/expressions/test_11_4_3.rb +52 -0
  75. data/test/expressions/test_11_4_4.rb +68 -0
  76. data/test/expressions/test_11_4_5.rb +69 -0
  77. data/test/expressions/test_11_4_6.rb +88 -0
  78. data/test/expressions/test_11_4_8.rb +28 -0
  79. data/test/expressions/test_11_4_9.rb +103 -0
  80. data/test/expressions/test_11_5_1.rb +51 -0
  81. data/test/expressions/test_11_5_2.rb +80 -0
  82. data/test/expressions/test_11_5_3.rb +88 -0
  83. data/test/expressions/test_11_6_1-1.rb +19 -0
  84. data/test/expressions/test_11_9_1.rb +19 -0
  85. data/test/function/test_15_3_1_1-1.rb +34 -0
  86. data/test/global_object/test_15_1_1_1.rb +29 -0
  87. data/test/global_object/test_15_1_1_2.rb +17 -0
  88. data/test/global_object/test_15_1_1_3.rb +9 -0
  89. data/test/helper.rb +5 -0
  90. data/test/node_test_case.rb +11 -0
  91. data/test/object/test_15_2_1_1.rb +257 -0
  92. data/test/object/test_15_2_1_2.rb +21 -0
  93. data/test/object/test_15_2_2_1.rb +52 -0
  94. data/test/statements/test_12_5-1.rb +27 -0
  95. data/test/test_add_node.rb +8 -0
  96. data/test/test_arguments_node.rb +8 -0
  97. data/test/test_array_node.rb +9 -0
  98. data/test/test_assign_expr_node.rb +8 -0
  99. data/test/test_automatic_semicolon_insertion.rb +137 -0
  100. data/test/test_bit_and_node.rb +8 -0
  101. data/test/test_bit_or_node.rb +8 -0
  102. data/test/test_bit_x_or_node.rb +8 -0
  103. data/test/test_bitwise_not_node.rb +8 -0
  104. data/test/test_block_node.rb +14 -0
  105. data/test/test_bracket_accessor_node.rb +16 -0
  106. data/test/test_break_node.rb +11 -0
  107. data/test/test_case_block_node.rb +11 -0
  108. data/test/test_case_clause_node.rb +15 -0
  109. data/test/test_comma_node.rb +13 -0
  110. data/test/test_comments.rb +44 -0
  111. data/test/test_conditional_node.rb +17 -0
  112. data/test/test_const_statement_node.rb +14 -0
  113. data/test/test_continue_node.rb +11 -0
  114. data/test/test_delete_node.rb +8 -0
  115. data/test/test_divide_node.rb +8 -0
  116. data/test/test_do_while_node.rb +13 -0
  117. data/test/test_dot_accessor_node.rb +9 -0
  118. data/test/test_ecma_visitor.rb +192 -0
  119. data/test/test_element_node.rb +8 -0
  120. data/test/test_empty_statement_node.rb +8 -0
  121. data/test/test_equal_node.rb +8 -0
  122. data/test/test_evaluation_visitor.rb +66 -0
  123. data/test/test_expression_statement_node.rb +10 -0
  124. data/test/test_false_node.rb +8 -0
  125. data/test/test_for_in_node.rb +17 -0
  126. data/test/test_for_node.rb +24 -0
  127. data/test/test_function_body_node.rb +8 -0
  128. data/test/test_function_call_node.rb +10 -0
  129. data/test/test_function_decl_node.rb +16 -0
  130. data/test/test_function_expr_node.rb +16 -0
  131. data/test/test_function_visitor.rb +26 -0
  132. data/test/test_getter_property_node.rb +10 -0
  133. data/test/test_global_object.rb +49 -0
  134. data/test/test_greater_node.rb +8 -0
  135. data/test/test_greater_or_equal_node.rb +8 -0
  136. data/test/test_if_node.rb +17 -0
  137. data/test/test_in_node.rb +8 -0
  138. data/test/test_instance_of_node.rb +8 -0
  139. data/test/test_label_node.rb +13 -0
  140. data/test/test_left_shift_node.rb +8 -0
  141. data/test/test_less_node.rb +8 -0
  142. data/test/test_less_or_equal_node.rb +8 -0
  143. data/test/test_line_number.rb +23 -0
  144. data/test/test_logical_and_node.rb +8 -0
  145. data/test/test_logical_not_node.rb +8 -0
  146. data/test/test_logical_or_node.rb +8 -0
  147. data/test/test_modulus_node.rb +8 -0
  148. data/test/test_multiply_node.rb +8 -0
  149. data/test/test_new_expr_node.rb +9 -0
  150. data/test/test_not_equal_node.rb +8 -0
  151. data/test/test_not_strict_equal_node.rb +8 -0
  152. data/test/test_null_node.rb +8 -0
  153. data/test/test_number_node.rb +8 -0
  154. data/test/test_object_literal_node.rb +9 -0
  155. data/test/test_op_and_equal_node.rb +10 -0
  156. data/test/test_op_divide_equal_node.rb +10 -0
  157. data/test/test_op_equal_node.rb +10 -0
  158. data/test/test_op_l_shift_equal_node.rb +10 -0
  159. data/test/test_op_minus_equal_node.rb +10 -0
  160. data/test/test_op_mod_equal_node.rb +10 -0
  161. data/test/test_op_multiply_equal_node.rb +10 -0
  162. data/test/test_op_or_equal_node.rb +10 -0
  163. data/test/test_op_plus_equal_node.rb +10 -0
  164. data/test/test_op_r_shift_equal_node.rb +10 -0
  165. data/test/test_op_u_r_shift_equal_node.rb +10 -0
  166. data/test/test_op_x_or_equal_node.rb +10 -0
  167. data/test/test_parameter_node.rb +8 -0
  168. data/test/test_parser.rb +1355 -0
  169. data/test/test_pointcut_visitor.rb +34 -0
  170. data/test/test_postfix_node.rb +8 -0
  171. data/test/test_prefix_node.rb +8 -0
  172. data/test/test_property_node.rb +8 -0
  173. data/test/test_regexp_node.rb +8 -0
  174. data/test/test_resolve_node.rb +22 -0
  175. data/test/test_return_node.rb +11 -0
  176. data/test/test_right_shift_node.rb +8 -0
  177. data/test/test_rkelly.rb +19 -0
  178. data/test/test_runtime.rb +12 -0
  179. data/test/test_scope_chain.rb +50 -0
  180. data/test/test_setter_property_node.rb +10 -0
  181. data/test/test_source_elements.rb +9 -0
  182. data/test/test_strict_equal_node.rb +8 -0
  183. data/test/test_string_node.rb +8 -0
  184. data/test/test_subtract_node.rb +8 -0
  185. data/test/test_switch_node.rb +12 -0
  186. data/test/test_this_node.rb +8 -0
  187. data/test/test_throw_node.rb +7 -0
  188. data/test/test_tokenizer.rb +143 -0
  189. data/test/test_true_node.rb +8 -0
  190. data/test/test_try_node.rb +59 -0
  191. data/test/test_type_of_node.rb +8 -0
  192. data/test/test_unary_minus_node.rb +8 -0
  193. data/test/test_unary_plus_node.rb +8 -0
  194. data/test/test_unsigned_right_shift_node.rb +8 -0
  195. data/test/test_var_decl_node.rb +21 -0
  196. data/test/test_var_statement_node.rb +14 -0
  197. data/test/test_void_node.rb +8 -0
  198. data/test/test_while_node.rb +15 -0
  199. data/test/test_with_node.rb +8 -0
  200. metadata +390 -0
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + "/../helper"
2
+
3
+ class Statement_12_5_1_Test < ExecuteTestCase
4
+ def setup
5
+ @runtime = RKelly::Runtime.new
6
+ end
7
+
8
+ def test_if_true
9
+ assert_execute({ 'x' => 'pass' },
10
+ "var x; if(true) x = 'pass'; else x = 'fail';")
11
+ end
12
+
13
+ def test_if_false
14
+ assert_execute({ 'x' => 'pass' },
15
+ "var x; if(false) x = 'fail'; else x = 'pass';")
16
+ end
17
+
18
+ def test_if_zero
19
+ assert_execute({ 'x' => 'pass' },
20
+ "var x; if(0) x = 'fail'; else x = 'pass';")
21
+ end
22
+
23
+ def test_if_one
24
+ assert_execute({ 'x' => 'pass' },
25
+ "var x; if(1) x = 'pass'; else x = 'fail';")
26
+ end
27
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class AddNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = AddNode.new(NumberNode.new(5), NumberNode.new(10))
6
+ assert_sexp([:add, [:lit, 5], [:lit, 10]], node)
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class ArgumentsNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = ArgumentsNode.new([])
6
+ assert_sexp([:args, []], node)
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class ArrayNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ element = ElementNode.new(NumberNode.new(10))
6
+ node = ArrayNode.new([element])
7
+ assert_sexp([:array, [[:element, [:lit, 10]]]], node)
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class AssignExprNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = AssignExprNode.new(NumberNode.new(10))
6
+ assert_sexp [:assign, [:lit, 10]], node
7
+ end
8
+ end
@@ -0,0 +1,137 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class AutomaticSemicolonInsertionTest < Test::Unit::TestCase
4
+ def setup
5
+ @parser = RKelly::Parser.new
6
+ end
7
+
8
+ def test_basic_statement
9
+ assert_sexp(
10
+ [
11
+ [:return,
12
+ [:lit, 12]]
13
+ ],
14
+ @parser.parse('return 12'))
15
+ end
16
+
17
+ def test_multiline_expression
18
+ assert_sexp(
19
+ [
20
+ [:expression,
21
+ [:add,
22
+ [:lit, 1],
23
+ [:lit, 1]
24
+ ]
25
+ ]
26
+ ],
27
+ @parser.parse("1 +\n1"))
28
+ end
29
+
30
+ def test_multiple_statements
31
+ assert_sexp(
32
+ [
33
+ [:var,
34
+ [
35
+ [:var_decl, :foo, nil]
36
+ ]
37
+ ],
38
+ [:var,
39
+ [
40
+ [:var_decl, :bar, nil]
41
+ ]
42
+ ]
43
+ ],
44
+ @parser.parse("var foo\nvar bar"))
45
+ end
46
+
47
+ def test_bracketed_statement
48
+ assert_sexp(
49
+ [
50
+ [:block,
51
+ [
52
+ [:var,
53
+ [
54
+ [:var_decl, :foo, nil]
55
+ ]
56
+ ]
57
+ ]
58
+ ]
59
+ ],
60
+ @parser.parse("{var foo}"))
61
+ end
62
+
63
+ def test_insertion_before_plus_plus
64
+ assert_sexp(
65
+ [
66
+ [:expression,
67
+ [:op_equal,
68
+ [:resolve, "a"],
69
+ [:resolve, "b"]
70
+ ]
71
+ ],
72
+ [:expression,
73
+ [:prefix, [:resolve, "c"], "++"]
74
+ ]
75
+ ],
76
+ @parser.parse("a = b\n++c"))
77
+ end
78
+
79
+ def test_insertion_before_minus_minus
80
+ assert_sexp(
81
+ [
82
+ [:expression,
83
+ [:op_equal,
84
+ [:resolve, "a"],
85
+ [:resolve, "b"]
86
+ ]
87
+ ],
88
+ [:expression,
89
+ [:prefix, [:resolve, "c"], "--"]
90
+ ]
91
+ ],
92
+ @parser.parse("a = b\n--c"))
93
+ end
94
+
95
+ def test_insertion_after_continue
96
+ assert_sexp(
97
+ [
98
+ [:continue],
99
+ [:expression, [:resolve, "foo"]]
100
+ ],
101
+ @parser.parse("continue\nfoo"))
102
+ end
103
+
104
+ def test_insertion_after_break
105
+ assert_sexp(
106
+ [
107
+ [:break],
108
+ [:expression, [:resolve, "foo"]]
109
+ ],
110
+ @parser.parse("break\nfoo"))
111
+ end
112
+
113
+ def test_insertion_after_return
114
+ assert_sexp(
115
+ [
116
+ [:return],
117
+ [:expression, [:resolve, "foo"]]
118
+ ],
119
+ @parser.parse("return\nfoo"))
120
+ end
121
+
122
+ def test_insertion_after_throw
123
+ assert_nil @parser.parse("throw\nfoo")
124
+ end
125
+
126
+ def test_no_empty_statement_insertion
127
+ assert_nil @parser.parse("if (a > b)\nelse c = d")
128
+ end
129
+
130
+ def test_no_for_insertion
131
+ assert_nil @parser.parse("for (a;b\n){}")
132
+ end
133
+
134
+ def assert_sexp(expected, node)
135
+ assert_equal(expected, node.to_sexp)
136
+ end
137
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class BitAndNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = BitAndNode.new(NumberNode.new(5), NumberNode.new(10))
6
+ assert_sexp([:bit_and, [:lit, 5], [:lit, 10]], node)
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class BitOrNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = BitOrNode.new(NumberNode.new(5), NumberNode.new(10))
6
+ assert_sexp([:bit_or, [:lit, 5], [:lit, 10]], node)
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class BitXOrNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = BitXOrNode.new(NumberNode.new(5), NumberNode.new(10))
6
+ assert_sexp([:bit_xor, [:lit, 5], [:lit, 10]], node)
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class BitwiseNotNodeTest < NodeTestCase
4
+ def test_failure
5
+ node = BitwiseNotNode.new(NumberNode.new(10))
6
+ assert_sexp([:bitwise_not, [:lit, 10]], node)
7
+ end
8
+ end
@@ -0,0 +1,14 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class BlockNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ initializer = AssignExprNode.new(NumberNode.new(10))
6
+ var_foo = VarDeclNode.new('foo', initializer)
7
+
8
+ node = BlockNode.new(SourceElementsNode.new([]))
9
+ assert_sexp([:block, []], node)
10
+
11
+ node = BlockNode.new(SourceElementsNode.new([var_foo]))
12
+ assert_sexp([:block, [[:var_decl, :foo, [:assign, [:lit, 10]]]]], node)
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class BracketAccessorNodeTest < NodeTestCase
4
+ def test_sexp
5
+ resolve = ResolveNode.new('foo')
6
+ index = NumberNode.new(10)
7
+ node = BracketAccessorNode.new(resolve, index)
8
+ assert_sexp(
9
+ [:bracket_access,
10
+ [:resolve, 'foo'],
11
+ [:lit, 10],
12
+ ],
13
+ node
14
+ )
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class BreakNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = BreakNode.new(nil)
6
+ assert_sexp([:break], node)
7
+
8
+ node = BreakNode.new('foo')
9
+ assert_sexp([:break, 'foo'], node)
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class CaseBlockNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ clause = CaseClauseNode.new( ResolveNode.new('foo'),
6
+ SourceElementsNode.new([ResolveNode.new('bar')]))
7
+ node = CaseBlockNode.new([clause])
8
+ assert_sexp([:case_block, [[:case, [:resolve, 'foo'], [[:resolve, 'bar']]]]],
9
+ node)
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class CaseClauseNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ node = CaseClauseNode.new(ResolveNode.new('foo'))
6
+ assert_sexp([:case, [:resolve, 'foo'], []], node)
7
+
8
+ node = CaseClauseNode.new(nil)
9
+ assert_sexp([:case, nil, []], node)
10
+
11
+ node = CaseClauseNode.new( ResolveNode.new('foo'),
12
+ SourceElementsNode.new([ResolveNode.new('bar')]))
13
+ assert_sexp([:case, [:resolve, 'foo'], [[:resolve, 'bar']]], node)
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class CommaNodeTest < NodeTestCase
4
+ def test_to_sexp
5
+ left = OpEqualNode.new(ResolveNode.new('foo'), NumberNode.new(10))
6
+ right = OpEqualNode.new(ResolveNode.new('bar'), NumberNode.new(11))
7
+ node = CommaNode.new(left, right)
8
+ assert_sexp([:comma,
9
+ [:op_equal, [:resolve, 'foo'], [:lit, 10]],
10
+ [:op_equal, [:resolve, 'bar'], [:lit, 11]]],
11
+ node)
12
+ end
13
+ end
@@ -0,0 +1,44 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class CommentsTest < NodeTestCase
4
+ def test_some_comments
5
+ parser = RKelly::Parser.new
6
+ ast = parser.parse(<<-eojs)
7
+ /**
8
+ * This is an awesome test comment.
9
+ */
10
+ function aaron() { // This is a side comment
11
+ var x = 10;
12
+ return 1 + 1; // America!
13
+ }
14
+ eojs
15
+
16
+ func = ast.pointcut(FunctionDeclNode).matches.first
17
+ assert func
18
+ assert_match('awesome', func.comments[0].value)
19
+ assert_match('side', func.comments[1].value)
20
+
21
+ return_node = ast.pointcut(ReturnNode).matches.first
22
+ assert return_node
23
+ assert_match('America', return_node.comments[0].value)
24
+ end
25
+
26
+ def test_even_more_comments
27
+ parser = RKelly::Parser.new
28
+ ast = parser.parse(<<-eojs)
29
+ /**
30
+ * The first comment
31
+ */
32
+ /**
33
+ * This is an awesome test comment.
34
+ */
35
+ function aaron() { // This is a side comment
36
+ var x = 10;
37
+ return 1 + 1; // America!
38
+ }
39
+ eojs
40
+ func = ast.pointcut(FunctionDeclNode).matches.first
41
+ assert func
42
+ assert_equal(3, func.comments.length)
43
+ end
44
+ end
@@ -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