diff --git a/src/fitnesse/responders/run/SuiteResponder.java b/src/fitnesse/responders/run/SuiteResponder.java index fc7224cd0..044339b00 100644 --- a/src/fitnesse/responders/run/SuiteResponder.java +++ b/src/fitnesse/responders/run/SuiteResponder.java @@ -57,6 +57,8 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import static fitnesse.responders.WikiImportingTraverser.ImportError; import static fitnesse.wiki.WikiImportProperty.isAutoUpdated; @@ -295,7 +297,29 @@ protected String getRerunPageName() { PageCrawler pageCrawler = page.getPageCrawler(); WikiPagePath fullPath = pageCrawler.getFullPath(); String fullPathName = PathParser.render(fullPath); - return "RerunLastFailures_"+fullPathName.replace(".","-"); + if (fullPathName.startsWith("RerunLastFailures_")) { + String newFullPathName = fullPathName.replace(".", "-"); + if (!(newFullPathName.endsWith("(1)"))) { + return newFullPathName.replaceAll("\\(\\d+\\)", "(" + 2 + ")"); + } else if (newFullPathName.endsWith("SubsetQueryTest")) { + return newFullPathName + "(1)"; + } else { + int number = extractNumber(newFullPathName) + 1; + return newFullPathName.replaceAll("\\(\\d+\\)", "(" + number + ")"); + + } + } else { + return "RerunLastFailures_" + fullPathName.replace(".", "-"); + } + } + + public static int extractNumber(String input) { + Pattern pattern = Pattern.compile("\\((\\d+)\\)"); + Matcher matcher = pattern.matcher(input); + if (matcher.find()) { + return Integer.parseInt(matcher.group(1)); + } + return -1; // return -1 if no number found } protected String getTitle() { diff --git a/test/fitnesse/responders/run/SuiteResponderTest.java b/test/fitnesse/responders/run/SuiteResponderTest.java index 0536d81c5..ccab2b52a 100644 --- a/test/fitnesse/responders/run/SuiteResponderTest.java +++ b/test/fitnesse/responders/run/SuiteResponderTest.java @@ -15,13 +15,16 @@ import fitnesse.util.DateAlteringClock; import fitnesse.util.DateTimeUtil; import fitnesse.util.XmlUtil; +import fitnesse.wiki.PageCrawler; import fitnesse.wiki.PageData; import fitnesse.wiki.PathParser; import fitnesse.wiki.WikiPage; +import fitnesse.wiki.WikiPagePath; import fitnesse.wiki.WikiPageUtil; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.mockito.Mockito; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; @@ -47,6 +50,8 @@ public class SuiteResponderTest { private SuiteResponder responder; private WikiPage root; private WikiPage suite; + private PageCrawler pageCrawler; + private WikiPagePath wikiPagePath; private FitNesseContext context; private final String fitPassFixture = "|!-fitnesse.testutil.PassFixture-!|\n"; private final String fitFailFixture = "|!-fitnesse.testutil.FailFixture-!|\n"; @@ -564,6 +569,48 @@ public void loadsCustomFormatters() throws Exception { assertTrue(FooFormatter.initialized); } + + @Test + public void testRerunLastFailuresScenario() { + String fullPathName = "RerunLastFailures_TestPage"; + Mockito.when(PathParser.render(wikiPagePath)).thenReturn(fullPathName); + + String result = responder.getRerunPageName(); + assertEquals("RerunLastFailures_TestPage(2)", result); + } + + @Test + public void testRerunLastFailuresWithSubsetQueryTestScenario() { + String fullPathName = "RerunLastFailures_SubsetQueryTest"; + Mockito.when(PathParser.render(wikiPagePath)).thenReturn(fullPathName); + + String result = responder.getRerunPageName(); + assertEquals("RerunLastFailures_SubsetQueryTest(1)", result); + } + + @Test + public void testNormalPageScenario() { + String fullPathName = "NormalPage"; + Mockito.when(PathParser.render(wikiPagePath)).thenReturn(fullPathName); + + String result = responder.getRerunPageName(); + assertEquals("RerunLastFailures_NormalPage", result); + } + + @Test + public void testRerunLastFailuresWithNumber() { + String fullPathName = "RerunLastFailures_TestPage(3)"; + Mockito.when(PathParser.render(wikiPagePath)).thenReturn(fullPathName); + + String result = responder.getRerunPageName(); + assertEquals("RerunLastFailures_TestPage(4)", result); + } + + @Test + public void testExtractNumber() { + assertEquals(3, responder.extractNumber("TestPage(3)")); + assertEquals(-1, responder.extractNumber("TestPage")); + } private String runSuite() throws Exception { Response response = responder.makeResponse(context, request);