From b69bf3dc1d765c8f847204fadeff01d29dade7ed Mon Sep 17 00:00:00 2001
From: Lorenzo Bettini <lorenzo.bettini@gmail.com>
Date: Wed, 12 May 2021 19:16:29 +0200
Subject: [PATCH] 81: test selection in PitMutationsView

Task-Url: http://github.com/pitest/pitclipse/issues/81
---
 .../ui/view/mutations/PitMutationsView.java   |  1 -
 .../pageobjects/PitMutationsView.java         |  2 +-
 .../ui/behaviours/steps/PitclipseSteps.java   |  4 ++
 .../ui/tests/AbstractPitclipseSWTBotTest.java | 37 ++++++-----
 .../tests/PitclipsePitMutationsViewTest.java  | 66 +++++++++++++++++++
 5 files changed, 92 insertions(+), 18 deletions(-)
 create mode 100644 tests/org.pitest.pitclipse.ui.tests/src/org/pitest/pitclipse/ui/tests/PitclipsePitMutationsViewTest.java

diff --git a/bundles/org.pitest.pitclipse.ui/src/org/pitest/pitclipse/ui/view/mutations/PitMutationsView.java b/bundles/org.pitest.pitclipse.ui/src/org/pitest/pitclipse/ui/view/mutations/PitMutationsView.java
index 26d86e2a..f9ff3b44 100644
--- a/bundles/org.pitest.pitclipse.ui/src/org/pitest/pitclipse/ui/view/mutations/PitMutationsView.java
+++ b/bundles/org.pitest.pitclipse.ui/src/org/pitest/pitclipse/ui/view/mutations/PitMutationsView.java
@@ -39,7 +39,6 @@ private void createTreeViewer(Composite parent) {
         viewer.setLabelProvider(new ViewLabelProvider());
         viewer.addDoubleClickListener(ExpandingDoubleClick.LISTENER);
         viewer.addDoubleClickListener(OpenMutationDoubleClick.LISTENER);
-        // viewer.addSelectionChangedListener(listener);
         viewer.setInput(MutationsModel.EMPTY_MODEL);
     }
 
