/*
* Copyright 2012-2015 Sergey Ignatov
*
* 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 org.intellij.erlang.build;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.roots.ModuleRootModificationUtil;
import com.intellij.openapi.vfs.VirtualFile;
import java.util.Collections;
import static org.junit.Assert.assertNotEquals;
public class ErlangBuildInDifferentModuleTest extends ErlangCompilationTestBase {
private Module myOtherModule;
private CompilationRunner myCompilationRunner;
@Override
protected void setUp() throws Exception {
super.setUp();
myOtherModule = createModuleInOwnDirectoryWithSourceAndTestRoot("other");
ModuleRootModificationUtil.addDependency(myModule, myOtherModule);
myCompilationRunner = new CompilationRunner(myModule, myOtherModule);
}
@Override
protected void tearDown() throws Exception {
try {
myCompilationRunner.tearDown();
}
finally {
super.tearDown();
}
}
public void testBuildWithGlobalParseTransform() throws Exception {
addSourceFile(myModule, "module1.erl", ErlangModuleTextGenerator.module("module1").build());
addSourceFile(myOtherModule, "parse_transform1.erl", ErlangModuleTextGenerator.pt("parse_transform1").build());
addGlobalParseTransform(myModule, Collections.singleton("parse_transform1"));
compileAndAssertOutput();
}
public void testBuildWithParseTransformInDifferentModule() throws Exception {
addSourceFile(myOtherModule, "parse_transform1.erl", ErlangModuleTextGenerator.pt("parse_transform1").build());
addSourceFile(myModule, "module1.erl", ErlangModuleTextGenerator.module("module1").pt("parse_transform1").build());
compileAndAssertOutput();
}
public void testBuildWithBehaviourInDifferentModule() throws Exception {
ErlangModuleTextGenerator.BehaviourBuilder behaviour = ErlangModuleTextGenerator.behaviour("behaviour1").callback("foo", 0);
addSourceFile(myOtherModule, "behaviour1.erl", behaviour.build());
addSourceFile(myModule, "module1.erl", ErlangModuleTextGenerator.module("module1").behaviour(behaviour).build());
compileAndAssertOutput();
}
public void testBuildWithIncludesFormDifferentModule() throws Exception {
VirtualFile includeSourceRoot = addIncludeRoot(myOtherModule, "include");
addFileToDirectory(includeSourceRoot, "header.hrl", "");
addSourceFile(myModule, "module1.erl", ErlangModuleTextGenerator.module("module1").include("../other/include/header.hrl").build());
compileAndAssertOutput();
}
public void testRebuildWithParseTransformInDifferentModule() throws Exception {
VirtualFile parseTransform = addSourceFile(myOtherModule, "parse_transform1.erl", ErlangModuleTextGenerator.pt("parse_transform1").build());
VirtualFile sourceFile = addSourceFile(myModule, "module1.erl", ErlangModuleTextGenerator.module("module1").pt("parse_transform1").build());
doTestCrossModulesDependency(parseTransform, sourceFile);
}
public void testRebuildWithBehaviourInDifferentModule() throws Exception {
ErlangModuleTextGenerator.BehaviourBuilder behaviour = ErlangModuleTextGenerator.behaviour("behaviour1").callback("foo", 0);
VirtualFile behaviourFile = addSourceFile(myOtherModule, "behaviour1.erl", behaviour.build());
VirtualFile sourceFile = addSourceFile(myModule, "module1.erl", ErlangModuleTextGenerator.module("module1").behaviour(behaviour).build());
doTestCrossModulesDependency(behaviourFile, sourceFile);
}
public void testRebuildWithIncludesInDifferentModule() throws Exception {
VirtualFile headerFile = addSourceFile(myModule, "header.hrl", "");
VirtualFile sourceFile = addSourceFile(myModule, "module1.erl", ErlangModuleTextGenerator.module("module1").include("header.hrl").build());
doTestCrossModulesDependency(headerFile, sourceFile);
}
private void compileAndAssertOutput() throws Exception {
myCompilationRunner.compile();
assertSourcesCompiled(myModule, false);
assertSourcesCompiled(myOtherModule, false);
}
private void doTestCrossModulesDependency(VirtualFile dependency,
VirtualFile sourceFile) throws Exception {
myCompilationRunner.compile();
assertSourcesCompiled(myModule, false);
assertSourcesCompiled(myOtherModule, false);
long sourceModificationTime = lastOutputModificationTime(myModule, sourceFile);
myCompilationRunner.touch(dependency);
myCompilationRunner.compile();
assertSourcesCompiled(myModule, false);
assertSourcesCompiled(myOtherModule, false);
assertNotEquals(sourceFile.getPath() + " wasn't rebuilt after change in dependency.",
sourceModificationTime,
lastOutputModificationTime(myModule, sourceFile));
}
}