| /******************************************************************************* |
| * Copyright (c) 2012, 2017 NumberFour AG and others. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * NumberFour AG - initial API and Implementation (Alex Panchenko) |
| *******************************************************************************/ |
| package org.eclipse.dltk.core.tests.cache; |
| |
| import static org.eclipse.dltk.core.SourceParserUtil.getCache; |
| import static org.hamcrest.CoreMatchers.not; |
| |
| import java.io.ByteArrayInputStream; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.dltk.core.IModelElement; |
| import org.eclipse.dltk.core.IScriptFolder; |
| import org.eclipse.dltk.core.ISourceModule; |
| import org.eclipse.dltk.core.ModelException; |
| import org.eclipse.dltk.core.SourceParserUtil; |
| import org.eclipse.dltk.core.tests.ProjectSetup; |
| import org.eclipse.dltk.core.tests.model.ModelTestsPlugin; |
| import org.hamcrest.BaseMatcher; |
| import org.hamcrest.Description; |
| import org.hamcrest.Matcher; |
| import org.junit.Assert; |
| import org.junit.Before; |
| import org.junit.Rule; |
| import org.junit.Test; |
| |
| public class SourceModuleInfoCacheTest extends Assert { |
| |
| @Rule |
| public final ProjectSetup project = new ProjectSetup( |
| ModelTestsPlugin.WORKSPACE, "cache"); |
| |
| @Before |
| public void clearCache() { |
| getCache().clear(); |
| } |
| |
| private static final Matcher<ISourceModule> IS_CACHED = new BaseMatcher<ISourceModule>() { |
| @Override |
| public void describeTo(Description description) { |
| description.appendText("ISourceModule contained in AST cache"); |
| } |
| |
| @Override |
| public boolean matches(Object item) { |
| return !getCache().get((ISourceModule) item).isEmpty(); |
| } |
| }; |
| |
| @Test |
| public void cacheLoaded() throws CoreException { |
| ISourceModule module = project.getSourceModule("src", "folder1/a.txt"); |
| assertNotNull(module); |
| assertTrue(module.exists()); |
| assertNotNull(SourceParserUtil.parse(module, null)); |
| assertThat(module, IS_CACHED); |
| } |
| |
| @Test |
| public void moduleCreate() throws CoreException { |
| final ISourceModule module = project.getSourceModule("src", |
| "folder1/new.txt"); |
| assertNotNull(module); |
| assertNotNull(SourceParserUtil.parse(module, null)); |
| assertThat(module, IS_CACHED); |
| assertEquals(1, getCache().size()); |
| ((IFile) module.getResource()).create(new ByteArrayInputStream( |
| new byte[0]), false, null); |
| // assertEquals(0, getCache().size()); |
| assertThat(module, not(IS_CACHED)); |
| } |
| |
| @Test |
| public void moduleModify() throws CoreException { |
| ISourceModule module = project.getSourceModule("src", "folder1/a.txt"); |
| assertNotNull(module); |
| assertTrue(module.exists()); |
| assertNotNull(SourceParserUtil.parse(module, null)); |
| assertThat(module, IS_CACHED); |
| |
| final IFile file = (IFile) module.getResource(); |
| final String contents = project.getFileContentsAsString(file); |
| file.setContents( |
| new ByteArrayInputStream((contents + "//change\n").getBytes()), |
| IResource.NONE, null); |
| assertThat(module, not(IS_CACHED)); |
| } |
| |
| @Test |
| public void moduleReplace() throws CoreException { |
| ISourceModule module = project.getSourceModule("src", "folder1/a.txt"); |
| assertNotNull(module); |
| assertTrue(module.exists()); |
| assertNotNull(SourceParserUtil.parse(module, null)); |
| assertThat(module, IS_CACHED); |
| |
| final IFile file = (IFile) module.getResource(); |
| project.getWorkspace().run(monitor -> { |
| file.delete(true, monitor); |
| file.create( |
| new ByteArrayInputStream(("//new content\n").getBytes()), |
| IResource.NONE, monitor); |
| }, null); |
| assertEquals(0, getCache().size()); |
| assertThat(module, not(IS_CACHED)); |
| } |
| |
| @Test |
| public void moduleDelete() throws ModelException { |
| ISourceModule module = project.getSourceModule("src", "folder1/a.txt"); |
| assertNotNull(module); |
| assertTrue(module.exists()); |
| assertNotNull(SourceParserUtil.parse(module, null)); |
| assertThat(module, IS_CACHED); |
| |
| module.delete(true, null); |
| assertFalse(module.exists()); |
| assertThat(module, not(IS_CACHED)); |
| } |
| |
| @Test |
| public void folderDelete() throws ModelException { |
| ISourceModule module = project.getSourceModule("src", "folder1/a.txt"); |
| assertNotNull(module); |
| assertTrue(module.exists()); |
| assertNotNull(SourceParserUtil.parse(module, null)); |
| assertThat(module, IS_CACHED); |
| |
| ((IScriptFolder) module.getAncestor(IModelElement.SCRIPT_FOLDER)) |
| .delete(true, null); |
| assertEquals(0, getCache().size()); |
| assertFalse(module.exists()); |
| assertThat(module, not(IS_CACHED)); |
| } |
| |
| @Test |
| public void projectDelete() throws CoreException { |
| ISourceModule module = project.getSourceModule("src", "folder1/a.txt"); |
| assertNotNull(module); |
| assertTrue(module.exists()); |
| assertNotNull(SourceParserUtil.parse(module, null)); |
| assertThat(module, IS_CACHED); |
| |
| project.get().delete(true, null); |
| assertEquals(0, getCache().size()); |
| assertFalse(module.exists()); |
| assertThat(module, not(IS_CACHED)); |
| } |
| |
| @Test |
| public void projectClose() throws CoreException { |
| ISourceModule module = project.getSourceModule("src", "folder1/a.txt"); |
| assertNotNull(module); |
| assertTrue(module.exists()); |
| assertNotNull(SourceParserUtil.parse(module, null)); |
| assertThat(module, IS_CACHED); |
| |
| project.get().close(null); |
| assertEquals(0, getCache().size()); |
| } |
| |
| @Test |
| public void overflow() throws CoreException { |
| final IScriptFolder folder = project.getScriptFolder("src", "folder1"); |
| assertNotNull(folder); |
| final int capacity = getCache().capacity(); |
| final List<ISourceModule> modules = new ArrayList<ISourceModule>(); |
| project.getWorkspace().run(monitor -> { |
| for (int i = 0; i < capacity; ++i) { |
| modules.add(folder.createSourceModule("m" + i + ".txt", "", |
| false, null)); |
| } |
| }, null); |
| for (ISourceModule module : modules) { |
| assertNotNull(SourceParserUtil.parse(module, null)); |
| } |
| for (ISourceModule module : modules) { |
| assertThat(module, IS_CACHED); |
| } |
| final ISourceModule a = project.getSourceModule("src", "folder1/a.txt"); |
| assertNotNull(a); |
| assertTrue(a.exists()); |
| assertNotNull(SourceParserUtil.parse(a, null)); |
| assertThat(a, IS_CACHED); |
| assertThat(modules.get(0), not(IS_CACHED)); |
| } |
| |
| } |