diff --git a/tests/org.pitest.pitclipse.ui.tests/src/org/pitest/pitclipse/ui/behaviours/pageobjects/PitMutationsView.java b/tests/org.pitest.pitclipse.ui.tests/src/org/pitest/pitclipse/ui/behaviours/pageobjects/PitMutationsView.java
index 5ad72307..bec966b0 100644
--- a/tests/org.pitest.pitclipse.ui.tests/src/org/pitest/pitclipse/ui/behaviours/pageobjects/PitMutationsView.java
+++ b/tests/org.pitest.pitclipse.ui.tests/src/org/pitest/pitclipse/ui/behaviours/pageobjects/PitMutationsView.java
@@ -50,12 +50,12 @@ public PitMutationsView(SWTWorkbenchBot bot) {
     }
 
     public List<PitMutation> getMutations() {
-        PAGES.views().waitForTestsAreRunOnConsole();
         SWTBotTree mutationTree = mutationTreeRoot();
         return mutationsFrom(mutationTree);
     }
 
     private SWTBotTree mutationTreeRoot() {
+        PAGES.views().waitForTestsAreRunOnConsole();
         SWTBotView mutationsView = bot.viewByTitle("PIT Mutations");
         mutationsView.show();
         // Make sure the 'PIT Mutations' view is opened
diff --git a/tests/org.pitest.pitclipse.ui.tests/src/org/pitest/pitclipse/ui/behaviours/steps/PitclipseSteps.java b/tests/org.pitest.pitclipse.ui.tests/src/org/pitest/pitclipse/ui/behaviours/steps/PitclipseSteps.java
index 19686875..77ab1693 100644
--- a/tests/org.pitest.pitclipse.ui.tests/src/org/pitest/pitclipse/ui/behaviours/steps/PitclipseSteps.java
+++ b/tests/org.pitest.pitclipse.ui.tests/src/org/pitest/pitclipse/ui/behaviours/steps/PitclipseSteps.java
@@ -91,6 +91,10 @@ public void mutationsAre(DataTable tableOfMutations) {
     @When("the following mutation is selected")
     public void mutationIsSelected(DataTable tableOfMutations) {
         PitMutation mutation = mutationsFromExampleTable(tableOfMutations).get(0);
+        mutationIsSelected(mutation);
+    }
+
+    public void mutationIsSelected(PitMutation mutation) {
         PAGES.getPitMutationsView()
              .select(mutation);
     }
diff --git a/tests/org.pitest.pitclipse.ui.tests/src/org/pitest/pitclipse/ui/tests/AbstractPitclipseSWTBotTest.java b/tests/org.pitest.pitclipse.ui.tests/src/org/pitest/pitclipse/ui/tests/AbstractPitclipseSWTBotTest.java
index 839b5676..177d214f 100644
--- a/tests/org.pitest.pitclipse.ui.tests/src/org/pitest/pitclipse/ui/tests/AbstractPitclipseSWTBotTest.java
+++ b/tests/org.pitest.pitclipse.ui.tests/src/org/pitest/pitclipse/ui/tests/AbstractPitclipseSWTBotTest.java
@@ -55,6 +55,12 @@
 @RunWith(SWTBotJunit4ClassRunner.class)
 public abstract class AbstractPitclipseSWTBotTest {
     protected static SWTWorkbenchBot bot;
+    private static int statusIndex = 0;
+    private static int projectIndex = 1;
+    private static int packageIndex = 2;
+    private static int classIndex = 3;
+    private static int lineIndex = 4;
+    private static int mutationIndex = 5;
 
     @BeforeClass
     public static void beforeClass() throws Exception {
@@ -292,27 +298,26 @@ protected static void consoleContains(int generatedMutants, int killedMutants,
     protected static void mutationsAre(String expectedMutationsTable) {
         List<PitMutation> expectedMutations = new ArrayList<>();
         String[] lines = expectedMutationsTable.split("\n");
-        final int statusIndex = 0;
-        final int projectIndex = 1;
-        final int packageIndex = 2;
-        final int classIndex = 3;
-        final int lineIndex = 4;
-        final int mutationIndex = 5;
-        for (String string : lines) {
-            String[] mutationRow = string.split("\\|");
-            DetectionStatus status = DetectionStatus.valueOf(mutationRow[statusIndex].trim());
-            String project = mutationRow[projectIndex].trim();
-            String pkg = mutationRow[packageIndex].trim();
-            String className = mutationRow[classIndex].trim();
-            int line = parseInt(mutationRow[lineIndex].trim());
-            String mutation = mutationRow[mutationIndex].trim();
-            PitMutation pitMutation = PitMutation.builder().withStatus(status).withProject(project).withPackage(pkg)
-                    .withClassName(className).withLineNumber(line).withMutation(mutation).build();
+        for (String line : lines) {
+            PitMutation pitMutation = fromMutationLine(line);
             expectedMutations.add(pitMutation);
         }
         mutationsAre(expectedMutations);
     }
 
+    protected static PitMutation fromMutationLine(String line) {
+        String[] mutationRow = line.split("\\|");
+        DetectionStatus status = DetectionStatus.valueOf(mutationRow[statusIndex].trim());
+        String project = mutationRow[projectIndex].trim();
+        String pkg = mutationRow[packageIndex].trim();
+        String className = mutationRow[classIndex].trim();
+        int lineNum = parseInt(mutationRow[lineIndex].trim());
+        String mutation = mutationRow[mutationIndex].trim();
+        PitMutation pitMutation = PitMutation.builder().withStatus(status).withProject(project).withPackage(pkg)
+                .withClassName(className).withLineNumber(lineNum).withMutation(mutation).build();
+        return pitMutation;
+    }
+
     protected static void mutationsAre(List<PitMutation> expectedMutations) {
         List<PitMutation> actualMutations = PAGES.getPitMutationsView().getMutations();
         assertThat(actualMutations, equalTo(expectedMutations));
diff --git a/tests/org.pitest.pitclipse.ui.tests/src/org/pitest/pitclipse/ui/tests/PitclipsePitMutationsViewTest.java b/tests/org.pitest.pitclipse.ui.tests/src/org/pitest/pitclipse/ui/tests/PitclipsePitMutationsViewTest.java
new file mode 100644
index 00000000..aa1243ae
--- /dev/null
+++ b/tests/org.pitest.pitclipse.ui.tests/src/org/pitest/pitclipse/ui/tests/PitclipsePitMutationsViewTest.java
@@ -0,0 +1,66 @@
+package org.pitest.pitclipse.ui.tests;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.pitest.pitclipse.ui.behaviours.steps.PitMutation;
+import org.pitest.pitclipse.ui.behaviours.steps.PitclipseSteps;
+
+/**
+ * @author Lorenzo Bettini
+ * 
+ */
+@RunWith(SWTBotJunit4ClassRunner.class)
+public class PitclipsePitMutationsViewTest extends AbstractPitclipseSWTBotTest {
+
+    private static final String TEST_PROJECT = "project1";
+    private static final String FOO_BAR_PACKAGE = "foo.bar";
+    private static final String FOO_CLASS = "Foo";
+    private static final String FOO_TEST_CLASS = "FooTest";
+    private static final String BAR_CLASS = "Bar";
+    private static final String BAR_TEST_CLASS = "BarTest";
+
+    @Test
+    public void selectMutationOpensTheClassAtTheRightLineNumber() throws CoreException {
+        createJavaProjectWithJUnit4(TEST_PROJECT);
+        verifyProjectExists(TEST_PROJECT);
+        createClassWithMethod(FOO_CLASS, FOO_BAR_PACKAGE, TEST_PROJECT,
+             "public int f(int i) {\n"
+           + "    java.util.ArrayList<Object> pointless = new java.util.ArrayList<>();\n"
+           + "    if (pointless.size() == 1)\n"
+           + "        return i + 1;\n"
+           + "    else\n"
+           + "        return 0;\n"
+           + "}");
+        createClassWithMethod(FOO_TEST_CLASS, FOO_BAR_PACKAGE, TEST_PROJECT,
+            "@org.junit.Test public void badTest() {\n"
+          + "    " + FOO_CLASS + " x = new " + FOO_CLASS + "();\n"
+          + "    x.f(1);\n"
+          + "}");
+        createClassWithMethod(BAR_CLASS, FOO_BAR_PACKAGE, TEST_PROJECT,
+            "public int f(int i) {\n"
+          + "    java.util.ArrayList<Object> pointless = new java.util.ArrayList<>();\n"
+          + "    if (pointless.size() == 1)\n"
+          + "        return i + 1;\n"
+          + "    else\n"
+          + "        return 0;\n"
+          + "}");
+        createClassWithMethod(BAR_TEST_CLASS, FOO_BAR_PACKAGE, TEST_PROJECT,
+           "@org.junit.Test public void badTest() {\n"
+          + "    " + BAR_CLASS + " x = new " + BAR_CLASS + "();\n"
+          + "    x.f(1);\n"
+          + "}");
+        runPackageTest(FOO_BAR_PACKAGE, TEST_PROJECT);
+        coverageReportGenerated(2, 80, 0);
+        PitclipseSteps pitclipseSteps = new PitclipseSteps();
+        PitMutation mutation = fromMutationLine(
+        "SURVIVED    | project1 | foo.bar | foo.bar.Foo |    7 | negated conditional");
+        pitclipseSteps.mutationIsSelected(mutation);
+        pitclipseSteps.mutationIsOpened(FOO_CLASS + ".java", 7);
+        mutation = fromMutationLine(
+        "SURVIVED    | project1 | foo.bar | foo.bar.Bar |    7 | negated conditional");
+        pitclipseSteps.mutationIsSelected(mutation);
+        pitclipseSteps.mutationIsOpened(BAR_CLASS + ".java", 7);
+    }
+}