| /* |
| * 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; |
| |
| import com.google.gwt.core.ext.TreeLogger; |
| import com.google.gwt.core.ext.TreeLogger.Type; |
| import com.google.gwt.core.ext.UnableToCompleteException; |
| import com.google.gwt.dev.cfg.ModuleDef; |
| import com.google.gwt.dev.cfg.ModuleDefLoader; |
| import com.google.gwt.dev.jjs.JJSOptions; |
| import com.google.gwt.dev.util.log.PrintWriterTreeLogger; |
| |
| import junit.framework.TestCase; |
| |
| /** |
| * Test the -strict option to the GWT compiler. |
| */ |
| public class StrictModeTest extends TestCase { |
| /** |
| * Module name for a module with a bad source file. |
| */ |
| private static final String BAD = "com.google.gwt.dev.strict.bad.Bad"; |
| |
| /** |
| * Module name for a module with no bad source files. |
| */ |
| private static final String GOOD = "com.google.gwt.dev.strict.good.Good"; |
| |
| private JJSOptions options = new CompilerOptionsImpl(); |
| |
| protected final CompilerContext.Builder compilerContextBuilder = new CompilerContext.Builder(); |
| |
| private CompilerContext compilerContext = new CompilerContext(); |
| |
| public StrictModeTest() { |
| compilerContext = compilerContextBuilder.minimalRebuildCache(new MinimalRebuildCache()) |
| .build(); |
| } |
| |
| /** |
| * A normal compile with a bad file should still succeed. |
| */ |
| public void testBadCompile() throws UnableToCompleteException { |
| precompile(TreeLogger.NULL, BAD); |
| } |
| |
| /** |
| * A bad compile in strict mode. |
| */ |
| public void testBadCompileStrict() { |
| options.setStrict(true); |
| compilerContext = |
| compilerContextBuilder.options(new PrecompileTaskOptionsImpl(options)).build(); |
| try { |
| precompile(TreeLogger.NULL, BAD); |
| fail("Should have failed"); |
| } catch (UnableToCompleteException expected) { |
| } |
| } |
| |
| /** |
| * A normal compile with a bad file should still succeed. |
| */ |
| public void testBadValidate() { |
| assertTrue(validate(TreeLogger.NULL, BAD)); |
| } |
| |
| /** |
| * A bad compile in strict mode. |
| */ |
| public void testBadValidateStrict() { |
| options.setStrict(true); |
| compilerContext = |
| compilerContextBuilder.options(new PrecompileTaskOptionsImpl(options)).build(); |
| assertFalse(validate(TreeLogger.NULL, BAD)); |
| } |
| |
| /** |
| * Test a plain old successful compile. |
| */ |
| public void testGoodCompile() throws UnableToCompleteException { |
| precompile(getErrorLoggingTreeLogger(), GOOD); |
| } |
| |
| /** |
| * A good compile in strict mode. |
| */ |
| public void testGoodCompileStrict() throws UnableToCompleteException { |
| options.setStrict(true); |
| compilerContext = |
| compilerContextBuilder.options(new PrecompileTaskOptionsImpl(options)).build(); |
| precompile(getErrorLoggingTreeLogger(), GOOD); |
| } |
| |
| /** |
| * Test a plain old successful validate. |
| */ |
| public void testGoodValidate() { |
| assertTrue(validate(getErrorLoggingTreeLogger(), GOOD)); |
| } |
| |
| /** |
| * A good compile in strict mode. |
| */ |
| public void testGoodValidateStrict() { |
| options.setStrict(true); |
| compilerContext = |
| compilerContextBuilder.options(new PrecompileTaskOptionsImpl(options)).build(); |
| assertTrue(validate(getErrorLoggingTreeLogger(), GOOD)); |
| } |
| |
| private void precompile(TreeLogger logger, String moduleName) throws UnableToCompleteException { |
| ModuleDef module = ModuleDefLoader.loadFromClassPath(logger, moduleName); |
| compilerContext = compilerContextBuilder.module(module).build(); |
| if (Precompile.precompile(logger, compilerContext) == null) { |
| throw new UnableToCompleteException(); |
| } |
| } |
| |
| private boolean validate(TreeLogger logger, String moduleName) { |
| ModuleDef module; |
| try { |
| module = ModuleDefLoader.loadFromClassPath(logger, moduleName); |
| compilerContext = compilerContextBuilder.module(module).build(); |
| } catch (UnableToCompleteException e) { |
| fail("Failed to load the module definition"); |
| return false; |
| } |
| return Precompile.validate(logger, compilerContext); |
| } |
| |
| private TreeLogger getErrorLoggingTreeLogger() { |
| PrintWriterTreeLogger logger = new PrintWriterTreeLogger(); |
| logger.setMaxDetail(Type.ERROR); |
| return logger; |
| } |
| } |