| /* |
| * Copyright 2010 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.gwt.dev.js; |
| |
| import com.google.gwt.dev.jjs.SourceInfo; |
| import com.google.gwt.dev.js.ast.JsBlock; |
| import com.google.gwt.dev.js.ast.JsProgram; |
| |
| import junit.framework.TestCase; |
| |
| import java.io.IOException; |
| import java.io.StringReader; |
| |
| /** |
| * Tests {@link JsParser}. |
| */ |
| public class JsParserTest extends TestCase { |
| |
| public class Result { |
| |
| private String source; |
| private JsParserException exception; |
| |
| public Result(JsBlock jsBlock) { |
| this.source = jsBlock.toSource().replaceAll("\\s+", " "); |
| } |
| |
| public Result(JsParserException e) { |
| this.exception = e; |
| } |
| |
| public void into(String expected) throws JsParserException { |
| if (exception != null) { |
| throw exception; |
| } |
| assertEquals(expected, source); |
| } |
| |
| public void error(String expectedMsg) { |
| assertNotNull("No JsParserException was thrown", exception); |
| assertEquals(expectedMsg, exception.getMessage()); |
| } |
| } |
| |
| public void testBasic() throws JsParserException { |
| parse("foo").into("foo; "); |
| parse(" foo ").into("foo; "); |
| parse("foo()").into("foo(); "); |
| parse("foo(); bar()").into("foo(); bar(); "); |
| parse("window.alert('3' + 3)").into("window.alert('3' + 3); "); |
| parse("{ foo() }").into("{ foo(); } "); |
| } |
| |
| public void testParseErrors() { |
| parse("1a2b").error( |
| "test.js(1): missing ; before statement\n> 1a2b\n> ----^"); |
| parse("foo(").error("test.js(1): syntax error\n> \n> ^"); |
| parse("+").error("test.js(1): syntax error\n> \n> ^"); |
| parse(")").error("test.js(1): syntax error\n> )\n> -^"); |
| parse("}").error("test.js(1): syntax error\n> }\n> -^"); |
| parse("foo();\n}").error("test.js(2): syntax error\n> }\n> -^"); |
| parse("foo();\nbar;\n}").error("test.js(3): syntax error\n> }\n> -^"); |
| } |
| |
| private Result parse(String js) { |
| try { |
| JsProgram program = new JsProgram(); |
| SourceInfo rootSourceInfo = program.createSourceInfo(1, "test.js"); |
| JsBlock block = program.getGlobalBlock(); |
| JsParser.parseInto(rootSourceInfo, program.getScope(), block, |
| new StringReader(js)); |
| return new Result(block); |
| } catch (IOException e) { |
| throw new RuntimeException("Unexpected error reading in-memory stream", e); |
| } catch (JsParserException e) { |
| return new Result(e); |
| } |
| } |
| } |