package com.github.sommeri.less4j.commandline; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.PrintStream; import java.util.Collections; import java.util.List; import org.junit.After; import org.junit.Before; import com.github.sommeri.less4j.LessCompiler.CompilationResult; import com.github.sommeri.less4j.LessCompiler.Problem; import com.github.sommeri.less4j.utils.SourceMapValidator; import com.github.sommeri.less4j.utils.TestFileUtils; import com.github.sommeri.less4j.utils.debugonly.DebugAndTestPrint; public abstract class CommandLineTest { protected static final String FILE_DOES_NOT_EXISTS = "Errors produced by compilation of src/test/resources/command-line/doesNotExists.less\nERROR The file " + DebugAndTestPrint.slashToplatformFileSeparator("src/test/resources/command-line/doesNotExists.less")+" does not exists.\nCould not compile the file src/test/resources/command-line/doesNotExists.less\n"; protected static final String inputDir = "src/test/resources/command-line/"; protected static final String customOutputDir = "src/test/resources/command-line/output"; private static final String EXPECTED_CSS = ".test h4 {\n declaration: ##ID;\n}\n"; private static final String EXPECTED_COMPRESSED_CSS = ".test h4{declaration:one;}"; private static final String SOURCE_MAP_LINK = "/*# sourceMappingURL=##FILENAME */\n"; private static final String ERRORS_CSS = ""; private static final String WARNINGS_CSS = "{\n padding: 2 2 2 2;\n}\n"; //private static final String ERRORS_CSS = ".test h4 {\n declaration: !#error#!;\n padding: 2 2 2 2;\n}\n"; protected SourceMapValidator sourceMapValidator = new SourceMapValidator(); protected TestFileUtils fileUtils = new TestFileUtils(); protected final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); protected final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); private PrintStream originalOut = null; private PrintStream originalErr = null; @Before public void setUpStreams() { originalOut = System.out; originalErr = System.err; System.setOut(new PrintStream(outContent)); System.setErr(new PrintStream(errContent)); } @After public void cleanUpStreams() { System.setOut(originalOut); System.setErr(originalErr); } protected void assertHelpScreen() { String output = outContent.toString(); assertTrue(output.contains("less4j test.less")); } protected void assertVersion() { String output = outContent.toString(); assertTrue(output.contains("less4j " + CommandLine.getVersion())); } protected void assertMissingFilesError() { String output = outContent.toString(); assertEquals("", output); String error = errContent.toString(); assertEquals("Main parameters are required (\"[list of files]\")", error.trim()); } protected void assertNoErrors() { String error = errContent.toString(); assertEquals("", error); } protected void assertError(String expected) { String error = errContent.toString(); assertEquals(expected, error.replace("\r\n", "\n")); } protected void assertErrorsAsInFile(String filename) { String expected = fileUtils.readFile(filename); String error = errContent.toString(); assertEquals(expected, error.replace("\r\n", "\n")); } protected void assertSysoutAsInFile(String filename) { String expected = fileUtils.readFile(filename); String error = outContent.toString(); assertEquals(expected, error.replace("\r\n", "\n")); } protected void assertSysout(String expected) { String out = outContent.toString(); assertEquals(expected, out.replace("\r\n", "\n")); } protected void cleanErrors() { errContent.reset(); } protected String correctCss(String id) { return EXPECTED_CSS.replace("##ID", id); } protected String correctCompressedCss(String id) { return EXPECTED_COMPRESSED_CSS.replace("##ID", id); } protected String correctCssWithSourceMap(String id, String filename) { String correctCss = correctCss(id); return correctCss + SOURCE_MAP_LINK.replace("##FILENAME", filename); } protected String incorrectCss() { return ERRORS_CSS; } protected String warningsCss() { return WARNINGS_CSS; } protected List<Problem> noProblems() { List<Problem> result = Collections.emptyList(); return result; } protected void validateSourceMap(String mapdataFile, String cssFile, String mapFile) { CompilationResult result = new CompilationResult(fileUtils.readFile(cssFile), fileUtils.readFile(mapFile), noProblems()); sourceMapValidator.validateSourceMap(result, new File(mapdataFile), new File(cssFile)); } }