package com.github.jknack.antlr4ide.generator; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.isA; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import java.io.File; import java.io.InputStream; import java.util.List; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.QualifiedName; import org.eclipse.xtext.util.StringInputStream; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.easymock.PowerMock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import com.github.jknack.antlr4ide.console.Console; import com.google.common.base.Joiner; import com.google.common.collect.Lists; @RunWith(PowerMockRunner.class) @PrepareForTest({ToolRunner.class, ProcessBuilder.class }) public class ToolRunnerTest { @Test public void run() throws Exception { String[] vmArgs = {}; String fileName = "Hello.g4"; InputStream toolStream = new StringInputStream( "warning: warning message\nerror: undefined rule: 'x'"); InputStream dependStream = new StringInputStream(""); QualifiedName generatedFiles = new QualifiedName("antlr4ide", "generatedFiles"); IPath fileFullPath = Path.fromOSString("home").append("demo").append("project") .append(fileName); IPath fileParentPath = fileFullPath.removeLastSegments(1); IPath toolPath = Path.fromOSString("..").append("antlr4ide.core").append("lib") .append(ToolOptionsProvider.DEFAULT_TOOL); IPath lexerPath = fileFullPath.removeLastSegments(1).append("HelloLexer.java"); IPath parserPath = fileFullPath.removeLastSegments(1).append("HelloParser.java"); List<String> command = Lists.newArrayList("-o", ".", "-listener", "-no-visitor"); List<String> toolCommand = Lists.newArrayList( "java", "-cp", toolPath.toFile().getAbsolutePath() + File.pathSeparator + toolPath.removeLastSegments(1).toFile().getAbsolutePath(), ToolOptionsProvider.TOOL, fileName); toolCommand.addAll(command); List<String> dependCommand = Lists.newArrayList( "java", "-cp", toolPath.toFile().getAbsolutePath() + File.pathSeparator + toolPath.removeLastSegments(1).toFile().getAbsolutePath(), ToolOptionsProvider.TOOL, fileName); dependCommand.add("-depend"); dependCommand.addAll(command); IFile file = createMock(IFile.class); IContainer fileParent = createMock(IContainer.class); ToolOptions options = createMock(ToolOptions.class); ProcessBuilder toolPb = PowerMock.createMock(ProcessBuilder.class); Process toolProcess = createMock(Process.class); ProcessBuilder dependPb = PowerMock.createMock(ProcessBuilder.class); Process dependProcess = createMock(Process.class); Console console = createMock(Console.class); console.info("ANTLR Tool v%s (%s)", ToolOptionsProvider.VERSION, toolPath.toFile()); console.info("%s %s", fileName, Joiner.on(" ").join(command)); console.info("warning: warning message"); console.error("error: undefined rule: 'x'"); console.error("\n%s warning(s)\n", 1); console.error("%s error(s)\n", 1); console.error("BUILD FAIL"); console.info(eq("Total time: %s %s(s)\n"), isA(Number.class), eq("millisecond")); expect(file.getName()).andReturn(fileName); expect(file.getPersistentProperty(generatedFiles)).andReturn( lexerPath.toOSString() + File.separator + parserPath.toOSString()); expect(file.getParent()).andReturn(fileParent).times(3); expect(fileParent.getLocation()).andReturn(fileParentPath).times(3); expect(options.getAntlrTool()).andReturn(toolPath.toOSString()); expect(options.isCleanUpDerivedResources()).andReturn(true); expect(options.vmArguments()).andReturn(vmArgs); expect(options.getLibDirectory()).andReturn("libdir"); expect(options.command(file)).andReturn(command); PowerMock.expectNew(ProcessBuilder.class, (Object[]) toolCommand.toArray(new String[0])) .andReturn(toolPb); expect(toolPb.directory(fileParentPath.toFile())).andReturn(toolPb); expect(toolPb.start()).andReturn(toolProcess); expect(toolProcess.getErrorStream()).andReturn(toolStream); expect(toolProcess.waitFor()).andReturn(0); toolProcess.destroy(); PowerMock.expectNew(ProcessBuilder.class, (Object[]) dependCommand.toArray(new String[0])) .andReturn(dependPb); expect(dependPb.directory(fileParentPath.toFile())).andReturn(dependPb); expect(dependPb.start()).andReturn(dependProcess); expect(dependProcess.getInputStream()).andReturn(dependStream); expect(dependProcess.waitFor()).andReturn(0); dependProcess.destroy(); file.setPersistentProperty(generatedFiles, null); Object[] mocks = {file, options, console, fileParent, toolProcess, dependProcess }; replay(mocks); PowerMock.replay(toolPb, dependPb, ProcessBuilder.class); new ToolRunner().run(file, options, console); verify(mocks); PowerMock.verify(toolPb, dependPb, ProcessBuilder.class); } }