/* * Copyright 2011 The Closure Compiler Authors. * * 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.javascript.jscomp; import com.google.javascript.jscomp.AstValidator.ViolationHandler; import com.google.javascript.rhino.InputId; import com.google.javascript.rhino.Node; import com.google.javascript.rhino.Token; import com.google.javascript.rhino.jstype.SimpleSourceFile; /** * @author johnlenz@google.com (John Lenz) */ public class AstValidatorTest extends CompilerTestCase { private boolean lastCheckWasValid = true; @Override protected CompilerPass getProcessor(Compiler compiler) { return createValidator(); } private AstValidator createValidator() { lastCheckWasValid = true; return new AstValidator(new ViolationHandler() { @Override public void handleViolation(String message, Node n) { lastCheckWasValid = false; } }); } @Override protected int getNumRepetitions() { return 1; } @Override protected void setUp() throws Exception { super.enableAstValidation(false); super.disableNormalize(); super.enableLineNumberCheck(false); super.setUp(); } public void testForIn() { valid("for(var a in b);"); valid("for(var a = 1 in b);"); valid("for(a in b);"); valid("for(a in []);"); valid("for(a in {});"); } public void testDebugger() { valid("debugger;"); } public void testValidScript() { Node n = new Node(Token.SCRIPT); expectInvalid(n, Check.SCRIPT); n.setInputId(new InputId("something_input")); n.setStaticSourceFile(new SimpleSourceFile("something", false)); expectValid(n, Check.SCRIPT); expectInvalid(n, Check.STATEMENT); expectInvalid(n, Check.EXPRESSION); } public void testValidStatement1() { Node n = new Node(Token.RETURN); expectInvalid(n, Check.EXPRESSION); expectValid(n, Check.STATEMENT); expectInvalid(n, Check.SCRIPT); } public void testValidExpression1() { Node n = new Node(Token.ARRAYLIT, new Node(Token.EMPTY)); expectValid(n, Check.EXPRESSION); expectInvalid(n, Check.STATEMENT); expectInvalid(n, Check.SCRIPT); } public void testValidExpression2() { Node n = new Node(Token.NOT, new Node(Token.TRUE)); expectValid(n, Check.EXPRESSION); expectInvalid(n, Check.STATEMENT); expectInvalid(n, Check.SCRIPT); } public void testInvalidEmptyStatement() { Node n = new Node(Token.EMPTY, new Node(Token.TRUE)); expectInvalid(n, Check.STATEMENT); n.detachChildren(); expectValid(n, Check.STATEMENT); } private void valid(String code) { testSame(code); assertTrue(lastCheckWasValid); } private enum Check { SCRIPT, STATEMENT, EXPRESSION } private boolean doCheck(Node n, Check level) { AstValidator validator = createValidator(); switch (level) { case SCRIPT: validator.validateScript(n); break; case STATEMENT: validator.validateStatement(n); break; case EXPRESSION: validator.validateExpression(n); break; } return lastCheckWasValid; } private void expectInvalid(Node n, Check level) { assertFalse(doCheck(n, level)); } private void expectValid(Node n, Check level) { assertTrue(doCheck(n, level)); } }