jbarnette / johnson
- Source
- Commits
- Network (18)
- Issues (5)
- Downloads (3)
- Wiki (3)
- Graphs
-
Tree:
1df39ce
commit 1df39ce9780f1b24dfd49716c99abe909781be46
tree 3ebf7cec40693a5084236a1490b3b866c3074fd1
parent 46d4f089f34a90a0a4e2305de7a57e2cf903dd4f
tree 3ebf7cec40693a5084236a1490b3b866c3074fd1
parent 46d4f089f34a90a0a4e2305de7a57e2cf903dd4f
| 3dcae06a » | aaronp | 2008-03-19 | 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 | 19 | def test_exception_raised | |
| 9bddb88c » | tenderlove | 2008-04-18 | 20 | assert_raises(Johnson::Parser::SyntaxError) { | |
| ef6341c7 » | tenderlove | 2008-04-18 | 21 | @parser.parse('if(') | |
| 22 | } | ||||
| 23 | end | ||||
| 24 | |||||
| b912748e » | tenderlove | 2008-04-22 | 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 | 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 | 60 | assert_ecma('var foo;', @parser.parse('var foo;')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 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 | 75 | assert_ecma('bar()[1];', @parser.parse('bar()[1]')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 76 | end | |
| 77 | |||||
| 78 | def test_postfix_inc | ||||
| 79 | assert_sexp([[:postfix_inc, [:name, "x"]]], | ||||
| 80 | @parser.parse('x++;')) | ||||
| c85ae0fe » | aaronp | 2008-04-02 | 81 | assert_ecma('x++;', @parser.parse('x++;')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 82 | assert_sexp([[:postfix_inc, [:dot_accessor, [:name, "x"], [:name, "foo"]]]], | |
| 83 | @parser.parse('foo.x++;')) | ||||
| c85ae0fe » | aaronp | 2008-04-02 | 84 | assert_ecma('foo.x++;', @parser.parse('foo.x++;')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 85 | assert_sexp([[:postfix_inc, [:bracket_access, [:name, "x"], [:lit, 1]]]], | |
| 86 | @parser.parse('x[1]++;')) | ||||
| c85ae0fe » | aaronp | 2008-04-02 | 87 | assert_ecma('x[1]++;', @parser.parse('x[1]++;')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 88 | end | |
| 89 | |||||
| 90 | def test_prefix_inc | ||||
| 91 | assert_sexp([[:prefix_inc, [:name, "x"]]], | ||||
| 92 | @parser.parse('++x;')) | ||||
| c85ae0fe » | aaronp | 2008-04-02 | 93 | assert_ecma('++x;', @parser.parse('++x;')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 94 | assert_sexp([[:prefix_inc, [:dot_accessor, [:name, "x"], [:name, "foo"]]]], | |
| 95 | @parser.parse('++foo.x;')) | ||||
| c85ae0fe » | aaronp | 2008-04-02 | 96 | assert_ecma('++foo.x;', @parser.parse('++foo.x;')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 97 | assert_sexp([[:prefix_inc, [:bracket_access, [:name, "x"], [:lit, 1]]]], | |
| 98 | @parser.parse('++x[1];')) | ||||
| c85ae0fe » | aaronp | 2008-04-02 | 99 | assert_ecma('++x[1];', @parser.parse('++x[1];')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 100 | end | |
| 101 | |||||
| 102 | def test_postfix_dec | ||||
| 103 | assert_sexp([[:postfix_dec, [:name, "x"]]], | ||||
| 104 | @parser.parse('x--;')) | ||||
| c85ae0fe » | aaronp | 2008-04-02 | 105 | assert_ecma('x--;', @parser.parse('x--;')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 106 | assert_sexp([[:postfix_dec, [:dot_accessor, [:name, "x"], [:name, "foo"]]]], | |
| 107 | @parser.parse('foo.x--;')) | ||||
| c85ae0fe » | aaronp | 2008-04-02 | 108 | assert_ecma('foo.x--;', @parser.parse('foo.x--;')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 109 | assert_sexp([[:postfix_dec, [:bracket_access, [:name, "x"], [:lit, 1]]]], | |
| 110 | @parser.parse('x[1]--;')) | ||||
| c85ae0fe » | aaronp | 2008-04-02 | 111 | assert_ecma('x[1]--;', @parser.parse('x[1]--;')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 112 | end | |
| 113 | |||||
| 114 | def test_prefix_dec | ||||
| 115 | assert_sexp([[:prefix_dec, [:name, "x"]]], | ||||
| 116 | @parser.parse('--x;')) | ||||
| c85ae0fe » | aaronp | 2008-04-02 | 117 | assert_ecma('--x;', @parser.parse('--x;')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 118 | assert_sexp([[:prefix_dec, [:dot_accessor, [:name, "x"], [:name, "foo"]]]], | |
| 119 | @parser.parse('--foo.x;')) | ||||
| c85ae0fe » | aaronp | 2008-04-02 | 120 | assert_ecma('--foo.x;', @parser.parse('--foo.x;')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 121 | assert_sexp([[:prefix_dec, [:bracket_access, [:name, "x"], [:lit, 1]]]], | |
| 122 | @parser.parse('--x[1];')) | ||||
| c85ae0fe » | aaronp | 2008-04-02 | 123 | assert_ecma('--x[1];', @parser.parse('--x[1];')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 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 | 132 | assert_ecma('i = 10, j = 11;', @parser.parse('i = 10, j = 11')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 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 | 141 | assert_ecma('var a = (10);', @parser.parse('var a = (10);')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 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 | 157 | assert_ecma('var foo = 10, bar = 1;', | |
| 158 | @parser.parse('var foo = 10, bar = 1')) | ||||
| 3dcae06a » | aaronp | 2008-03-19 | 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 | 171 | assert_ecma('var foo = "hello world";', | |
| 172 | @parser.parse('var foo = "hello world"')) | ||||
| 3dcae06a » | aaronp | 2008-03-19 | 173 | end | |
| 174 | |||||
| e21b725a » | aaronp | 2008-04-02 | 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 | 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 | 197 | assert_ecma('var foo = null;', @parser.parse('var foo = null')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 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 | 210 | assert_ecma('var foo = true;', @parser.parse('var foo = true')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 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 | 223 | assert_ecma('var foo = false;', @parser.parse('var foo = false')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 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 | 236 | assert_ecma('var foo = this;', @parser.parse('var foo = this')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 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 | 249 | assert_ecma('var foo = /abc/;', @parser.parse('var foo = /abc/')) | |
| 3dcae06a » | aaronp | 2008-03-19 | 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 | 265 | assert_ecma('var foo = 10, bar = 1.1;', | |
| 266 | @parser.parse('var foo = 10, bar = 1.1')) | ||||
| 3dcae06a » | aaronp | 2008-03-19 | 267 | end | |
| 268 | |||||
| 269 | def assert_sexp(expected, node) | ||||
| 270 | assert_equal(expected, node.to_sexp) | ||||
| 271 | end | ||||
| c85ae0fe » | aaronp | 2008-04-02 | 272 | ||
| 273 | def assert_ecma(expected, node) | ||||
| 274 | assert_equal(expected, node.to_ecma) | ||||
| 275 | end | ||||
| 3dcae06a » | aaronp | 2008-03-19 | 276 | end | |
