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,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
@@ -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,192 @@
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
+
13
+ def test_this_node
14
+ assert_to_ecma('this.foo;')
15
+ end
16
+
17
+ def test_bitwise_not_node
18
+ assert_to_ecma('~10;')
19
+ end
20
+
21
+ def test_delete_node
22
+ assert_to_ecma('delete foo;')
23
+ end
24
+
25
+ def test_element_node
26
+ assert_to_ecma('var foo = [1];')
27
+ end
28
+
29
+ def test_logical_not_node
30
+ assert_to_ecma('!foo;')
31
+ end
32
+
33
+ def test_unary_minus_node
34
+ assert_to_ecma('-0;')
35
+ end
36
+
37
+ def test_return_node
38
+ assert_to_ecma('return foo;')
39
+ assert_to_ecma('return;')
40
+ end
41
+
42
+ def test_throw_node
43
+ assert_to_ecma('throw foo;')
44
+ end
45
+
46
+ def test_type_of_node
47
+ assert_to_ecma('typeof foo;')
48
+ end
49
+
50
+ def test_unary_plus_node
51
+ assert_to_ecma('+10;')
52
+ end
53
+
54
+ def test_void_node
55
+ assert_to_ecma('void(0);')
56
+ end
57
+
58
+ [
59
+ [:add, '+'],
60
+ [:and_equal, '&='],
61
+ [:bit_and, '&'],
62
+ [:bit_or, '|'],
63
+ [:bit_xor, '^'],
64
+ [:divide, '/'],
65
+ [:divide_equal, '/='],
66
+ [:equal_equal, '=='],
67
+ [:greater, '>'],
68
+ [:greater_or_equal, '>='],
69
+ [:left_shift, '<<'],
70
+ [:left_shift_equal, '<<='],
71
+ [:less_or_equal, '<='],
72
+ [:logical_and, '&&'],
73
+ [:logical_or, '||'],
74
+ [:minus_equal, '-='],
75
+ [:mod, '%'],
76
+ [:mod_equal, '%='],
77
+ [:multiply, '*'],
78
+ [:multiply_equal, '*='],
79
+ [:not_equal, '!='],
80
+ [:not_strict_equal, '!=='],
81
+ [:or_equal, '|='],
82
+ [:plus_equal, '+='],
83
+ [:right_shift, '>>'],
84
+ [:right_shift_equal, '>>='],
85
+ [:strict_equal, '==='],
86
+ [:subtract, '-'],
87
+ [:ur_shift, '>>>'],
88
+ [:uright_shift_equal, '>>>='],
89
+ [:xor_equal, '^='],
90
+ [:instanceof, 'instanceof'],
91
+ ].each do |name, value|
92
+ define_method(:"test_#{name}_node") do
93
+ assert_to_ecma("10 #{value} 20;")
94
+ end
95
+ end
96
+
97
+ def test_while_node
98
+ assert_to_ecma("while(true) { foo(); }")
99
+ end
100
+
101
+ def test_switch_node
102
+ assert_to_ecma("switch(a) { }")
103
+ end
104
+
105
+ def test_switch_case_node
106
+ assert_to_ecma("switch(a) {
107
+ case 1:
108
+ foo();
109
+ break;
110
+ }")
111
+ end
112
+
113
+ def test_do_while_node
114
+ assert_to_ecma("do { foo(); } while(true);")
115
+ end
116
+
117
+ def test_with_node
118
+ assert_to_ecma("with(o) { foo(); }")
119
+ end
120
+
121
+ def test_const_statement_node
122
+ assert_to_ecma("const foo;")
123
+ end
124
+
125
+ def test_label_node
126
+ assert_to_ecma("foo: var foo;")
127
+ end
128
+
129
+ def test_object_literal
130
+ assert_to_ecma("var foo = { };")
131
+ end
132
+
133
+ def test_property
134
+ assert_to_ecma("var foo = { bar: 10 };")
135
+ end
136
+
137
+ def test_getter_node
138
+ assert_to_ecma("var foo = { get a() { } };")
139
+ end
140
+
141
+ def test_setter_node
142
+ assert_to_ecma("var foo = { set a(b) { } };")
143
+ end
144
+
145
+ def test_bracket_access_node
146
+ assert_to_ecma("var foo = foo.bar[10];")
147
+ end
148
+
149
+ def test_new_expr_node
150
+ assert_to_ecma("var foo = new Array();")
151
+ assert_to_ecma("var foo = new Array(10);")
152
+ assert_to_ecma("var foo = new Array(a, 10);")
153
+ end
154
+
155
+ def test_try_finally
156
+ assert_to_ecma('try { var x = 10; } finally { var x = 20; }')
157
+ end
158
+
159
+ def test_try_catch
160
+ assert_to_ecma('try { var x = 10; } catch(a) { var x = 20; }')
161
+ end
162
+
163
+ def test_comma_node
164
+ assert_to_ecma('i = 10, j = 11;')
165
+ end
166
+
167
+ def test_in_node
168
+ assert_to_ecma('var x = 0 in foo;')
169
+ end
170
+
171
+ def test_if_node
172
+ assert_to_ecma('if(5 && 10) var foo = 20;')
173
+ assert_to_ecma('if(5 && 10) { var foo = 20; }')
174
+ assert_to_ecma('if(5 && 10) { var foo = 20; } else var foo = 10;')
175
+ assert_to_ecma('if(5 && 10) { var foo = 20; } else { var foo = 10; }')
176
+ end
177
+
178
+ def test_conditional_node
179
+ assert_to_ecma('var x = 5 < 10 ? 20 : 30;')
180
+ end
181
+
182
+ def test_for_in_node
183
+ assert_to_ecma('for(foo in bar) { var x = 10; }')
184
+ end
185
+
186
+ def assert_to_ecma(expected, actual = nil)
187
+ ecma = @parser.parse(actual || expected).to_ecma
188
+ ecma = ecma.gsub(/\n/, ' ').gsub(/\s+/, ' ')
189
+ expected = expected.gsub(/\n/, ' ').gsub(/\s+/, ' ')
190
+ assert_equal(expected, ecma)
191
+ end
192
+ end