cleanup: remove useless '@author nik' from javadoc comments
[idea/community.git] / java / compiler / tests / com / intellij / compiler / ModuleCompileScopeTest.java
1 package com.intellij.compiler;
2
3 import com.intellij.openapi.module.Module;
4 import com.intellij.openapi.roots.DependencyScope;
5 import com.intellij.openapi.roots.ModuleRootModificationUtil;
6 import com.intellij.openapi.vfs.LocalFileSystem;
7 import com.intellij.openapi.vfs.VirtualFile;
8 import com.intellij.testFramework.PsiTestUtil;
9
10 import java.io.File;
11
12 import static com.intellij.util.io.TestFileSystemBuilder.fs;
13
14 public class ModuleCompileScopeTest extends BaseCompilerTestCase {
15
16   public void testCompileFile() {
17     VirtualFile a = createFile("src/A.java", "class A{}");
18     createFile("src/B.java", "class B{}");
19     Module module = addModule("a", a.getParent());
20     compile(true, a);
21     assertOutput(module, fs().file("A.class"));
22     make(module);
23     assertOutput(module, fs().file("A.class").file("B.class"));
24     assertModulesUpToDate();
25   }
26
27   public void testForceCompileUpToDateFile() {
28     VirtualFile a = createFile("src/A.java", "class A{}");
29     Module module = addModule("a", a.getParent());
30     make(module);
31     assertOutput(module, fs().file("A.class"));
32     final VirtualFile output = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(getOutputDir(module));
33     assertNotNull(output);
34     final VirtualFile classFile = output.findChild("A.class");
35     assertNotNull(classFile);
36     deleteFile(classFile);
37     make(module);
38     assertOutput(module, fs());
39     compile(true, a);
40     assertOutput(module, fs().file("A.class"));
41     assertModulesUpToDate();
42   }
43
44   public void testForceCompileUpToDateFileAndDoNotCompileResources() {
45     VirtualFile a = createFile("src/A.java", "class A{}");
46     createFile("src/res.properties", "aaa=bbb");
47     Module module = addModule("a", a.getParent());
48     make(module);
49     assertOutput(module, fs().file("A.class").file("res.properties"));
50     final VirtualFile output = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(getOutputDir(module));
51     assertNotNull(output);
52     final VirtualFile classFile = output.findChild("A.class");
53     assertNotNull(classFile);
54     final VirtualFile resOutputFile = output.findChild("res.properties");
55     assertNotNull(resOutputFile);
56     final File resourceOutputIoFile = new File(resOutputFile.getPath());
57     final long resStampBefore = resourceOutputIoFile.lastModified();
58     deleteFile(classFile);
59     make(module);
60     assertOutput(module, fs().file("res.properties"));
61     compile(true, a);
62     assertOutput(module, fs().file("A.class").file("res.properties"));
63     final long resStampAfter = resourceOutputIoFile.lastModified();
64     assertEquals(resStampBefore, resStampAfter);
65     assertModulesUpToDate();
66   }
67
68   public void testForceCompileUpToDateFileAndDoNotCompileDependentTestClass() {
69     VirtualFile a = createFile("src/A.java", "class A{ public static void foo(int param) {} }");
70     final String bText = "class B { void bar() {A.foo(10);}}";
71     VirtualFile b = createFile("testSrc/B.java", bText);
72     Module module = addModule("a", a.getParent(), b.getParent());
73     make(module);
74     assertOutput(module, fs().file("A.class"), false);
75     assertOutput(module, fs().file("B.class"), true);
76     final VirtualFile output = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(getOutputDir(module, false));
77     assertNotNull(output);
78     final VirtualFile testOutput = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(getOutputDir(module, true));
79     assertNotNull(testOutput);
80     final VirtualFile classFile = output.findChild("A.class");
81     assertNotNull(classFile);
82     final VirtualFile testClassFile = testOutput.findChild("B.class");
83     assertNotNull(testClassFile);
84     deleteFile(classFile);
85     deleteFile(testClassFile);
86     make(module);
87     assertOutput(module, fs());
88     changeFile(b, bText + "  "); // touch b
89     
90     compile(true, a);
91     assertOutput(module, fs().file("A.class"), false);
92     assertOutput(module, fs(), true);  // make sure B is not compiled, even if it is modified
93   }
94
95   public void testMakeTwoModules() {
96     VirtualFile file1 = createFile("m1/src/A.java", "class A{}");
97     Module m1 = addModule("m1", file1.getParent());
98     VirtualFile file2 = createFile("m2/src/B.java", "class B{}");
99     Module m2 = addModule("m2", file2.getParent());
100     make(m1);
101     assertOutput(m1, fs().file("A.class"));
102     assertNoOutput(m2);
103     make(m2);
104     assertOutput(m2, fs().file("B.class"));
105     assertModulesUpToDate();
106   }
107
108   public void testMakeDependentModules() {
109     VirtualFile file1 = createFile("main/src/A.java", "class A{}");
110     Module main = addModule("main", file1.getParent());
111     VirtualFile file2 = createFile("dep/src/B.java", "class B{}");
112     Module dep = addModule("dep", file2.getParent());
113     ModuleRootModificationUtil.addDependency(main, dep);
114     makeWithDependencies(false, main);
115     assertOutput(main, fs().file("A.class"));
116     assertOutput(dep, fs().file("B.class"));
117   }
118
119   public void testDoNotIncludeRuntimeDependenciesToCompileScope() {
120     VirtualFile file1 = createFile("main/src/A.java", "class A{}");
121     Module main = addModule("main", file1.getParent());
122     VirtualFile file2 = createFile("dep/src/B.java", "class B{}");
123     Module dep = addModule("dep", file2.getParent());
124     ModuleRootModificationUtil.addDependency(main, dep, DependencyScope.RUNTIME, false);
125     makeWithDependencies(false, main);
126     assertOutput(main, fs().file("A.class"));
127     assertNoOutput(dep);
128     make(dep);
129     assertOutput(dep, fs().file("B.class"));
130     assertModulesUpToDate();
131   }
132
133   public void testIncludeRuntimeDependenciesToCompileScope() {
134     VirtualFile file1 = createFile("main/src/A.java", "class A{}");
135     Module main = addModule("main", file1.getParent());
136     VirtualFile file2 = createFile("dep/src/B.java", "class B{}");
137     Module dep = addModule("dep", file2.getParent());
138     ModuleRootModificationUtil.addDependency(main, dep, DependencyScope.RUNTIME, false);
139     makeWithDependencies(true, main);
140     assertOutput(main, fs().file("A.class"));
141     assertOutput(dep, fs().file("B.class"));
142     assertModulesUpToDate();
143   }
144
145   public void testExcludedFile() {
146     VirtualFile a = createFile("src/a/A.java", "package a; class A{}");
147     createFile("src/b/B.java", "package b; class B{}");
148     Module m = addModule("m", a.getParent().getParent());
149     PsiTestUtil.addExcludedRoot(m, a.getParent());
150     make(m);
151     assertOutput(m, fs().dir("b").file("B.class"));
152
153     changeFile(a);
154     make(m);
155     assertOutput(m, fs().dir("b").file("B.class"));
156
157     rebuild();
158     assertOutput(m, fs().dir("b").file("B.class"));
159   }
160
161   public void testFileUnderIgnoredFolder() {
162     VirtualFile src = createFile("src/A.java", "class A{}").getParent();
163     Module m = addModule("m", src);
164     make(m);
165     assertOutput(m, fs().file("A.class"));
166
167     VirtualFile b = createFile("src/CVS/B.java", "package CVS; class B{}");
168     make(m);
169     assertOutput(m, fs().file("A.class"));
170
171     changeFile(b);
172     make(m);
173     assertOutput(m, fs().file("A.class"));
174
175     rebuild();
176     assertOutput(m, fs().file("A.class"));
177   }
178 }