jbarnette / johnson

Johnson wraps JavaScript in a loving Ruby embrace.

This URL has Read+Write access

matthewd (author)
Sat Oct 03 20:47:56 -0700 2009
commit  1df39ce9780f1b24dfd49716c99abe909781be46
tree    3ebf7cec40693a5084236a1490b3b866c3074fd1
parent  46d4f089f34a90a0a4e2305de7a57e2cf903dd4f
johnson / test / parser_test.rb
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 1 require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
2
3 require 'stringio'
4 class ParserTest < Test::Unit::TestCase
5 include Johnson::Nodes
6 def setup
7 @parser = Johnson::Parser
8 end
9
10 def test_parser_init
11 assert @parser
12 tree = @parser.parse(StringIO.new(""))
13 assert_kind_of SourceElements, tree
14 assert_equal 0, tree.line
15 assert_equal 0, tree.column
16 assert_sexp([], tree)
17 end
18
ef6341c7 » tenderlove 2008-04-18 Adding a parser error and m... 19 def test_exception_raised
9bddb88c » tenderlove 2008-04-18 I like syntax error better 20 assert_raises(Johnson::Parser::SyntaxError) {
ef6341c7 » tenderlove 2008-04-18 Adding a parser error and m... 21 @parser.parse('if(')
22 }
23 end
24
b912748e » tenderlove 2008-04-22 populating file name and li... 25 def test_exception_has_info
26 begin
27 @parser.parse('if(')
28 rescue Johnson::Parser::SyntaxError => ex
29 assert_equal(1, ex.line_number)
30 assert_equal('', ex.file_name)
31 assert_equal('syntax error', ex.message)
32 end
33 end
34
35 def test_exception_has_filename
36 begin
37 @parser.parse('if(', 'test.js')
38 rescue Johnson::Parser::SyntaxError => ex
39 assert_equal(1, ex.line_number)
40 assert_equal('test.js', ex.file_name)
41 assert_equal('syntax error', ex.message)
42 end
43 end
44
45 def test_exception_has_linenum
46 begin
47 @parser.parse('if(', 'test.js', 10)
48 rescue Johnson::Parser::SyntaxError => ex
49 assert_equal(10, ex.line_number)
50 assert_equal('test.js', ex.file_name)
51 assert_equal('syntax error', ex.message)
52 end
53 end
54
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 55 def test_variable_declaration_no_init
56 assert_sexp(
57 [[:var, [[:name, 'foo']]]],
58 @parser.parse('var foo;')
59 )
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 60 assert_ecma('var foo;', @parser.parse('var foo;'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 61 end
62
63 def test_new_foo
64 assert_sexp([[:var, [[:assign, [:name, "a"], [:new, [[:name, "foo"]]]]]]],
65 @parser.parse('var a = new foo;'))
66 assert_sexp([[:new, [[:name, "foo"]]]],
67 @parser.parse('new foo;'))
68 end
69
70 def test_function_call
71 assert_sexp([[:bracket_access,
72 [:function_call, [[:name, "bar"]]],
73 [:lit, 1]]],
74 @parser.parse('bar()[1];'))
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 75 assert_ecma('bar()[1];', @parser.parse('bar()[1]'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 76 end
77
78 def test_postfix_inc
79 assert_sexp([[:postfix_inc, [:name, "x"]]],
80 @parser.parse('x++;'))
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 81 assert_ecma('x++;', @parser.parse('x++;'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 82 assert_sexp([[:postfix_inc, [:dot_accessor, [:name, "x"], [:name, "foo"]]]],
83 @parser.parse('foo.x++;'))
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 84 assert_ecma('foo.x++;', @parser.parse('foo.x++;'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 85 assert_sexp([[:postfix_inc, [:bracket_access, [:name, "x"], [:lit, 1]]]],
86 @parser.parse('x[1]++;'))
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 87 assert_ecma('x[1]++;', @parser.parse('x[1]++;'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 88 end
89
90 def test_prefix_inc
91 assert_sexp([[:prefix_inc, [:name, "x"]]],
92 @parser.parse('++x;'))
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 93 assert_ecma('++x;', @parser.parse('++x;'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 94 assert_sexp([[:prefix_inc, [:dot_accessor, [:name, "x"], [:name, "foo"]]]],
95 @parser.parse('++foo.x;'))
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 96 assert_ecma('++foo.x;', @parser.parse('++foo.x;'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 97 assert_sexp([[:prefix_inc, [:bracket_access, [:name, "x"], [:lit, 1]]]],
98 @parser.parse('++x[1];'))
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 99 assert_ecma('++x[1];', @parser.parse('++x[1];'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 100 end
101
102 def test_postfix_dec
103 assert_sexp([[:postfix_dec, [:name, "x"]]],
104 @parser.parse('x--;'))
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 105 assert_ecma('x--;', @parser.parse('x--;'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 106 assert_sexp([[:postfix_dec, [:dot_accessor, [:name, "x"], [:name, "foo"]]]],
107 @parser.parse('foo.x--;'))
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 108 assert_ecma('foo.x--;', @parser.parse('foo.x--;'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 109 assert_sexp([[:postfix_dec, [:bracket_access, [:name, "x"], [:lit, 1]]]],
110 @parser.parse('x[1]--;'))
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 111 assert_ecma('x[1]--;', @parser.parse('x[1]--;'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 112 end
113
114 def test_prefix_dec
115 assert_sexp([[:prefix_dec, [:name, "x"]]],
116 @parser.parse('--x;'))
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 117 assert_ecma('--x;', @parser.parse('--x;'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 118 assert_sexp([[:prefix_dec, [:dot_accessor, [:name, "x"], [:name, "foo"]]]],
119 @parser.parse('--foo.x;'))
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 120 assert_ecma('--foo.x;', @parser.parse('--foo.x;'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 121 assert_sexp([[:prefix_dec, [:bracket_access, [:name, "x"], [:lit, 1]]]],
122 @parser.parse('--x[1];'))
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 123 assert_ecma('--x[1];', @parser.parse('--x[1];'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 124 end
125
126 def test_expr_comma
127 assert_sexp([[:comma,
128 [[:op_equal, [:name, 'i'], [:lit, 10]],
129 [:op_equal, [:name, 'j'], [:lit, 11]]]]],
130 @parser.parse('i = 10, j = 11;')
131 )
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 132 assert_ecma('i = 10, j = 11;', @parser.parse('i = 10, j = 11'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 133 end
134
135 def test_primary_expr_paren
136 assert_sexp(
137 [[:var,
138 [[:assign, [:name, "a"], [:paren, [:lit, 10]]]]
139 ]],
140 @parser.parse('var a = (10);'))
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 141 assert_ecma('var a = (10);', @parser.parse('var a = (10);'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 142 end
143
144 def test_parser_var_ints
145 assert @parser
146 tree = @parser.parse(StringIO.new("var foo = 10, bar = 1;"))
147 assert_kind_of SourceElements, tree
148 assert_kind_of VarStatement, tree.value.first
149 assert_sexp(
150 [[:var,
151 [
152 [:assign, [:name, "foo"], [:lit, 10]],
153 [:assign, [:name, "bar"], [:lit, 1]],
154 ]]],
155 tree
156 )
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 157 assert_ecma('var foo = 10, bar = 1;',
158 @parser.parse('var foo = 10, bar = 1'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 159 end
160
161 def test_parser_var_string_lit
162 assert @parser
163 tree = @parser.parse(StringIO.new("var foo = 'hello world';"))
164 assert_sexp(
165 [[:var,
166 [
167 [:assign, [:name, "foo"], [:str, 'hello world']],
168 ]]],
169 tree
170 )
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 171 assert_ecma('var foo = "hello world";',
172 @parser.parse('var foo = "hello world"'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 173 end
174
e21b725a » aaronp 2008-04-02 adding semicolons to lines 175 def test_accessor_as_square_brace
176 assert_ecma("foo['hello-world'];",
177 @parser.parse("foo['hello-world']"))
178 end
179
180 def test_paren_around_function
181 assert_ecma("(function() { }).foo();",
182 @parser.parse('(function() { }).foo()'))
183 assert_ecma("(function() { })();",
184 @parser.parse('(function() { })()'))
185 end
186
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 187 def test_parser_var_nil_lit
188 assert @parser
189 tree = @parser.parse(StringIO.new("var foo = null;"))
190 assert_sexp(
191 [[:var,
192 [
193 [:assign, [:name, "foo"], [:nil]],
194 ]]],
195 tree
196 )
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 197 assert_ecma('var foo = null;', @parser.parse('var foo = null'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 198 end
199
200 def test_parser_var_true_lit
201 assert @parser
202 tree = @parser.parse(StringIO.new("var foo = true;"))
203 assert_sexp(
204 [[:var,
205 [
206 [:assign, [:name, "foo"], [:true]],
207 ]]],
208 tree
209 )
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 210 assert_ecma('var foo = true;', @parser.parse('var foo = true'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 211 end
212
213 def test_parser_var_false_lit
214 assert @parser
215 tree = @parser.parse(StringIO.new("var foo = false;"))
216 assert_sexp(
217 [[:var,
218 [
219 [:assign, [:name, "foo"], [:false]],
220 ]]],
221 tree
222 )
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 223 assert_ecma('var foo = false;', @parser.parse('var foo = false'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 224 end
225
226 def test_parser_var_this_lit
227 assert @parser
228 tree = @parser.parse(StringIO.new("var foo = this;"))
229 assert_sexp(
230 [[:var,
231 [
232 [:assign, [:name, "foo"], [:this]],
233 ]]],
234 tree
235 )
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 236 assert_ecma('var foo = this;', @parser.parse('var foo = this'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 237 end
238
239 def test_parser_var_regex_lit
240 assert @parser
241 tree = @parser.parse(StringIO.new("var foo = /abc/;"))
242 assert_sexp(
243 [[:var,
244 [
245 [:assign, [:name, "foo"], [:lit, "/abc/"]],
246 ]]],
247 tree
248 )
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 249 assert_ecma('var foo = /abc/;', @parser.parse('var foo = /abc/'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 250 end
251
252 def test_parser_var_float
253 assert @parser
254 tree = @parser.parse(StringIO.new("var foo = 10, bar = 1.1;"))
255 assert_kind_of SourceElements, tree
256 assert_kind_of VarStatement, tree.value.first
257 assert_sexp(
258 [[:var,
259 [
260 [:assign, [:name, "foo"], [:lit, 10]],
261 [:assign, [:name, "bar"], [:lit, 1.1]],
262 ]]],
263 tree
264 )
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 265 assert_ecma('var foo = 10, bar = 1.1;',
266 @parser.parse('var foo = 10, bar = 1.1'))
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 267 end
268
269 def assert_sexp(expected, node)
270 assert_equal(expected, node.to_sexp)
271 end
c85ae0fe » aaronp 2008-04-02 adding more tests and prefi... 272
273 def assert_ecma(expected, node)
274 assert_equal(expected, node.to_ecma)
275 end
3dcae06a » aaronp 2008-03-19 adding nodes and visitors 276 end