package net.sf.eclipsefp.haskell.core.code; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.InvocationTargetException; import net.sf.eclipsefp.haskell.core.internal.doubles.MockCodeGenerator; import net.sf.eclipsefp.haskell.core.internal.project.HaskellProject_PDETestCase; import net.sf.eclipsefp.haskell.util.FileUtil; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; public class SourceFileGenerator_PDETest extends HaskellProject_PDETestCase { private static final String SOURCE_FOLDER_NAME = FileUtil.DEFAULT_FOLDER_SRC; private static final String MODULE_NAME = "HelloHaskell"; private static final String LITERATE_SUFFIX = FileUtil.EXTENSION_LHS; private static final String USUAL_SUFFIX = FileUtil.EXTENSION_HS; private ModuleCreationInfo fInfo; @Override protected void setUpMore() throws Exception { fInfo = new ModuleCreationInfo(); fInfo.setFolders(new Path("")); fInfo.setSourceContainer(getProject().getFolder(SOURCE_FOLDER_NAME)); fInfo.setModuleName(MODULE_NAME); } public void testCreateUsualStyleModule() throws CoreException, IOException { final String expectedContents = "module " + MODULE_NAME + " where"; //TODO try to use easymock here MockCodeGenerator codeGen = createCodeGenerator(expectedContents, fInfo.getCommentStyle()); SourceFileGenerator fileGen = new SourceFileGenerator(codeGen); fileGen.createFile(new NullProgressMonitor(), fInfo); codeGen.verify(); assertContents(expectedContents, MODULE_NAME +"."+ USUAL_SUFFIX); } public void testLiterateModule() throws InvocationTargetException, InterruptedException, CoreException, IOException { final String expectedContents = "> module " + MODULE_NAME + " where"; fInfo.setCommentStyle(EHaskellCommentStyle.LITERATE); MockCodeGenerator codeGen = createCodeGenerator(expectedContents, fInfo.getCommentStyle()); SourceFileGenerator fileGen = new SourceFileGenerator(codeGen); fileGen.createFile(new NullProgressMonitor(), fInfo); codeGen.verify(); assertContents(expectedContents, MODULE_NAME +"."+ LITERATE_SUFFIX); } public void testTexStyleModule() throws InvocationTargetException, InterruptedException, CoreException, IOException { final String expectedContents = "\\begin{code}\n" + "module " + MODULE_NAME + " where\n" + "\\end{code}"; fInfo.setCommentStyle(EHaskellCommentStyle.TEX); MockCodeGenerator codeGen = createCodeGenerator(expectedContents, fInfo.getCommentStyle()); SourceFileGenerator fileGen = new SourceFileGenerator(codeGen); fileGen.createFile(new NullProgressMonitor(), fInfo); codeGen.verify(); assertContents(expectedContents, MODULE_NAME +"."+ LITERATE_SUFFIX); } private MockCodeGenerator createCodeGenerator( final String expectedContents, final EHaskellCommentStyle expectedStyle) { MockCodeGenerator codeGen = new MockCodeGenerator(); codeGen.setOutput(expectedContents); codeGen.setExpectedStyle(expectedStyle); return codeGen; } private void assertContents(final String expected, final String fileName) throws CoreException, IOException { IFile file = getProject().getFile(SOURCE_FOLDER_NAME + '/' + fileName); assertTrue(file.exists()); try (BufferedReader input = new BufferedReader( new InputStreamReader(file.getContents()))) { char[] inBuffer = new char[expected.length()]; int n = input.read(inBuffer); final String actual = new String(inBuffer, 0, n); assertEquals(expected, actual); } } }