Refactor CompileKotlinAgainstBinariesCustomTest

Extract common logic, add NotNull annotations
This commit is contained in:
Alexander Udalov
2013-10-09 19:29:01 +04:00
parent f8201c6aa9
commit 9e8a8e852c
2 changed files with 46 additions and 56 deletions
@@ -16,27 +16,23 @@
package org.jetbrains.jet.jvm.compiler; package org.jetbrains.jet.jvm.compiler;
import com.google.common.base.Predicates;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtil;
import com.intellij.psi.PsiFile;
import com.intellij.util.ArrayUtil; import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.ConfigurationKind; import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.TestJdkKind; import org.jetbrains.jet.TestJdkKind;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.config.CompilerConfiguration; import org.jetbrains.jet.config.CompilerConfiguration;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter; import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.test.TestCaseWithTmpdir; import org.jetbrains.jet.test.TestCaseWithTmpdir;
import org.jetbrains.jet.test.util.DescriptorValidator; import org.jetbrains.jet.test.util.DescriptorValidator;
import org.jetbrains.jet.test.util.NamespaceComparator; import org.jetbrains.jet.test.util.NamespaceComparator;
import org.junit.Assert;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@@ -48,40 +44,35 @@ import java.util.regex.Pattern;
import static org.jetbrains.jet.test.util.NamespaceComparator.validateAndCompareNamespaceWithFile; import static org.jetbrains.jet.test.util.NamespaceComparator.validateAndCompareNamespaceWithFile;
public abstract class AbstractCompileKotlinAgainstCustomBinariesTest extends TestCaseWithTmpdir { public abstract class AbstractCompileKotlinAgainstCustomBinariesTest extends TestCaseWithTmpdir {
protected void doTest(String ktFilePath) throws Exception { protected void doTest(@NotNull String ktFilePath) throws Exception {
Assert.assertTrue(ktFilePath.endsWith(".kt")); assertTrue(ktFilePath.endsWith(".kt"));
File ktFile = new File(ktFilePath); File ktFile = new File(ktFilePath);
String testFileWithoutExtension = FileUtil.getNameWithoutExtension(ktFile);
checkNamespace(ktFile, LoadDescriptorUtil.TEST_PACKAGE_FQNAME, NamespaceDescriptor namespace = analyzeFileToNamespace(ktFile);
new File(ktFile.getParentFile(), testFileWithoutExtension + ".txt"));
NamespaceComparator.Configuration comparator = NamespaceComparator.DONT_INCLUDE_METHODS_OF_OBJECT.withValidationStrategy(
DescriptorValidator.ValidationVisitor.ALLOW_ERROR_TYPES);
File txtFile = new File(ktFile.getParentFile(), FileUtil.getNameWithoutExtension(ktFile) + ".txt");
validateAndCompareNamespaceWithFile(namespace, comparator, txtFile);
} }
private void checkNamespace(File ktFile, FqName namespaceFqn, File expectedFile) throws IOException { @NotNull
BindingContext bindingContext = analyzeFile(ktFile); protected NamespaceDescriptor analyzeFileToNamespace(@NotNull File ktFile) throws IOException {
Project project = getEnvironment(ktFile.getParentFile()).getProject();
NamespaceDescriptor namespaceDescriptor = bindingContext.get(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, namespaceFqn); BindingContext bindingContext = AnalyzerFacadeForJVM.analyzeOneFileWithJavaIntegration(
assertNotNull("Failed to find namespace: " + namespaceFqn, namespaceDescriptor); JetTestUtils.loadJetFile(project, ktFile),
Collections.<AnalyzerScriptParameter>emptyList()
).getBindingContext();
validateAndCompareNamespaceWithFile(namespaceDescriptor, NamespaceComparator.DONT_INCLUDE_METHODS_OF_OBJECT.withValidationStrategy( NamespaceDescriptor namespaceDescriptor = bindingContext.get(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR,
DescriptorValidator.ValidationVisitor.ALLOW_ERROR_TYPES), expectedFile); LoadDescriptorUtil.TEST_PACKAGE_FQNAME);
assertNotNull("Failed to find namespace: " + LoadDescriptorUtil.TEST_PACKAGE_FQNAME, namespaceDescriptor);
return namespaceDescriptor;
} }
protected BindingContext analyzeFile(File ktFile) throws IOException { @NotNull
JetCoreEnvironment environment = getEnvironment(ktFile); private JetCoreEnvironment getEnvironment(@NotNull File dir) {
Project project = environment.getProject();
List<JetFile> jetFiles = Collections.singletonList(JetTestUtils.loadJetFile(project, ktFile));
return AnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(
project, jetFiles, Collections.<AnalyzerScriptParameter>emptyList(),
Predicates.<PsiFile>alwaysTrue()).getBindingContext();
}
private JetCoreEnvironment getEnvironment(File ktFile) {
File dir = ktFile.getParentFile();
List<File> jarFiles = FileUtil.findFilesByMask(Pattern.compile("^.*\\.jar$"), dir); List<File> jarFiles = FileUtil.findFilesByMask(Pattern.compile("^.*\\.jar$"), dir);
CopyOnWriteArrayList<File> extras = Lists.newCopyOnWriteArrayList(); CopyOnWriteArrayList<File> extras = Lists.newCopyOnWriteArrayList();
@@ -13,47 +13,46 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.jvm.compiler; package org.jetbrains.jet.jvm.compiler;
import junit.framework.Assert; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.VariableDescriptorForObject; import org.jetbrains.jet.lang.descriptors.VariableDescriptorForObject;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.types.ErrorUtils; import org.jetbrains.jet.lang.types.ErrorUtils;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.util.Collection; import java.util.Collection;
import static org.jetbrains.jet.jvm.compiler.LoadDescriptorUtil.TEST_PACKAGE_FQNAME;
import static org.jetbrains.jet.lang.resolve.BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR;
public final class CompileKotlinAgainstBinariesCustomTest extends AbstractCompileKotlinAgainstCustomBinariesTest { public final class CompileKotlinAgainstBinariesCustomTest extends AbstractCompileKotlinAgainstCustomBinariesTest {
public static final String TEST_DATA_PATH = "compiler/testData/compileKotlinAgainstBinariesCustom/";
public void testDuplicateObjectInSourcesAndBinaries() throws Exception { @NotNull
BindingContext context = analyzeFile(new File( private Collection<DeclarationDescriptor> analyzeAndGetAllDescriptors() throws IOException {
"compiler/testData/compileKotlinAgainstBinariesCustom/duplicateObjectInBinaryAndSources/duplicateObjectInBinaryAndSources.kt")); String testName = getTestName(true);
NamespaceDescriptor namespaceDescriptor = context.get(FQNAME_TO_NAMESPACE_DESCRIPTOR, TEST_PACKAGE_FQNAME); File ktFile = new File(TEST_DATA_PATH + testName, testName + ".kt");
assert namespaceDescriptor != null; return analyzeFileToNamespace(ktFile).getMemberScope().getAllDescriptors();
Collection<DeclarationDescriptor> allDescriptors = namespaceDescriptor.getMemberScope().getAllDescriptors(); }
Assert.assertEquals(allDescriptors.size(), 2);
public void testDuplicateObjectInBinaryAndSources() throws Exception {
Collection<DeclarationDescriptor> allDescriptors = analyzeAndGetAllDescriptors();
assertEquals(allDescriptors.size(), 2);
for (DeclarationDescriptor descriptor : allDescriptors) { for (DeclarationDescriptor descriptor : allDescriptors) {
Assert.assertTrue(descriptor.getName().asString().equals("Lol")); assertTrue(descriptor.getName().asString().equals("Lol"));
Assert.assertTrue(descriptor instanceof VariableDescriptorForObject); assertTrue(descriptor instanceof VariableDescriptorForObject);
Assert.assertFalse("Object property should have valid class", ErrorUtils.isError(((VariableDescriptorForObject) descriptor).getObjectClass())); assertFalse("Object property should have valid class",
ErrorUtils.isError(((VariableDescriptorForObject) descriptor).getObjectClass()));
} }
} }
public void testBrokenJarWithNoClassForObjectProperty() throws Exception { public void testBrokenJarWithNoClassForObjectProperty() throws Exception {
BindingContext context = analyzeFile(new File( Collection<DeclarationDescriptor> allDescriptors = analyzeAndGetAllDescriptors();
"compiler/testData/compileKotlinAgainstBinariesCustom/brokenJarWithNoClassForObjectProperty/brokenJarWithNoClassForObjectProperty.kt")); assertEquals(allDescriptors.size(), 1);
NamespaceDescriptor namespaceDescriptor = context.get(FQNAME_TO_NAMESPACE_DESCRIPTOR, TEST_PACKAGE_FQNAME);
assert namespaceDescriptor != null;
Collection<DeclarationDescriptor> allDescriptors = namespaceDescriptor.getMemberScope().getAllDescriptors();
Assert.assertEquals(allDescriptors.size(), 1);
DeclarationDescriptor descriptor = allDescriptors.iterator().next(); DeclarationDescriptor descriptor = allDescriptors.iterator().next();
Assert.assertTrue(descriptor.getName().asString().equals("Lol")); assertTrue(descriptor.getName().asString().equals("Lol"));
Assert.assertTrue(descriptor instanceof VariableDescriptorForObject); assertTrue(descriptor instanceof VariableDescriptorForObject);
Assert.assertTrue("Object property should have an error class", ErrorUtils.isError(((VariableDescriptorForObject) descriptor).getObjectClass())); assertTrue("Object property should have an error class",
ErrorUtils.isError(((VariableDescriptorForObject) descriptor).getObjectClass()));
} }
} }