package com.sleekbyte.tailor.utils; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.Token; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.rules.TestName; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.lang.reflect.Method; import java.nio.charset.Charset; /** * Tests for {@link SourceFileUtil}. */ @RunWith(MockitoJUnitRunner.class) public class SourceFileUtilTest { @Rule public TestName testName = new TestName(); @Rule public TemporaryFolder folder = new TemporaryFolder(); private static final String INPUT_FILE = "inputFile.swift"; private static final String NORMAL_LINE = "This is data for a file"; private static final String NAME = "variableName"; private File inputFile; private PrintWriter writer; @Mock private ParserRuleContext context; @Mock private Token startToken; @Mock private Token stopToken; @Before public void setUp() throws NoSuchMethodException, IOException { Method method = this.getClass().getMethod(testName.getMethodName()); inputFile = folder.newFile(method.getName() + "-" + INPUT_FILE); writer = new PrintWriter(inputFile, Charset.defaultCharset().name()); when(context.getStart()).thenReturn(startToken); when(context.getStop()).thenReturn(stopToken); } @Test public void testFileTooLongMaxLengthZeroOrNegativeEmptyFile() { assertFalse(SourceFileUtil.fileTooLong(0, 0)); assertFalse(SourceFileUtil.fileTooLong(-1, -1)); } @Test public void testFileTooLongMaxLengthZeroOrNegative() { assertFalse(SourceFileUtil.fileTooLong(1, 0)); assertFalse(SourceFileUtil.fileTooLong(1, -1)); } @Test public void testFileTooLongMaxLengthValidEmptyFile() { assertFalse(SourceFileUtil.fileTooLong(0, 2)); } @Test public void testFileTooLongMaxLengthValid() { assertTrue(SourceFileUtil.fileTooLong(3, 2)); assertFalse(SourceFileUtil.fileTooLong(3, 3)); } @Test public void testLineTooLongMaxLengthZeroOrNegative() { assertFalse(SourceFileUtil.lineTooLong(20, 0)); assertFalse(SourceFileUtil.lineTooLong(20, -1)); } @Test public void testLineTooLongMaxLengthValid() { assertFalse(SourceFileUtil.lineTooLong(25, 25)); assertTrue(SourceFileUtil.lineTooLong(26, 25)); assertTrue(SourceFileUtil.lineTooLong(50, 25)); } @Test public void testLineHasTrailingWhitespaceInvalid() { String line = ""; assertFalse(SourceFileUtil.lineHasTrailingWhitespace(line.length(), line)); line = NORMAL_LINE; assertFalse(SourceFileUtil.lineHasTrailingWhitespace(line.length(), line)); } @Test public void testLineHasTrailingWhitespaceValid() { String line = " "; assertTrue(SourceFileUtil.lineHasTrailingWhitespace(line.length(), line)); line = "\t\t"; assertTrue(SourceFileUtil.lineHasTrailingWhitespace(line.length(), line)); line = NORMAL_LINE + " "; assertTrue(SourceFileUtil.lineHasTrailingWhitespace(line.length(), line)); line = NORMAL_LINE + "\t\t"; assertTrue(SourceFileUtil.lineHasTrailingWhitespace(line.length(), line)); } @Test public void testConstructTooLongMaxLengthZeroOrNegative() { assertFalse(SourceFileUtil.constructTooLong(context, 0)); assertFalse(SourceFileUtil.constructTooLong(context, -1)); } @Test public void testConstructTooLongMaxLengthValid() { when(startToken.getLine()).thenReturn(1); when(stopToken.getLine()).thenReturn(5); assertFalse(SourceFileUtil.constructTooLong(context, 10)); when(startToken.getLine()).thenReturn(1); when(stopToken.getLine()).thenReturn(20); assertTrue(SourceFileUtil.constructTooLong(context, 12)); assertFalse(SourceFileUtil.constructTooLong(context, 19)); } @Test public void testNameTooLongMaxLengthZeroOrNegative() { assertFalse(SourceFileUtil.nameTooLong(context, 0)); assertFalse(SourceFileUtil.nameTooLong(context, -1)); } @Test public void testNameTooLongMaxLengthValid() { when(context.getText()).thenReturn(NAME); assertFalse(SourceFileUtil.nameTooLong(context, NAME.length())); assertFalse(SourceFileUtil.nameTooLong(context, NAME.length() + 1)); assertTrue(SourceFileUtil.nameTooLong(context, NAME.length() - 10)); when(context.getText()).thenReturn(""); assertFalse(SourceFileUtil.nameTooLong(context, NAME.length())); } @Test public void testNewlineTerminatedBlankFile() throws IOException { assertTrue(SourceFileUtil.singleNewlineTerminated(inputFile)); } @Test public void testNewlineTerminatedNoNewline() throws IOException { writer.print("Line without a terminating newline."); writer.close(); assertFalse(SourceFileUtil.singleNewlineTerminated(inputFile)); } @Test public void testNewlineTerminatedOnlyNewline() throws IOException { writeNumOfLines(1, ""); assertTrue(SourceFileUtil.singleNewlineTerminated(inputFile)); } @Test public void testNewlineTerminatedWithNewline() throws IOException { writeNumOfLines(3, NORMAL_LINE); assertTrue(SourceFileUtil.singleNewlineTerminated(inputFile)); } @Test public void testNewlineTerminatedWithNoContentAndMultipleNewlines() throws IOException { writeNumOfLines(2, ""); assertFalse(SourceFileUtil.singleNewlineTerminated(inputFile)); } @Test public void testNewlineTerminatedWithSomeContentAndMultipleNewlines() throws IOException { writeNumOfLines(1, NORMAL_LINE + "\n"); assertFalse(SourceFileUtil.singleNewlineTerminated(inputFile)); } @Test public void testHasLeadingWhitespaceBlankFile() throws IOException { assertFalse(SourceFileUtil.hasLeadingWhitespace(inputFile)); } @Test public void testHasLeadingWhitespaceOnlyNewline() throws IOException { writeNumOfLines(1, ""); assertTrue(SourceFileUtil.hasLeadingWhitespace(inputFile)); } @Test public void testHasLeadingWhitespaceWithSingleLine() throws IOException { writeNumOfLines(1, NORMAL_LINE); assertFalse(SourceFileUtil.hasLeadingWhitespace(inputFile)); } @Test public void testHasLeadingWhitespaceWithSingleLineAndPrecedingNewline() throws IOException { writeNumOfLines(1, "\n" + NORMAL_LINE); assertTrue(SourceFileUtil.hasLeadingWhitespace(inputFile)); } @Test public void testHasLeadingWhitespaceWithSingleLineAndPrecedingSpace() throws IOException { writeNumOfLines(1, " " + NORMAL_LINE); assertTrue(SourceFileUtil.hasLeadingWhitespace(inputFile)); } @Test public void testHasLeadingWhitespaceWithSingleLineAndPrecedingTab() throws IOException { writeNumOfLines(1, "\t" + NORMAL_LINE); assertTrue(SourceFileUtil.hasLeadingWhitespace(inputFile)); } private void writeNumOfLines(int numOfLines, String data) { for (int i = 1; i <= numOfLines; i++) { writer.println(data); } writer.close(); } }