package test.org.kalisen.classpathdoctor; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; import java.util.Iterator; import java.util.List; import mockit.Mockit; import org.kalisen.classpathdoctor.AbstractVariableResolver; import org.kalisen.classpathdoctor.ClassPath; import org.kalisen.classpathdoctor.ClassPathParser; import org.kalisen.classpathdoctor.EmptyPathEntry; import org.kalisen.classpathdoctor.Environment; import org.kalisen.classpathdoctor.InvalidPathEntry; import org.kalisen.classpathdoctor.PathEntry; import org.kalisen.classpathdoctor.PathResolver; import org.testng.Assert; import org.testng.annotations.AfterTest; import org.testng.annotations.Test; public abstract class AbstractTestClassPathParser { private static final String VAR_NAME = "MY_VARIABLE"; private static final String VAR_VALUE = "MY_VALUE"; @AfterTest public void tearDown() { Mockit.assertExpectations(); Mockit.tearDownMocks(); } @Test public void thePathSeparatorSetInTheConstructorShouldBeRetrievedThroughTheGetMethod() { final String pathSeparator = "%"; ClassPathParser parser = new ClassPathParser(pathSeparator); assertEquals(parser.getPathSeparatorAsString(), pathSeparator); } @Test public void byDefaultThePathSeparatorShouldBeTheOneOfTheCurrentPlatform() { ClassPathParser parser = new ClassPathParser(); assertEquals(parser.getPathSeparatorAsString(), System .getProperty("path.separator")); } @Test public void parsingClasspathMadeOfSpacesShouldReturnEmptyClasspath() { ClassPathParser parser = new ClassPathParser(); ClassPath path = parser.parse(" "); List<PathEntry> entries = path.getEntries(); assertNotNull(entries); assertEquals(entries.size(), 0); } @Test public void parsingEmptyClasspathShouldReturnEmptyClasspath() { ClassPathParser parser = new ClassPathParser(); ClassPath path = parser.parse(""); List<PathEntry> entries = path.getEntries(); assertNotNull(entries); assertEquals(entries.size(), 0); } @Test public void parsingAnEmptyStringBetweenTwoSeparatorsShouldReturnAnInvalidEntry() { ClassPathParser parser = new ClassPathParser(getTestedPathSeparator()); ClassPath path = parser.parse("something" + getTestedPathSeparator() + " " + getTestedPathSeparator() + "something_else"); List<PathEntry> entries = path.getEntries(); assertNotNull(entries); assertEquals(entries.size(), 3); Iterator<PathEntry> iter = entries.iterator(); assertEquals(iter.next().getPath(), "something"); PathEntry invalid = iter.next(); assertEquals(invalid.getPath(), " "); assertTrue(invalid instanceof InvalidPathEntry); assertEquals(iter.next().getPath(), "something_else"); } @Test public void parsingASpaceInFrontOfASeparatorShouldReturnAClasspathWithASingleInvalidEntry() { ClassPathParser parser = new ClassPathParser(getTestedPathSeparator()); ClassPath path = parser.parse(" " + getTestedPathSeparator()); List<PathEntry> entries = path.getEntries(); assertNotNull(entries); assertEquals(entries.size(), 2); Iterator<PathEntry> iter = entries.iterator(); PathEntry entry = iter.next(); assertNotNull(entry); assertTrue(entry instanceof InvalidPathEntry); assertEquals(entry.getPath(), " "); assertEquals(iter.next(), EmptyPathEntry.INSTANCE); } @Test public void parsingAnEmptyStringInFrontOfASeparatorShouldReturnTwoEmptyClassPathEntries() { ClassPathParser parser = new ClassPathParser(getTestedPathSeparator()); ClassPath path = parser.parse("" + getTestedPathSeparator() + ""); List<PathEntry> entries = path.getEntries(); assertNotNull(entries); assertEquals(entries.size(), 2); Iterator<PathEntry> iter = entries.iterator(); assertEquals(iter.next(), EmptyPathEntry.INSTANCE); assertEquals(iter.next(), EmptyPathEntry.INSTANCE); } @Test public void parsingAnEmptyStringInFrontOfASeparatorFollowedByAnEntryShouldReturnClasspathWith2Entries() { ClassPathParser parser = new ClassPathParser(getTestedPathSeparator()); ClassPath path = parser.parse("" + getTestedPathSeparator() + "entry1"); List<PathEntry> entries = path.getEntries(); assertNotNull(entries); assertEquals(entries.size(), 2); Iterator<PathEntry> iter = entries.iterator(); assertEquals(iter.next(), EmptyPathEntry.INSTANCE); PathEntry entry = iter.next(); assertNotNull(entry); assertEquals(entry.getPath(), "entry1"); } @Test public void parsingNullClasspathShouldReturnEmptyClasspath() { ClassPathParser parser = new ClassPathParser(); ClassPath path = parser.parse(null); List<PathEntry> entries = path.getEntries(); assertNotNull(entries); assertEquals(entries.size(), 0); } @Test public void parsingValidClasspathStringShouldReturnNonEmptyClasspath() { ClassPathParser parser = new ClassPathParser(getTestedPathSeparator()); String cpString = "entry1" + getTestedPathSeparator() + "entry2" + getTestedPathSeparator() + "entry3" + getTestedPathSeparator() + "entry4" + getTestedPathSeparator(); ClassPath path = parser.parse(cpString); List<PathEntry> entries = path.getEntries(); assertNotNull(entries); assertEquals(entries.size(), 5); Iterator<PathEntry> iter = entries.iterator(); assertEquals(iter.next().getPath(), "entry1"); assertEquals(iter.next().getPath(), "entry2"); assertEquals(iter.next().getPath(), "entry3"); assertEquals(iter.next().getPath(), "entry4"); assertEquals(iter.next(), EmptyPathEntry.INSTANCE); } @Test public void parsingValidClasspathStringWithFileSeparatorShouldReturnNonEmptyClasspath() { ClassPathParser parser = new ClassPathParser(getTestedPathSeparator()); String cpString = "entry1" + getTestedPathSeparator() + "entry2" + getTestedPathSeparator() + "entry3" + getTestedFileSeparator() + "subentry3" + getTestedPathSeparator() + "entry4" + getTestedPathSeparator(); ClassPath path = parser.parse(cpString); List<PathEntry> entries = path.getEntries(); assertNotNull(entries); assertEquals(entries.size(), 5); Iterator<PathEntry> iter = entries.iterator(); assertEquals(iter.next().getPath(), "entry1"); assertEquals(iter.next().getPath(), "entry2"); assertEquals(iter.next().getPath(), "entry3" + getTestedFileSeparator() + "subentry3"); assertEquals(iter.next().getPath(), "entry4"); assertEquals(iter.next(), EmptyPathEntry.INSTANCE); } @Test public void parsingValidClasspathStringUsingVariableShouldReturnNonEmptyClasspathAndSubstitueVariableValue() { Mockit.redefineMethods(Environment.class, MockEnvironment.class); ClassPathParser parser = new ClassPathParser(getTestedPathSeparator()); PathResolver pathResolver = new PathResolver(); pathResolver.setVariableResolver(getTestedVariableResolver()); parser.setPathResolver(pathResolver); String cpString = "entry1" + getTestedPathSeparator() + getTestedVariableReference() + getTestedPathSeparator() + "entry3" + getTestedFileSeparator() + "subentry3" + getTestedPathSeparator() + "entry4" + getTestedPathSeparator(); ClassPath path = parser.parse(cpString); List<PathEntry> entries = path.getEntries(); assertNotNull(entries); assertEquals(entries.size(), 5); Iterator<PathEntry> iter = entries.iterator(); assertEquals(iter.next().getPath(), "entry1"); assertEquals(iter.next().getPath(), VAR_VALUE); assertEquals(iter.next().getPath(), "entry3" + getTestedFileSeparator() + "subentry3"); assertEquals(iter.next().getPath(), "entry4"); assertEquals(iter.next(), EmptyPathEntry.INSTANCE); } @Test public void parserShouldHandleConsecutiveSeparators() { ClassPathParser parser = new ClassPathParser(getTestedPathSeparator()); String cpString = getTestedPathSeparator() + "entry2" + getTestedPathSeparator() + getTestedPathSeparator() + "entry3"; ClassPath path = parser.parse(cpString); List<PathEntry> entries = path.getEntries(); assertNotNull(entries); assertEquals(entries.size(), 4); Iterator<PathEntry> iter = entries.iterator(); Assert.assertSame(iter.next(), EmptyPathEntry.INSTANCE); Assert.assertEquals(iter.next().getPath(), "entry2"); Assert.assertSame(iter.next(), EmptyPathEntry.INSTANCE); Assert.assertEquals(iter.next().getPath(), "entry3"); } @Test public void parserShouldHandleConsecutiveHeadingSeparators() { ClassPathParser parser = new ClassPathParser(getTestedPathSeparator()); String cpString = getTestedPathSeparator() + getTestedPathSeparator() + "entry2" + getTestedPathSeparator() + "entry3" + getTestedPathSeparator(); ClassPath path = parser.parse(cpString); List<PathEntry> entries = path.getEntries(); assertNotNull(entries); assertEquals(entries.size(), 5); Iterator<PathEntry> iter = entries.iterator(); Assert.assertSame(iter.next(), EmptyPathEntry.INSTANCE); Assert.assertSame(iter.next(), EmptyPathEntry.INSTANCE); Assert.assertEquals(iter.next().getPath(), "entry2"); Assert.assertEquals(iter.next().getPath(), "entry3"); Assert.assertSame(iter.next(), EmptyPathEntry.INSTANCE); } @Test public void parserShouldHandleConsecutiveTrailingSeparators() { ClassPathParser parser = new ClassPathParser(getTestedPathSeparator()); String cpString = "entry2" + getTestedPathSeparator() + "entry3" + getTestedPathSeparator() + getTestedPathSeparator(); ClassPath path = parser.parse(cpString); List<PathEntry> entries = path.getEntries(); assertNotNull(entries); assertEquals(entries.size(), 4); Iterator<PathEntry> iter = entries.iterator(); Assert.assertEquals(iter.next().getPath(), "entry2"); Assert.assertEquals(iter.next().getPath(), "entry3"); Assert.assertSame(iter.next(), EmptyPathEntry.INSTANCE); Assert.assertSame(iter.next(), EmptyPathEntry.INSTANCE); } protected abstract String getTestedPathSeparator(); protected abstract String getTestedFileSeparator(); protected abstract String getTestedVariableReference(); protected abstract AbstractVariableResolver getTestedVariableResolver(); public static class MockEnvironment { public String getValue(String variable) { if (VAR_NAME.equals(variable)) { return AbstractTestClassPathParser.VAR_VALUE; } return null; } } }