package org.erlide.engine.model.erlang; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.EnumSet; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.erlide.engine.ErlangEngine; import org.erlide.engine.internal.model.root.ErlProject; import org.erlide.engine.model.ErlElementKind; import org.erlide.engine.model.ErlModelException; import org.erlide.engine.model.IErlElement; import org.erlide.engine.model.IErlElement.AcceptFlags; import org.erlide.engine.model.IErlElementVisitor; import org.erlide.engine.model.root.IErlElementLocator; import org.erlide.engine.model.root.IErlExternal; import org.erlide.engine.model.root.IErlModule; import org.erlide.engine.util.ErlideTestUtils; import org.junit.Test; import com.google.common.collect.Lists; public class IErlElementTest extends ErlModelTestBase { // boolean exists(); @Test public void exists() throws Exception { final boolean exists = module.exists(); module.getResource().delete(true, null); final boolean exists2 = module.exists(); assertTrue(exists); assertFalse(exists2); } // IErlElement getAncestorOfKind(Kind kind); @Test public void getAncestorOfKind() throws Exception { module.open(null); final IErlElement element = module.getElementAtLine(3); final IErlElement ancestor = element.getAncestorOfKind(ErlElementKind.FUNCTION); final IErlElement ancestor2 = element.getAncestorOfKind(ErlElementKind.MODULE); final IErlElement ancestor3 = element.getAncestorOfKind(ErlElementKind.FOLDER); final IErlElement ancestor4 = element.getAncestorOfKind(ErlElementKind.PROJECT); final IErlElement ancestor5 = element.getAncestorOfKind(ErlElementKind.MODEL); final IErlElement ancestor6 = element.getAncestorOfKind(ErlElementKind.TYPESPEC); assertNotNull(ancestor); assertTrue(ancestor instanceof IErlFunction); assertEquals(ErlElementKind.FUNCTION, ancestor.getKind()); assertEquals(element, ancestor); assertEquals(ErlElementKind.MODULE, ancestor2.getKind()); assertEquals(ErlElementKind.FOLDER, ancestor3.getKind()); assertEquals(ErlElementKind.PROJECT, ancestor4.getKind()); assertEquals(ErlElementKind.MODEL, ancestor5.getKind()); assertEquals(ancestor3, ancestor2.getAncestorOfKind(ErlElementKind.FOLDER)); assertEquals(ancestor4, ancestor2.getAncestorOfKind(ErlElementKind.PROJECT)); assertNull(ancestor6); } // IErlProject getProject(); @Test public void getProject() throws Exception { assertEquals(project, ErlangEngine.getInstance().getModelUtilService().getProject(module)); assertEquals(project, ErlangEngine.getInstance().getModelUtilService().getProject(project)); module.open(null); final IErlElement element = module.getElementAtLine(3); assertEquals(project, ErlangEngine.getInstance().getModelUtilService().getProject(element)); } // IErlModule getModule(); @Test public void getModule() throws Exception { module.open(null); final IErlMember element = module.getElementAtLine(3); assertEquals(module, ErlangEngine.getInstance().getModelUtilService().getModule(element)); } // IResource getCorrespondingResource(); @Test public void getCorrespondingResource() throws Exception { project.open(null); final IProject workspaceProject = project.getWorkspaceProject(); final IFolder srcFolder = workspaceProject.getFolder("src"); final IFile file = srcFolder.getFile("xx.erl"); final IErlElementLocator model = ErlangEngine.getInstance().getModel(); final IErlModule otpFile = model.findModuleFromProject(project, "file.erl", null, IErlElementLocator.Scope.PROJECT_ONLY); module.open(null); final IErlElement element = module.getElementAtLine(3); assertEquals(file, module.getCorrespondingResource()); assertNull(otpFile.getCorrespondingResource()); assertNull(element.getCorrespondingResource()); } // String getName(); @Test public void getName() throws Exception { module.open(null); final IErlElement element = module.getElementAtLine(3); final IErlElement element2 = module.getElementAtLine(0); assertEquals("xx.erl", module.getName()); assertEquals("testproject1", project.getName()); assertEquals("f", element.getName()); assertEquals("module", element2.getName()); } // Kind getKind(); @Test public void getKind() throws Exception { module.open(null); final IErlElement element = module.getElementAtLine(3); final IErlElement element2 = module.getElementAtLine(0); assertEquals(ErlElementKind.MODULE, module.getKind()); assertEquals(ErlElementKind.PROJECT, project.getKind()); assertEquals(ErlElementKind.FUNCTION, element.getKind()); assertEquals(ErlElementKind.ATTRIBUTE, element2.getKind()); assertEquals(ErlElementKind.MODEL, ErlangEngine.getInstance().getModel().getKind()); } // IErlModel getModel(); @Test public void getModel() throws Exception { module.open(null); final IErlElementLocator model = ErlangEngine.getInstance().getModel(); assertEquals(model, ErlangEngine.getInstance().getModel()); } // IParent getParent(); @Test public void getParent() throws Exception { project.open(null); final IErlElement srcFolder = project.getChildNamed("src"); module.open(null); final IErlElement element = module.getElementAtLine(3); assertEquals(project, srcFolder.getParent()); assertEquals(srcFolder, module.getParent()); assertEquals(module, element.getParent()); } // IResource getResource(); @Test public void getResource() throws Exception { project.open(null); final IProject workspaceProject = project.getWorkspaceProject(); final IFolder srcFolder = workspaceProject.getFolder("src"); final IFile file = srcFolder.getFile("xx.erl"); final IErlElementLocator model = ErlangEngine.getInstance().getModel(); final IErlModule otpFile = model.findModuleFromProject(project, "file.erl", null, IErlElementLocator.Scope.PROJECT_ONLY); module.open(null); final IErlElement element = module.getElementAtLine(3); assertEquals(file, module.getResource()); assertNull(otpFile.getResource()); assertEquals(module.getResource(), element.getResource()); } // boolean isReadOnly(); // Empty method // boolean isStructureKnown() throws ErlModelException; @Test public void isStructureKnown() throws Exception { ((ErlProject) project).setSourceDirs(project.getProperties().getSourceDirs()); // this sets structureKnown to false final boolean structureKnown = project.isStructureKnown(); project.open(null); final boolean structureKnown2 = project.isStructureKnown(); final boolean structureKnown3 = module.isStructureKnown(); module.open(null); final boolean structureKnown4 = module.isStructureKnown(); final IErlElementLocator model = ErlangEngine.getInstance().getModel(); final IErlModule otpFile = model.findModuleFromProject(project, "file.erl", null, IErlElementLocator.Scope.PROJECT_ONLY); final IErlExternal external = (IErlExternal) otpFile.getParent(); final boolean structureKnown5 = external.isStructureKnown(); final IErlModule module2 = ErlideTestUtils.createModule(project, "yy.erl", "-module(yy).\n% comment\n% same\nf(x) -> y.\n% last"); final boolean structureKnown6 = module2.isStructureKnown(); module2.open(null); final boolean structureKnown7 = module2.isStructureKnown(); assertFalse(structureKnown); assertTrue(structureKnown2); assertFalse(structureKnown3); assertTrue(structureKnown4); assertTrue(structureKnown5); assertFalse(structureKnown6); assertTrue(structureKnown7); } // void resourceChanged(IResourceDelta delta); @Test public void resourceChanged() throws Exception { project.open(null); final boolean structureKnown = project.isStructureKnown(); project.resourceChanged(new ErlideTestUtils.ResourceDeltaStub()); final boolean structureKnown2 = project.isStructureKnown(); assertTrue(structureKnown); assertFalse(structureKnown2); } // void accept(IErlElementVisitor visitor, EnumSet<AcceptFlags> flags, // IErlElement.Kind leafKind) throws ErlModelException; @Test public void accept() throws Exception { project.open(null); // ErlLogger.debug(project.getChildren().toString()); module.open(null); final List<IErlElement> elements = Lists.newArrayList(); final IErlElementVisitor visitor = new IErlElementVisitor() { @Override public boolean visit(final IErlElement element) throws ErlModelException { if (element instanceof IErlExternal) { return false; // avoid digging through otp } final String name = element.getName(); if (name.equals("ebin")) { return false; // avoid possible beam-files } else if (name.startsWith(".")) { return false; // avoid eclipse internals } elements.add(element); return true; } }; final EnumSet<AcceptFlags> noneOf = EnumSet.noneOf(AcceptFlags.class); project.accept(visitor, noneOf, ErlElementKind.MODULE); final List<IErlElement> kindModuleElementsVisited = Lists.newArrayList(elements); elements.clear(); project.accept(visitor, noneOf, ErlElementKind.FUNCTION); final List<IErlElement> kindFunctionElementsVisited = Lists .newArrayList(elements); elements.clear(); project.accept(visitor, EnumSet.of(AcceptFlags.CHILDREN_FIRST), ErlElementKind.MODULE); final List<IErlElement> childrenFirst = Lists.newArrayList(elements); elements.clear(); project.accept(visitor, EnumSet.of(AcceptFlags.LEAFS_ONLY), ErlElementKind.MODULE); final List<IErlElement> leafsOnly = Lists.newArrayList(elements); elements.clear(); // assertEquals(4, kindModuleElementsVisited.size()); assertEquals(project, kindModuleElementsVisited.get(0)); // ErlLogger.debug(kindModuleElementsVisited.toString()); assertEquals("include", kindModuleElementsVisited.get(1).getName()); assertEquals("src", kindModuleElementsVisited.get(2).getName()); assertEquals(module, kindModuleElementsVisited.get(3)); assertEquals(7, kindFunctionElementsVisited.size()); final int projectIndex = childrenFirst.indexOf(project); final int moduleIndex = childrenFirst.indexOf(module); assertTrue(moduleIndex < projectIndex); assertFalse(leafsOnly.contains(project)); assertTrue(leafsOnly.contains(module)); } // String getLabelString(); // Should be removed // String getFilePath(); @Test public void getFilePath() throws Exception { final String modulePath = module.getResource().getLocation().toString(); // final String projectPath = project.getResource().getLocation() // .toString(); // final String srcFolderPath = projectPath + "/src"; final IErlElement parent = (IErlElement) module.getParent(); module.open(null); final IErlElement element = module.getElementAtLine(3); assertEquals(modulePath, module.getFilePath()); assertNull(project.getFilePath()); assertNull(parent.getFilePath()); assertNull(element.getFilePath()); } // void clearCaches(); /** * @see org.erlide.engine.model.IErlElement#clearCaches() */ // TODO check more than source dir cache @Test public void clearCaches() throws Exception { } }