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.
- data/CHANGELOG.txt +7 -0
- data/Manifest.txt +197 -0
- data/README.txt +49 -0
- data/Rakefile +85 -0
- data/lib/parser.y +870 -0
- data/lib/rkelly.rb +8 -0
- data/lib/rkelly/constants.rb +3 -0
- data/lib/rkelly/js.rb +14 -0
- data/lib/rkelly/js/array.rb +15 -0
- data/lib/rkelly/js/base.rb +91 -0
- data/lib/rkelly/js/boolean.rb +21 -0
- data/lib/rkelly/js/function.rb +39 -0
- data/lib/rkelly/js/function_prototype.rb +15 -0
- data/lib/rkelly/js/global_object.rb +52 -0
- data/lib/rkelly/js/math.rb +10 -0
- data/lib/rkelly/js/nan.rb +18 -0
- data/lib/rkelly/js/number.rb +22 -0
- data/lib/rkelly/js/object.rb +30 -0
- data/lib/rkelly/js/object_prototype.rb +14 -0
- data/lib/rkelly/js/property.rb +20 -0
- data/lib/rkelly/js/scope.rb +6 -0
- data/lib/rkelly/js/string.rb +21 -0
- data/lib/rkelly/lexeme.rb +18 -0
- data/lib/rkelly/nodes.rb +5 -0
- data/lib/rkelly/nodes/binary_node.rb +18 -0
- data/lib/rkelly/nodes/bracket_accessor_node.rb +11 -0
- data/lib/rkelly/nodes/case_clause_node.rb +11 -0
- data/lib/rkelly/nodes/comma_node.rb +11 -0
- data/lib/rkelly/nodes/conditional_node.rb +11 -0
- data/lib/rkelly/nodes/dot_accessor_node.rb +11 -0
- data/lib/rkelly/nodes/for_in_node.rb +12 -0
- data/lib/rkelly/nodes/for_node.rb +13 -0
- data/lib/rkelly/nodes/function_call_node.rb +16 -0
- data/lib/rkelly/nodes/function_decl_node.rb +6 -0
- data/lib/rkelly/nodes/function_expr_node.rb +12 -0
- data/lib/rkelly/nodes/if_node.rb +12 -0
- data/lib/rkelly/nodes/label_node.rb +11 -0
- data/lib/rkelly/nodes/new_expr_node.rb +11 -0
- data/lib/rkelly/nodes/node.rb +80 -0
- data/lib/rkelly/nodes/not_strict_equal_node.rb +6 -0
- data/lib/rkelly/nodes/op_equal_node.rb +16 -0
- data/lib/rkelly/nodes/postfix_node.rb +11 -0
- data/lib/rkelly/nodes/prefix_node.rb +6 -0
- data/lib/rkelly/nodes/property_node.rb +13 -0
- data/lib/rkelly/nodes/resolve_node.rb +19 -0
- data/lib/rkelly/nodes/strict_equal_node.rb +6 -0
- data/lib/rkelly/nodes/try_node.rb +13 -0
- data/lib/rkelly/nodes/var_decl_node.rb +15 -0
- data/lib/rkelly/parser.rb +98 -0
- data/lib/rkelly/runtime.rb +36 -0
- data/lib/rkelly/runtime/ruby_function.rb +13 -0
- data/lib/rkelly/runtime/scope_chain.rb +57 -0
- data/lib/rkelly/token.rb +15 -0
- data/lib/rkelly/tokenizer.rb +122 -0
- data/lib/rkelly/visitable.rb +16 -0
- data/lib/rkelly/visitors.rb +4 -0
- data/lib/rkelly/visitors/dot_visitor.rb +228 -0
- data/lib/rkelly/visitors/ecma_visitor.rb +314 -0
- data/lib/rkelly/visitors/enumerable_visitor.rb +18 -0
- data/lib/rkelly/visitors/evaluation_visitor.rb +419 -0
- data/lib/rkelly/visitors/function_visitor.rb +46 -0
- data/lib/rkelly/visitors/pointcut_visitor.rb +18 -0
- data/lib/rkelly/visitors/sexp_visitor.rb +374 -0
- data/lib/rkelly/visitors/visitor.rb +136 -0
- data/test/ecma_script_test_case.rb +21 -0
- data/test/execute_test_case.rb +16 -0
- data/test/execution_contexts/test_10_1_3-1.rb +32 -0
- data/test/expressions/test_11_3_1.rb +64 -0
- data/test/expressions/test_11_3_2.rb +64 -0
- data/test/expressions/test_11_4_2.rb +13 -0
- data/test/expressions/test_11_4_3.rb +52 -0
- data/test/expressions/test_11_4_4.rb +68 -0
- data/test/expressions/test_11_4_5.rb +69 -0
- data/test/expressions/test_11_4_6.rb +88 -0
- data/test/expressions/test_11_4_8.rb +28 -0
- data/test/expressions/test_11_4_9.rb +103 -0
- data/test/expressions/test_11_5_1.rb +51 -0
- data/test/expressions/test_11_5_2.rb +80 -0
- data/test/expressions/test_11_5_3.rb +88 -0
- data/test/expressions/test_11_6_1-1.rb +19 -0
- data/test/expressions/test_11_9_1.rb +19 -0
- data/test/function/test_15_3_1_1-1.rb +34 -0
- data/test/global_object/test_15_1_1_1.rb +29 -0
- data/test/global_object/test_15_1_1_2.rb +17 -0
- data/test/global_object/test_15_1_1_3.rb +9 -0
- data/test/helper.rb +5 -0
- data/test/node_test_case.rb +11 -0
- data/test/object/test_15_2_1_1.rb +257 -0
- data/test/object/test_15_2_1_2.rb +21 -0
- data/test/object/test_15_2_2_1.rb +52 -0
- data/test/statements/test_12_5-1.rb +27 -0
- data/test/test_add_node.rb +8 -0
- data/test/test_arguments_node.rb +8 -0
- data/test/test_array_node.rb +9 -0
- data/test/test_assign_expr_node.rb +8 -0
- data/test/test_automatic_semicolon_insertion.rb +137 -0
- data/test/test_bit_and_node.rb +8 -0
- data/test/test_bit_or_node.rb +8 -0
- data/test/test_bit_x_or_node.rb +8 -0
- data/test/test_bitwise_not_node.rb +8 -0
- data/test/test_block_node.rb +14 -0
- data/test/test_bracket_accessor_node.rb +16 -0
- data/test/test_break_node.rb +11 -0
- data/test/test_case_block_node.rb +11 -0
- data/test/test_case_clause_node.rb +15 -0
- data/test/test_comma_node.rb +13 -0
- data/test/test_comments.rb +44 -0
- data/test/test_conditional_node.rb +17 -0
- data/test/test_const_statement_node.rb +14 -0
- data/test/test_continue_node.rb +11 -0
- data/test/test_delete_node.rb +8 -0
- data/test/test_divide_node.rb +8 -0
- data/test/test_do_while_node.rb +13 -0
- data/test/test_dot_accessor_node.rb +9 -0
- data/test/test_ecma_visitor.rb +192 -0
- data/test/test_element_node.rb +8 -0
- data/test/test_empty_statement_node.rb +8 -0
- data/test/test_equal_node.rb +8 -0
- data/test/test_evaluation_visitor.rb +66 -0
- data/test/test_expression_statement_node.rb +10 -0
- data/test/test_false_node.rb +8 -0
- data/test/test_for_in_node.rb +17 -0
- data/test/test_for_node.rb +24 -0
- data/test/test_function_body_node.rb +8 -0
- data/test/test_function_call_node.rb +10 -0
- data/test/test_function_decl_node.rb +16 -0
- data/test/test_function_expr_node.rb +16 -0
- data/test/test_function_visitor.rb +26 -0
- data/test/test_getter_property_node.rb +10 -0
- data/test/test_global_object.rb +49 -0
- data/test/test_greater_node.rb +8 -0
- data/test/test_greater_or_equal_node.rb +8 -0
- data/test/test_if_node.rb +17 -0
- data/test/test_in_node.rb +8 -0
- data/test/test_instance_of_node.rb +8 -0
- data/test/test_label_node.rb +13 -0
- data/test/test_left_shift_node.rb +8 -0
- data/test/test_less_node.rb +8 -0
- data/test/test_less_or_equal_node.rb +8 -0
- data/test/test_line_number.rb +23 -0
- data/test/test_logical_and_node.rb +8 -0
- data/test/test_logical_not_node.rb +8 -0
- data/test/test_logical_or_node.rb +8 -0
- data/test/test_modulus_node.rb +8 -0
- data/test/test_multiply_node.rb +8 -0
- data/test/test_new_expr_node.rb +9 -0
- data/test/test_not_equal_node.rb +8 -0
- data/test/test_not_strict_equal_node.rb +8 -0
- data/test/test_null_node.rb +8 -0
- data/test/test_number_node.rb +8 -0
- data/test/test_object_literal_node.rb +9 -0
- data/test/test_op_and_equal_node.rb +10 -0
- data/test/test_op_divide_equal_node.rb +10 -0
- data/test/test_op_equal_node.rb +10 -0
- data/test/test_op_l_shift_equal_node.rb +10 -0
- data/test/test_op_minus_equal_node.rb +10 -0
- data/test/test_op_mod_equal_node.rb +10 -0
- data/test/test_op_multiply_equal_node.rb +10 -0
- data/test/test_op_or_equal_node.rb +10 -0
- data/test/test_op_plus_equal_node.rb +10 -0
- data/test/test_op_r_shift_equal_node.rb +10 -0
- data/test/test_op_u_r_shift_equal_node.rb +10 -0
- data/test/test_op_x_or_equal_node.rb +10 -0
- data/test/test_parameter_node.rb +8 -0
- data/test/test_parser.rb +1355 -0
- data/test/test_pointcut_visitor.rb +34 -0
- data/test/test_postfix_node.rb +8 -0
- data/test/test_prefix_node.rb +8 -0
- data/test/test_property_node.rb +8 -0
- data/test/test_regexp_node.rb +8 -0
- data/test/test_resolve_node.rb +22 -0
- data/test/test_return_node.rb +11 -0
- data/test/test_right_shift_node.rb +8 -0
- data/test/test_runtime.rb +12 -0
- data/test/test_scope_chain.rb +50 -0
- data/test/test_setter_property_node.rb +10 -0
- data/test/test_source_elements.rb +9 -0
- data/test/test_strict_equal_node.rb +8 -0
- data/test/test_string_node.rb +8 -0
- data/test/test_subtract_node.rb +8 -0
- data/test/test_switch_node.rb +12 -0
- data/test/test_this_node.rb +8 -0
- data/test/test_throw_node.rb +7 -0
- data/test/test_tokenizer.rb +143 -0
- data/test/test_true_node.rb +8 -0
- data/test/test_try_node.rb +59 -0
- data/test/test_type_of_node.rb +8 -0
- data/test/test_unary_minus_node.rb +8 -0
- data/test/test_unary_plus_node.rb +8 -0
- data/test/test_unsigned_right_shift_node.rb +8 -0
- data/test/test_var_decl_node.rb +21 -0
- data/test/test_var_statement_node.rb +14 -0
- data/test/test_void_node.rb +8 -0
- data/test/test_while_node.rb +15 -0
- data/test/test_with_node.rb +8 -0
- 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,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 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,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,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
|