package org.jetbrains.plugins.clojure.base; import com.intellij.ide.startup.impl.StartupManagerImpl; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.OrderEnumerator; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.startup.StartupManager; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase; import com.intellij.util.IncorrectOperationException; import com.intellij.util.LocalTimeCounter; import junit.framework.Assert; import org.jetbrains.plugins.clojure.file.ClojureFileType; import org.jetbrains.plugins.clojure.util.TestUtils; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * @author ilyas */ public abstract class ClojureBaseTestCase extends LightPlatformCodeInsightFixtureTestCase { protected static final String SOURCE_FILE_EXT = ".clj"; protected static final String TEST_FILE_EXT = ".test"; private Project myProject; protected CodeStyleSettings mySettings; public Project getProject() { return myProject; } public abstract String getDataPath(); protected CodeStyleSettings getSettings() { return CodeStyleSettingsManager.getSettings(myProject); } protected void setSettings() { final ClojureFileType fileType = ClojureFileType.CLOJURE_FILE_TYPE; mySettings = getSettings(); mySettings.getIndentOptions(fileType).INDENT_SIZE = 2; mySettings.getIndentOptions(fileType).CONTINUATION_INDENT_SIZE = 2; mySettings.getIndentOptions(fileType).TAB_SIZE = 2; } protected void setUp() throws Exception { super.setUp(); myFixture.setTestDataPath(getDataPath()); myProject = myFixture.getProject(); setSettings(); setupLibraries(); } private void setupLibraries() { ModifiableRootModel rootModel = null; final ModuleRootManager rootManager = ModuleRootManager.getInstance(myFixture.getModule()); // Add Clojure Library OrderEnumerator libs = rootManager.orderEntries().librariesOnly(); final List<Library.ModifiableModel> libModels = new ArrayList<Library.ModifiableModel>(); rootModel = TestUtils.addLibrary(rootModel, rootManager, libs, libModels, "clojureLib", TestUtils.getMockClojureLib(), null); rootModel = TestUtils.addLibrary(rootModel, rootManager, libs, libModels, "clojureContrib", TestUtils.getMockClojureContribLib(), null); if (rootModel != null || !libModels.isEmpty()) { final ModifiableRootModel finalRootModel = rootModel; ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { for (Library.ModifiableModel model : libModels) { model.commit(); } if (finalRootModel != null) { finalRootModel.commit(); } final StartupManagerImpl startupManager = (StartupManagerImpl) StartupManager.getInstance(myProject); startupManager.startCacheUpdate(); } }); } } protected void tearDown() throws Exception { super.tearDown(); } protected PsiFile createPseudoPhysicalFile(final Project project, final String fileName, final String text) throws IncorrectOperationException { String tmpFile = project.getBaseDir() + fileName; return PsiFileFactory.getInstance(project).createFileFromText(tmpFile, FileTypeManager.getInstance().getFileTypeByFileName(fileName), text, LocalTimeCounter.currentTime(), true); } public String getTestName() { final String s = getName().substring(4); return s.substring(0, 1).toLowerCase() + s.substring(1); } protected String fetchFile(String dir, String fileName, String extension) { File file = new File(getDataPath() + (dir == null || dir.trim().equals("") ? "" : dir + "/") + fileName + extension); Assert.assertTrue(file.exists()); StringBuilder contents = new StringBuilder(); try { BufferedReader input = new BufferedReader(new FileReader(file)); try { String line; if ((line = input.readLine()) != null) { contents.append(line); } while ((line = input.readLine()) != null) { contents.append("\n"); contents.append(line); } } finally { input.close(); } } catch (IOException ex) { ex.printStackTrace(); } return contents.toString(); } }