/* * Copyright 2015 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.CompilerOptions.LanguageMode; import com.google.javascript.rhino.InputId; import com.google.javascript.rhino.Node; import com.google.javascript.rhino.Token; import junit.framework.TestCase; /** Base class for tests that exercise {@link CodePrinter}. */ public abstract class CodePrinterTestBase extends TestCase { // If this is set, ignore parse warnings and only fail the test // for parse errors. protected boolean allowWarnings = false; protected boolean trustedStrings = true; protected boolean preserveTypeAnnotations = false; protected LanguageMode languageMode = LanguageMode.ECMASCRIPT5; protected Compiler lastCompiler = null; @Override public void setUp() { allowWarnings = false; preserveTypeAnnotations = false; trustedStrings = true; lastCompiler = null; languageMode = LanguageMode.ECMASCRIPT5; } Node parse(String js) { return parse(js, false); } Node parse(String js, boolean checkTypes) { Compiler compiler = new Compiler(); lastCompiler = compiler; CompilerOptions options = new CompilerOptions(); options.setTrustedStrings(trustedStrings); options.preserveTypeAnnotations = preserveTypeAnnotations; // Allow getters and setters. options.setLanguageIn(languageMode); compiler.initOptions(options); Node n = compiler.parseTestCode(js); if (checkTypes) { DefaultPassConfig passConfig = new DefaultPassConfig(null); CompilerPass typeResolver = passConfig.resolveTypes.create(compiler); Node externs = new Node(Token.SCRIPT); externs.setInputId(new InputId("externs")); Node externAndJsRoot = new Node(Token.ROOT, externs, n); typeResolver.process(externs, n); CompilerPass inferTypes = passConfig.inferTypes.create(compiler); inferTypes.process(externs, n); } checkUnexpectedErrorsOrWarnings(compiler, 0); return n; } private void checkUnexpectedErrorsOrWarnings( Compiler compiler, int expected) { int actual = compiler.getErrors().length; if (!allowWarnings) { actual += compiler.getWarnings().length; } if (actual != expected) { String msg = ""; for (JSError err : compiler.getErrors()) { msg += "Error:" + err + "\n"; } if (!allowWarnings) { for (JSError err : compiler.getWarnings()) { msg += "Warning:" + err + "\n"; } } assertEquals("Unexpected warnings or errors.\n " + msg, expected, actual); } } String parsePrint(String js, CompilerOptions options) { return new CodePrinter.Builder(parse(js)).setCompilerOptions(options).build(); } abstract static class CompilerOptionBuilder { abstract void setOptions(CompilerOptions options); } CompilerOptions newCompilerOptions(CompilerOptionBuilder builder) { CompilerOptions options = new CompilerOptions(); options.setTrustedStrings(trustedStrings); options.preserveTypeAnnotations = preserveTypeAnnotations; options.setLanguageOut(languageMode); builder.setOptions(options); return options; } String printNode(Node n) { CompilerOptions options = new CompilerOptions(); options.setLineLengthThreshold(CompilerOptions.DEFAULT_LINE_LENGTH_THRESHOLD); options.setLanguageOut(languageMode); return new CodePrinter.Builder(n).setCompilerOptions(options).build(); } void assertPrintNode(String expectedJs, Node ast) { assertEquals(expectedJs, printNode(ast)); } protected void assertPrint(String js, String expected) { parse(expected); // validate the expected string is valid JS assertEquals(expected, parsePrint(js, newCompilerOptions(new CompilerOptionBuilder() { @Override void setOptions(CompilerOptions options) { options.setPrettyPrint(false); options.setLineLengthThreshold(CompilerOptions.DEFAULT_LINE_LENGTH_THRESHOLD); } }))); } protected void assertPrintSame(String js) { assertPrint(js, js); } }