package spoon.test.imports; import org.junit.Test; import spoon.Launcher; import spoon.SpoonModelBuilder; import spoon.compiler.SpoonResourceHelper; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtType; import spoon.reflect.factory.Factory; import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.ImportScanner; import spoon.reflect.visitor.ImportScannerImpl; import spoon.reflect.visitor.MinimalImportScanner; import spoon.reflect.visitor.Query; import spoon.reflect.visitor.filter.NameFilter; import java.security.AccessControlException; import java.util.Collection; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static spoon.testing.utils.ModelUtils.build; /** * Created by gerard on 14/10/2014. */ public class ImportScannerTest { @Test public void testComputeMinimalImportsInClass() throws Exception { String packageName = "spoon.test"; String className = "SampleImportClass"; String qualifiedName = packageName + "." + className; Factory aFactory = build(packageName, className).getFactory(); CtType<?> theClass = aFactory.Type().get(qualifiedName); ImportScanner importContext = new MinimalImportScanner(); Collection<CtTypeReference<?>> imports = importContext.computeImports(theClass); assertTrue(imports.isEmpty()); } @Test public void testComputeImportsInClass() throws Exception { String packageName = "spoon.test"; String className = "SampleImportClass"; String qualifiedName = packageName + "." + className; Factory aFactory = build(packageName, className).getFactory(); CtType<?> theClass = aFactory.Type().get(qualifiedName); ImportScanner importContext = new ImportScannerImpl(); Collection<CtTypeReference<?>> imports = importContext.computeImports(theClass); assertEquals(2, imports.size()); } @Test public void testComputeImportsInClassWithSameName() throws Exception { String packageName = "spoon.test.imports.testclasses2"; String className = "ImportSameName"; String qualifiedName = packageName + "." + className; Factory aFactory = build(packageName, className).getFactory(); CtType<?> theClass = aFactory.Type().get(qualifiedName); ImportScanner importContext = new ImportScannerImpl(); Collection<CtTypeReference<?>> imports = importContext.computeImports(theClass); assertEquals(0, imports.size()); } @Test public void testMultiCatchImport() throws Exception { Launcher spoon = new Launcher(); Factory factory = spoon.createFactory(); SpoonModelBuilder compiler = spoon.createCompiler( factory, SpoonResourceHelper.resources( "./src/test/java/spoon/test/imports/testclasses/MultiCatch.java")); compiler.build(); final List<CtClass<?>> classes = Query.getElements(factory, new NameFilter<CtClass<?>>("MultiCatch")); ImportScanner importScanner = new ImportScannerImpl(); importScanner.computeImports(classes.get(0)); // as ArithmeticException come from java.lang it is not imported anymore //assertTrue( importScanner.isImported( factory.Type().createReference( ArithmeticException.class ) )); assertTrue( importScanner.isImported( factory.Type().createReference( AccessControlException.class ) )); } }