package com.innovatian.idea.powershell.test.lang.parser; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; import com.intellij.psi.impl.DebugUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.LocalTimeCounter; import junit.framework.Assert; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; public abstract class PsParsingTestContext extends CodeInsightFixtureTestCase { public static final String TEMP_FILE = "temp.ps1"; public void doTest() { doTest(getTestName(true).replace('$', '/') + ".test"); } protected void doTest(String fileName) { final List<String> list = readInput(getTestDataPath() + "/" + fileName); final String input = list.get(0); final String output = list.get(1); checkParsing(input, output); } protected void checkParsing(String input, String output) { final PsiFile psiFile = createPseudoPhysicalPsFile(getProject(), input); String psiTree = DebugUtil.psiToString(psiFile, false); assertEquals(output.trim(), psiTree.trim()); } public static PsiFile createPseudoPhysicalPsFile(final Project project, final String text) throws IncorrectOperationException { return createPseudoPhysicalFile(project, TEMP_FILE, text); } public static PsiFile createPseudoPhysicalFile(final Project project, final String fileName, final String text) throws IncorrectOperationException { return PsiFileFactory.getInstance(project).createFileFromText( fileName, FileTypeManager.getInstance().getFileTypeByFileName(fileName), text, LocalTimeCounter.currentTime(), true); } @Override public String getTestDataPath() { return PsParsingTestContext.class.getProtectionDomain().getCodeSource().getLocation().getPath() + "../../../testdata/parsing/powershell/"; } public static List<String> readInput(String filePath) { String content; try { content = new String(FileUtil.loadFileText(new File(filePath))); } catch (IOException e) { throw new RuntimeException(e); } Assert.assertNotNull(content); List<String> input = new ArrayList<String>(); int separatorIndex; content = StringUtil.replace(content, "\r", ""); // for MACs // Adding input before ----- while ((separatorIndex = content.indexOf("-----")) >= 0) { input.add(content.substring(0, separatorIndex - 1)); content = content.substring(separatorIndex); while (StringUtil.startsWithChar(content, '-')) { content = content.substring(1); } if (StringUtil.startsWithChar(content, '\n')) { content = content.substring(1); } } // Result - after ----- if (content.endsWith("\n")) { content = content.substring(0, content.length() - 1); } input.add(content); Assert.assertTrue("No data found in source file", input.size() > 0); Assert.assertNotNull("Test output points to null", input.size() > 1); return input; } }