From 5f18a67f0cb5f7f042362e055d07a51492519680 Mon Sep 17 00:00:00 2001 From: wpopielarski Date: Fri, 22 May 2015 09:53:33 +0200 Subject: [PATCH] enhancement to run scalatest test with ScalaRunner currently the scalatest launcher uses standard java vm runner to run or debug tests. It works fine with a java expression evaluator but with the Scala IDE 4.1.0 there is available the Scala Expression Evaluator which requires a Scala Debugger. This enhancement adds a new scala launcher. From now it is possible to choose appropriate launcher: - an old java one especially for java projects where tests are written with scalatest. Then debugging and evaluation can be done with a java evaluator - a new scala one for scala projects (can be used for java projects as well but is not documented). You can stop in breakpoint during a test execution and evaluate arbitrary expression. This PR must be taken with scala-ide PR #955 Fix #1002447 --- .../META-INF/MANIFEST.MF | 3 +- .../launching/ScalaTestLaunchTest.scala | 144 ++++++- .../test-workspace/scalatest/AStack.launch | 4 + .../scalatest/AStack.scalarunner.launch | 18 + .../AStackshouldtastelikepeanutbutter.launch | 4 + ...ldtastelikepeanutbutter.scalarunner.launch | 20 + .../AStackwhenemptyshouldcomplainonpop.launch | 4 + ...mptyshouldcomplainonpop.scalarunner.launch | 20 + .../scalatest/AStackwheneveritisempty.launch | 4 + ...AStackwheneveritisempty.scalarunner.launch | 22 ++ ...emptycertainlyoughttocomplainonpeek.launch | 4 + ...lyoughttocomplainonpeek.scalarunner.launch | 20 + .../scalatest/AStackwhenfull.launch | 4 + .../AStackwhenfull.scalarunner.launch | 21 + .../scalatest/ExampleSpec1.launch | 4 + .../scalatest/ExampleSpec1.scala.launch | 4 + .../scalatest/MultiSpec.scala.launch | 4 + .../MultiSpec.scala.scalarunner.launch | 18 + .../test-workspace/scalatest/Mysystem.launch | 4 + ...stemalsocanprovidesadvancedfeature1.launch | 4 + .../scalatest/SingleSpec.launch | 4 + .../scalatest/SingleSpec.scala.launch | 4 + .../SingleSpec.scala.scalarunner.launch | 18 + .../scalatest/SingleSpec.scalarunner.launch | 18 + .../scalatest/StackSpec2.launch | 4 + .../scalatest/StackSpec2.scalarunner.launch | 18 + .../scalatest/StringSpecification.launch | 4 + .../StringSpecification.scala.launch | 4 + .../scalatest/TestingFreeSpec.launch | 4 + .../TestingFreeSpec.scalarunner.launch | 18 + .../scalatest/TestingFunSuite.launch | 4 + .../TestingFunSuite.scalarunner.launch | 18 + ...st.StringSpecification-'substring1'.launch | 4 + .../com.test.TestingFunSuite-'test2'.launch | 4 + ...TestingFunSuite-'test2'.scalarunner.launch | 20 + .../test-workspace/scalatest/com.test.launch | 4 + .../scalatest/com.test.scalarunner.launch | 18 + .../META-INF/MANIFEST.MF | 1 + org.scala-ide.sdt.scalatest/plugin.xml | 21 +- .../launching/ScalaTestLaunchDelegate.scala | 100 ++--- .../launching/ScalaTestLaunchableTester.scala | 6 +- .../launching/ScalaTestMainTab.scala | 365 +++++++++--------- .../ScalaTestScalaLaunchDelegate.scala | 7 + .../ui/ScalaTestRunnerViewPart.scala | 3 +- .../scalatest/ui/ScalaTestViewer.scala | 4 +- 45 files changed, 738 insertions(+), 267 deletions(-) create mode 100644 org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStack.scalarunner.launch create mode 100644 org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackshouldtastelikepeanutbutter.scalarunner.launch create mode 100644 org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwhenemptyshouldcomplainonpop.scalarunner.launch create mode 100644 org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwheneveritisempty.scalarunner.launch create mode 100644 org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwheneveritisemptycertainlyoughttocomplainonpeek.scalarunner.launch create mode 100644 org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwhenfull.scalarunner.launch create mode 100644 org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/MultiSpec.scala.scalarunner.launch create mode 100644 org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/SingleSpec.scala.scalarunner.launch create mode 100644 org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/SingleSpec.scalarunner.launch create mode 100644 org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/StackSpec2.scalarunner.launch create mode 100644 org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/TestingFreeSpec.scalarunner.launch create mode 100644 org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/TestingFunSuite.scalarunner.launch create mode 100644 org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.TestingFunSuite-'test2'.scalarunner.launch create mode 100644 org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.scalarunner.launch create mode 100644 org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/launching/ScalaTestScalaLaunchDelegate.scala diff --git a/org.scala-ide.sdt.scalatest.tests/META-INF/MANIFEST.MF b/org.scala-ide.sdt.scalatest.tests/META-INF/MANIFEST.MF index b72d9b0..96914a5 100644 --- a/org.scala-ide.sdt.scalatest.tests/META-INF/MANIFEST.MF +++ b/org.scala-ide.sdt.scalatest.tests/META-INF/MANIFEST.MF @@ -9,7 +9,8 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Require-Bundle: org.scala-lang.scala-library, org.eclipse.equinox.weaving.aspectj, org.junit, - org.scala-ide.sdt.core + org.scala-ide.sdt.core, + org.scala-ide.sdt.debug Import-Package: org.scalaide.core.testsetup, org.aspectj.weaver.loadtime.definition Bundle-ClassPath: ., diff --git a/org.scala-ide.sdt.scalatest.tests/src/scala/tools/eclipse/scalatest/launching/ScalaTestLaunchTest.scala b/org.scala-ide.sdt.scalatest.tests/src/scala/tools/eclipse/scalatest/launching/ScalaTestLaunchTest.scala index e770dc0..3ab4413 100644 --- a/org.scala-ide.sdt.scalatest.tests/src/scala/tools/eclipse/scalatest/launching/ScalaTestLaunchTest.scala +++ b/org.scala-ide.sdt.scalatest.tests/src/scala/tools/eclipse/scalatest/launching/ScalaTestLaunchTest.scala @@ -51,9 +51,9 @@ class ScalaTestLaunchTest { import ScalaTestProject._ - private def launch(launchName: String) { + private def launch(launchName: String, mode: String = ILaunchManager.RUN_MODE) { val launchConfig = DebugPlugin.getDefault.getLaunchManager.getLaunchConfiguration(file(launchName + ".launch")) - launchConfig.launch(ILaunchManager.RUN_MODE, null) + launchConfig.launch(mode, null) } @Test @@ -126,6 +126,146 @@ class ScalaTestLaunchTest { launch("com.test.TestingFunSuite-'test2'") } + @Test + def testLaunchComTestPackageWithScalaRunner() { + launch("com.test.scalarunner") + } + + @Test + def testLaunchComTestPackageWithScalaDebugger() { + launch("com.test.scalarunner", ILaunchManager.DEBUG_MODE) + } + + @Test + def testLaunchSingleSpecFileWithScalaRunner() { + launch("SingleSpec.scala.scalarunner") + } + + @Test + def testLaunchSingleSpecFileWithScalaDebugger() { + launch("SingleSpec.scala.scalarunner", ILaunchManager.DEBUG_MODE) + } + + @Test + def testLaunchMultiSpecFileWithScalaRunner() { + launch("MultiSpec.scala.scalarunner") + } + + @Test + def testLaunchMultiSpecFileWithScalaDebugger() { + launch("MultiSpec.scala.scalarunner", ILaunchManager.DEBUG_MODE) + } + + @Test + def testLaunchSingleSpecWithScalaRunner() { + launch("SingleSpec.scalarunner") + } + + @Test + def testLaunchSingleSpecWithScalaDebugger() { + launch("SingleSpec.scalarunner", ILaunchManager.DEBUG_MODE) + } + + @Test + def testLaunchStackSpec2WithScalaRunner() { + launch("StackSpec2.scalarunner") + } + + @Test + def testLaunchStackSpec2WithScalaDebugger() { + launch("StackSpec2.scalarunner", ILaunchManager.DEBUG_MODE) + } + + @Test + def testLaunchTestingFreeSpecWithScalaRunner() { + launch("TestingFreeSpec.scalarunner") + } + + @Test + def testLaunchTestingFreeSpecWithScalaDebugger() { + launch("TestingFreeSpec.scalarunner", ILaunchManager.DEBUG_MODE) + } + + @Test + def testLaunchTestingFunSuiteWithScalaRunner() { + launch("TestingFunSuite.scalarunner") + } + + @Test + def testLaunchTestingFunSuiteWithScalaDebugger() { + launch("TestingFunSuite.scalarunner", ILaunchManager.DEBUG_MODE) + } + + @Test + def testLaunchConfigAStackshouldtastelikepeanutbutterWithScalaRunner() { + launch("AStackshouldtastelikepeanutbutter.scalarunner") + } + + @Test + def testLaunchConfigAStackshouldtastelikepeanutbutterWithScalaDebugger() { + launch("AStackshouldtastelikepeanutbutter.scalarunner", ILaunchManager.DEBUG_MODE) + } + + @Test + def testLaunchConfigAStackwhenemptyshouldcomplainonpopWithScalaRunner() { + launch("AStackwhenemptyshouldcomplainonpop.scalarunner") + } + + @Test + def testLaunchConfigAStackwhenemptyshouldcomplainonpopWithScalaDebugger() { + launch("AStackwhenemptyshouldcomplainonpop.scalarunner", ILaunchManager.DEBUG_MODE) + } + + @Test + def testLaunchConfigAStackwhenfullWithScalaRunner() { + launch("AStackwhenfull.scalarunner") + } + + @Test + def testLaunchConfigAStackwhenfullWithScalaDebugger() { + launch("AStackwhenfull.scalarunner", ILaunchManager.DEBUG_MODE) + } + + @Test + def testLaunchConfigAStackwheneveritisemptycertainlyoughttocomplainonpeekWithScalaRunner() { + launch("AStackwheneveritisemptycertainlyoughttocomplainonpeek.scalarunner") + } + + @Test + def testLaunchConfigAStackwheneveritisemptycertainlyoughttocomplainonpeekWithScalaDebugger() { + launch("AStackwheneveritisemptycertainlyoughttocomplainonpeek.scalarunner", ILaunchManager.DEBUG_MODE) + } + + @Test + def testLaunchConfigAStackwheneveritisemptyWithScalaRunner() { + launch("AStackwheneveritisempty.scalarunner") + } + + @Test + def testLaunchConfigAStackwheneveritisemptyWithScalaDebugger() { + launch("AStackwheneveritisempty.scalarunner", ILaunchManager.DEBUG_MODE) + } + + @Test + def testLaunchConfigAStackWithScalaRunner() { + launch("AStack.scalarunner") + } + + @Test + def testLaunchConfigAStackWithScalaDebugger() { + launch("AStack.scalarunner", ILaunchManager.DEBUG_MODE) + } + + @Test + def `testLaunchConfigcom.test.TestingFunSuite-'test2'WithScalaRunner`() { + launch("com.test.TestingFunSuite-'test2'.scalarunner") + } + + @Test + def `testLaunchConfigcom.test.TestingFunSuite-'test2'WithScalaDebugger`() { + launch("com.test.TestingFunSuite-'test2'.scalarunner", ILaunchManager.DEBUG_MODE) + } + @Ignore def testLaunchExampleSpec1File() { launch("ExampleSpec1.scala") diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStack.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStack.launch index 6bdebaf..d488c54 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStack.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStack.launch @@ -9,6 +9,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStack.scalarunner.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStack.scalarunner.launch new file mode 100644 index 0000000..85552f5 --- /dev/null +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStack.scalarunner.launch @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackshouldtastelikepeanutbutter.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackshouldtastelikepeanutbutter.launch index 401efe0..8f20292 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackshouldtastelikepeanutbutter.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackshouldtastelikepeanutbutter.launch @@ -11,6 +11,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackshouldtastelikepeanutbutter.scalarunner.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackshouldtastelikepeanutbutter.scalarunner.launch new file mode 100644 index 0000000..91d2c82 --- /dev/null +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackshouldtastelikepeanutbutter.scalarunner.launch @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwhenemptyshouldcomplainonpop.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwhenemptyshouldcomplainonpop.launch index 7aa84d7..899481d 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwhenemptyshouldcomplainonpop.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwhenemptyshouldcomplainonpop.launch @@ -11,6 +11,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwhenemptyshouldcomplainonpop.scalarunner.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwhenemptyshouldcomplainonpop.scalarunner.launch new file mode 100644 index 0000000..6ab4683 --- /dev/null +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwhenemptyshouldcomplainonpop.scalarunner.launch @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwheneveritisempty.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwheneveritisempty.launch index 05d11db..b6a6cc2 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwheneveritisempty.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwheneveritisempty.launch @@ -13,6 +13,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwheneveritisempty.scalarunner.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwheneveritisempty.scalarunner.launch new file mode 100644 index 0000000..23a7932 --- /dev/null +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwheneveritisempty.scalarunner.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwheneveritisemptycertainlyoughttocomplainonpeek.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwheneveritisemptycertainlyoughttocomplainonpeek.launch index 92429af..b70f4eb 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwheneveritisemptycertainlyoughttocomplainonpeek.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwheneveritisemptycertainlyoughttocomplainonpeek.launch @@ -11,6 +11,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwheneveritisemptycertainlyoughttocomplainonpeek.scalarunner.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwheneveritisemptycertainlyoughttocomplainonpeek.scalarunner.launch new file mode 100644 index 0000000..b5b1901 --- /dev/null +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwheneveritisemptycertainlyoughttocomplainonpeek.scalarunner.launch @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwhenfull.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwhenfull.launch index 3421f9b..e1044b4 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwhenfull.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwhenfull.launch @@ -12,6 +12,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwhenfull.scalarunner.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwhenfull.scalarunner.launch new file mode 100644 index 0000000..d983e4c --- /dev/null +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/AStackwhenfull.scalarunner.launch @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/ExampleSpec1.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/ExampleSpec1.launch index cfc6912..dbfb69d 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/ExampleSpec1.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/ExampleSpec1.launch @@ -9,6 +9,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/ExampleSpec1.scala.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/ExampleSpec1.scala.launch index 10b1ef5..a496e40 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/ExampleSpec1.scala.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/ExampleSpec1.scala.launch @@ -9,6 +9,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/MultiSpec.scala.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/MultiSpec.scala.launch index 40b7776..9c848d9 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/MultiSpec.scala.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/MultiSpec.scala.launch @@ -9,6 +9,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/MultiSpec.scala.scalarunner.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/MultiSpec.scala.scalarunner.launch new file mode 100644 index 0000000..bb104fc --- /dev/null +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/MultiSpec.scala.scalarunner.launch @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/Mysystem.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/Mysystem.launch index 5e191ef..7c87c83 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/Mysystem.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/Mysystem.launch @@ -12,6 +12,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/Mysystemalsocanprovidesadvancedfeature1.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/Mysystemalsocanprovidesadvancedfeature1.launch index 1b4db5e..c773dbb 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/Mysystemalsocanprovidesadvancedfeature1.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/Mysystemalsocanprovidesadvancedfeature1.launch @@ -11,6 +11,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/SingleSpec.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/SingleSpec.launch index 6bdebaf..d488c54 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/SingleSpec.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/SingleSpec.launch @@ -9,6 +9,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/SingleSpec.scala.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/SingleSpec.scala.launch index 3ed902d..15e473f 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/SingleSpec.scala.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/SingleSpec.scala.launch @@ -9,6 +9,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/SingleSpec.scala.scalarunner.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/SingleSpec.scala.scalarunner.launch new file mode 100644 index 0000000..a221ba8 --- /dev/null +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/SingleSpec.scala.scalarunner.launch @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/SingleSpec.scalarunner.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/SingleSpec.scalarunner.launch new file mode 100644 index 0000000..f785d98 --- /dev/null +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/SingleSpec.scalarunner.launch @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/StackSpec2.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/StackSpec2.launch index d67b725..83bc319 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/StackSpec2.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/StackSpec2.launch @@ -9,6 +9,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/StackSpec2.scalarunner.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/StackSpec2.scalarunner.launch new file mode 100644 index 0000000..533f01d --- /dev/null +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/StackSpec2.scalarunner.launch @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/StringSpecification.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/StringSpecification.launch index a7e0685..02254ca 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/StringSpecification.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/StringSpecification.launch @@ -9,6 +9,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/StringSpecification.scala.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/StringSpecification.scala.launch index 346486b..edf3a6c 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/StringSpecification.scala.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/StringSpecification.scala.launch @@ -9,6 +9,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/TestingFreeSpec.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/TestingFreeSpec.launch index 02cf99e..fdc342a 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/TestingFreeSpec.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/TestingFreeSpec.launch @@ -9,6 +9,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/TestingFreeSpec.scalarunner.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/TestingFreeSpec.scalarunner.launch new file mode 100644 index 0000000..99b11e2 --- /dev/null +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/TestingFreeSpec.scalarunner.launch @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/TestingFunSuite.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/TestingFunSuite.launch index f611a69..8a4afc9 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/TestingFunSuite.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/TestingFunSuite.launch @@ -9,6 +9,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/TestingFunSuite.scalarunner.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/TestingFunSuite.scalarunner.launch new file mode 100644 index 0000000..8a459fe --- /dev/null +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/TestingFunSuite.scalarunner.launch @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.StringSpecification-'substring1'.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.StringSpecification-'substring1'.launch index f9cd739..6dd2aa2 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.StringSpecification-'substring1'.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.StringSpecification-'substring1'.launch @@ -11,6 +11,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.TestingFunSuite-'test2'.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.TestingFunSuite-'test2'.launch index 1fc76ff..96e81d0 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.TestingFunSuite-'test2'.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.TestingFunSuite-'test2'.launch @@ -11,6 +11,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.TestingFunSuite-'test2'.scalarunner.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.TestingFunSuite-'test2'.scalarunner.launch new file mode 100644 index 0000000..50145fd --- /dev/null +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.TestingFunSuite-'test2'.scalarunner.launch @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.launch index 9e38271..f193f2b 100644 --- a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.launch +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.launch @@ -9,6 +9,10 @@ + + + + diff --git a/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.scalarunner.launch b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.scalarunner.launch new file mode 100644 index 0000000..7606621 --- /dev/null +++ b/org.scala-ide.sdt.scalatest.tests/test-workspace/scalatest/com.test.scalarunner.launch @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/org.scala-ide.sdt.scalatest/META-INF/MANIFEST.MF b/org.scala-ide.sdt.scalatest/META-INF/MANIFEST.MF index 4d8a713..2d99196 100644 --- a/org.scala-ide.sdt.scalatest/META-INF/MANIFEST.MF +++ b/org.scala-ide.sdt.scalatest/META-INF/MANIFEST.MF @@ -25,6 +25,7 @@ Require-Bundle: org.scala-lang.scala-compiler;bundle-version="[2.11.0,2.12.0)", org.scala-lang.scala-reflect, org.scala-ide.sdt.core;bundle-version="[4.0.0,5.0.0)", + org.scala-ide.sdt.debug;bundle-version="[4.2.0,5.0.0)", org.scala-lang.modules.scala-xml;bundle-version="1.0.0" Import-Package: com.ibm.icu.text;apply-aspects:=false;org.eclipse.swt.graphics;apply-aspects:=false, diff --git a/org.scala-ide.sdt.scalatest/plugin.xml b/org.scala-ide.sdt.scalatest/plugin.xml index 05ae807..cfa818f 100644 --- a/org.scala-ide.sdt.scalatest/plugin.xml +++ b/org.scala-ide.sdt.scalatest/plugin.xml @@ -8,16 +8,29 @@ id="scala.scalatest" delegate="scala.tools.eclipse.scalatest.launching.ScalaTestLaunchDelegate" delegateDescription="The ScalaTest Launcher supports running and debugging tests written in ScalaTest." - delegateName="ScalaTest Launcher" + name="ScalaTest (java runner)" modes="run, debug" - name="ScalaTest" - public="true" sourceLocatorId="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector" sourcePathComputerId="org.eclipse.jdt.launching.sourceLookup.javaSourcePathComputer"> + + + + + + + - + diff --git a/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/launching/ScalaTestLaunchDelegate.scala b/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/launching/ScalaTestLaunchDelegate.scala index eb592dc..790bfa8 100644 --- a/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/launching/ScalaTestLaunchDelegate.scala +++ b/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/launching/ScalaTestLaunchDelegate.scala @@ -36,13 +36,18 @@ package scala.tools.eclipse.scalatest.launching -import org.eclipse.jdt.launching.{AbstractJavaLaunchConfigurationDelegate, JavaRuntime, - IRuntimeClasspathEntry, VMRunnerConfiguration, ExecutionArguments} +import org.eclipse.jdt.launching.{ + AbstractJavaLaunchConfigurationDelegate, + JavaRuntime, + IRuntimeClasspathEntry, + VMRunnerConfiguration, + ExecutionArguments +} import org.scalaide.core.IScalaPlugin -import java.io.{File, FileWriter, PrintWriter} +import java.io.{ File, FileWriter, PrintWriter } import com.ibm.icu.text.MessageFormat -import org.eclipse.core.runtime.{Path, CoreException, IProgressMonitor, NullProgressMonitor} -import org.eclipse.debug.core.{ILaunch, ILaunchConfiguration} +import org.eclipse.core.runtime.{ Path, CoreException, IProgressMonitor, NullProgressMonitor } +import org.eclipse.debug.core.{ ILaunch, ILaunchConfiguration } import org.eclipse.jdt.internal.launching.LaunchingMessages import scala.collection.JavaConversions._ import scala.collection.mutable @@ -61,8 +66,9 @@ import scala.annotation.tailrec import org.eclipse.core.runtime.FileLocator import org.eclipse.core.runtime.Platform import org.scalaide.core.SdtConstants +import org.scalaide.core.internal.launching.ClasspathGetterForLaunchDelegate -class ScalaTestLaunchDelegate extends AbstractJavaLaunchConfigurationDelegate { +class ScalaTestLaunchDelegate extends AbstractJavaLaunchConfigurationDelegate with ClasspathGetterForLaunchDelegate { def launchScalaTest(configuration: ILaunchConfiguration, mode: String, launch: ILaunch, monitor0: IProgressMonitor, stArgs: String) { val monitor = if (monitor0 == null) new NullProgressMonitor() else monitor0 @@ -88,18 +94,13 @@ class ScalaTestLaunchDelegate extends AbstractJavaLaunchConfigurationDelegate { val vmAttributesMap = getVMSpecificAttributesMap(configuration) val modifiedAttrMap: mutable.Map[String, Array[String]] = - if (vmAttributesMap == null) mutable.Map() else vmAttributesMap.asInstanceOf[java.util.Map[String,Array[String]]] - val classpath0 = getClasspath(configuration) - val missingScalaLibraries = toInclude(modifiedAttrMap, - classpath0.toList, configuration) - // Classpath - // Add scala libraries that were missed in VM attributes - val classpath = (classpath0.toList):::missingScalaLibraries + if (vmAttributesMap == null) mutable.Map() else vmAttributesMap.asInstanceOf[java.util.Map[String, Array[String]]] + val classpath = getClasspath(configuration).toList // Program & VM arguments val vmArgs = getVMArguments(configuration) - val loaderUrls = classpath.map{ cp => new File(cp).toURI.toURL } + val loaderUrls = classpath.map { cp => new File(cp).toURI.toURL } val bootClassPath = getBootpath(configuration) @@ -110,18 +111,16 @@ class ScalaTestLaunchDelegate extends AbstractJavaLaunchConfigurationDelegate { new URLClassLoader(loaderUrls.toArray, bootClassLoader) } - val pgmArgs = - try { - loader.loadClass("org.scalatest.tools.SocketReporter") - ScalaTestPlugin.asyncShowTestRunnerViewPart(launch, configuration.getName, configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, "")) - val port = ScalaTestPlugin.listener.getPort - getProgramArguments(configuration) + " " + stArgs.replaceAll("-p ", "-R ") + " -oW -k localhost " + port // replace all -p with -R if it is ScalaTest 2.0+ - } - catch { - case e: Throwable => - getProgramArguments(configuration) + " " + stArgs + " -oW -g" - } + try { + loader.loadClass("org.scalatest.tools.SocketReporter") + ScalaTestPlugin.asyncShowTestRunnerViewPart(launch, configuration.getName, configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, "")) + val port = ScalaTestPlugin.listener.getPort + getProgramArguments(configuration) + " " + stArgs.replaceAll("-p ", "-R ") + " -oW -k localhost " + port // replace all -p with -R if it is ScalaTest 2.0+ + } catch { + case e: Throwable => + getProgramArguments(configuration) + " " + stArgs + " -oW -g" + } // In 2.11, XML classes has been modularized into its own jar, and by default Scala IDE does not include it. // We'll include it automatically in boot class path so that our XmlSocketReporter still works. @@ -129,8 +128,7 @@ class ScalaTestLaunchDelegate extends AbstractJavaLaunchConfigurationDelegate { try { loader.loadClass("scala.xml.Elem") List.empty[String] - } - catch { + } catch { case e: Throwable => val codeSource = Class.forName("scala.xml.Elem").getProtectionDomain.getCodeSource if (codeSource != null) // code source could be null @@ -150,14 +148,13 @@ class ScalaTestLaunchDelegate extends AbstractJavaLaunchConfigurationDelegate { targetClasses.getCanonicalPath else bundleFile.getCanonicalPath - } - else + } else bundleFile.getCanonicalPath // Create classpath file val cpFile = File.createTempFile("st-launch", ".classpath") val cpFileOut = new PrintWriter(new FileWriter(cpFile)) - (classpath ::: missingScalaXml).map{ cp => cpFileOut.println(new File(cp).getCanonicalPath) } + (classpath ::: missingScalaXml).map { cp => cpFileOut.println(new File(cp).getCanonicalPath) } cpFileOut.flush() cpFileOut.close() @@ -170,7 +167,7 @@ class ScalaTestLaunchDelegate extends AbstractJavaLaunchConfigurationDelegate { // Create VM config //val runConfig = new VMRunnerConfiguration(mainTypeName, (classpath ::: missingScalaXml).toArray) - val runConfig = new VMRunnerConfiguration(mainTypeName, Array(bundlePath)) + val runConfig = new VMRunnerConfiguration(mainTypeName, bundlePath +: addToVmRunnerClasspath(classpath ::: missingScalaXml)) //runConfig.setProgramArguments(execArgs.getProgramArgumentsArray()) runConfig.setProgramArguments(Array(cpFile.getAbsolutePath, argsFile.getAbsolutePath)) runConfig.setEnvironment(envp) @@ -202,40 +199,19 @@ class ScalaTestLaunchDelegate extends AbstractJavaLaunchConfigurationDelegate { // check for cancellation if (monitor.isCanceled()) return - } - finally { - monitor.done() - } + } finally { + monitor.done() + } } + protected def addToVmRunnerClasspath(classpath: Seq[String]): Array[String] = Array.empty[String] + def launch(configuration: ILaunchConfiguration, mode: String, launch: ILaunch, monitor0: IProgressMonitor) { // Test Class val stArgs = getScalaTestArgs(configuration) launchScalaTest(configuration, mode, launch, monitor0, stArgs) } - private def toInclude(vmMap: mutable.Map[String, Array[String]], classpath: List[String], - configuration: ILaunchConfiguration): List[String] = - missingScalaLibraries((vmMap.values.flatten.toList) ::: classpath, configuration) - - private def missingScalaLibraries(included: List[String], configuration: ILaunchConfiguration): List[String] = { - val entries = JavaRuntime.computeUnresolvedRuntimeClasspath(configuration).toList - val libid = Path.fromPortableString(SdtConstants.ScalaLibContId) - val found = entries.find(e => e.getClasspathEntry != null && e.getClasspathEntry.getPath == libid) - found match { - case Some(e) => - val scalaLibs = resolveClasspath(e, configuration) - scalaLibs.diff(included) - case None => - List() - } - } - - private def resolveClasspath(a: IRuntimeClasspathEntry, configuration: ILaunchConfiguration): List[String] = { - val bootEntry = JavaRuntime.resolveRuntimeClasspath(Array(a), configuration) - bootEntry.toList.map(_.getLocation()) - } - // TODO Needs an expert's review private[launching] def escapeScalaTestClasspathComponent(comp: String): String = { require(comp != null) @@ -262,7 +238,7 @@ class ScalaTestLaunchDelegate extends AbstractJavaLaunchConfigurationDelegate { scSrcFileOpt match { case Some(scSrcFile) => "-p \"" + outputDir + "\" " + - scSrcFile.getTypes + scSrcFile.getTypes .filter(ScalaTestLaunchShortcut.isScalaTestSuite(_)) .map(iType => "-s " + iType.getFullyQualifiedName) .mkString(" ") @@ -270,8 +246,7 @@ class ScalaTestLaunchDelegate extends AbstractJavaLaunchConfigurationDelegate { MessageDialog.openError(null, "Error", "File '" + filePortablePath + "' not found.") "" } - } - else + } else "" case TYPE_PACKAGE => val packageName = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, "") @@ -281,14 +256,15 @@ class ScalaTestLaunchDelegate extends AbstractJavaLaunchConfigurationDelegate { "-p \"" + outputDir + "\" -w " + packageName else "-p \"" + outputDir + "\" -m " + packageName - } - else + } else "" case _ => "" } } +} +object ScalaTestLaunchDelegate { def getScalaTestArgsForSuite(suiteClassName: String, suiteId: String) = { if (suiteClassName == suiteId) "-s " + suiteClassName diff --git a/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/launching/ScalaTestLaunchableTester.scala b/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/launching/ScalaTestLaunchableTester.scala index 47d8f8c..7abca94 100644 --- a/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/launching/ScalaTestLaunchableTester.scala +++ b/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/launching/ScalaTestLaunchableTester.scala @@ -78,7 +78,7 @@ class ScalaTestTestTester extends PropertyTester { } } catch { - case _ => false + case _: Throwable => false } case _ => false @@ -120,7 +120,7 @@ class ScalaTestSuiteTester extends PropertyTester { } } catch { - case _ => false + case _: Throwable => false } } } @@ -147,7 +147,7 @@ class ScalaTestFileTester extends PropertyTester { } } catch { - case _ => false + case _: Throwable => false } } } \ No newline at end of file diff --git a/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/launching/ScalaTestMainTab.scala b/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/launching/ScalaTestMainTab.scala index 381f56d..2b49d00 100644 --- a/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/launching/ScalaTestMainTab.scala +++ b/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/launching/ScalaTestMainTab.scala @@ -36,67 +36,51 @@ package scala.tools.eclipse.scalatest.launching -import org.eclipse.jdt.debug.ui.launchConfigurations.JavaMainTab -import org.eclipse.swt.widgets.Composite -import org.eclipse.swt.widgets.Group +import org.eclipse.core.resources.IFile +import org.eclipse.core.resources.IResource +import org.eclipse.core.resources.ResourcesPlugin +import org.eclipse.debug.core.ILaunchConfiguration +import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy import org.eclipse.debug.internal.ui.SWTFactory -import org.eclipse.swt.layout.GridData -import org.eclipse.swt.layout.GridLayout -import org.eclipse.ui.PlatformUI -import org.eclipse.jdt.internal.debug.ui.IJavaDebugHelpContextIds -import org.eclipse.swt.widgets.Text -import org.eclipse.swt.widgets.Button -import org.eclipse.swt.events.ModifyListener -import org.eclipse.swt.events.ModifyEvent -import org.eclipse.jdt.internal.debug.ui.actions.ControlAccessibleListener -import org.eclipse.jdt.internal.debug.ui.launcher.LauncherMessages -import org.eclipse.swt.events.SelectionListener -import org.eclipse.swt.events.SelectionEvent -import org.eclipse.jdt.internal.debug.ui.launcher.SharedJavaMainTab -import org.eclipse.swt.graphics.Image -import org.eclipse.jdt.ui.JavaUI -import org.eclipse.jdt.ui.ISharedImages import org.eclipse.jdt.core.IJavaProject -import org.eclipse.jdt.core.IJavaElement +import org.eclipse.jdt.core.IType import org.eclipse.jdt.core.JavaCore -import org.eclipse.core.resources.ResourcesPlugin import org.eclipse.jdt.core.JavaModelException +import org.eclipse.jdt.internal.debug.ui.IJavaDebugHelpContextIds import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin -import org.eclipse.jdt.core.search.IJavaSearchScope -import org.eclipse.jdt.core.search.SearchEngine -import org.eclipse.jdt.internal.debug.ui.launcher.MainMethodSearchEngine -import org.eclipse.jdt.core.IType -import java.lang.reflect.InvocationTargetException import org.eclipse.jdt.internal.debug.ui.launcher.DebugTypeSelectionDialog -import org.eclipse.jface.window.Window -import org.eclipse.debug.core.ILaunchConfiguration -import org.eclipse.core.resources.IWorkspace -import org.eclipse.core.runtime.IStatus -import org.eclipse.core.resources.IResource -import com.ibm.icu.text.MessageFormat -import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy +import org.eclipse.jdt.internal.debug.ui.launcher.LauncherMessages +import org.eclipse.jdt.internal.debug.ui.launcher.SharedJavaMainTab import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants -import org.eclipse.core.runtime.CoreException -import org.scalaide.core.IScalaPlugin -import org.eclipse.core.runtime.IAdaptable -import org.scalaide.core.internal.jdt.model.ScalaSourceFile -import org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog -import org.eclipse.ui.dialogs.ResourceListSelectionDialog -import org.eclipse.core.resources.IFile -import org.eclipse.jdt.core.IPackageFragment -import org.eclipse.ui.dialogs.ElementListSelectionDialog +import org.eclipse.jdt.ui.ISharedImages +import org.eclipse.jdt.ui.JavaUI import org.eclipse.jface.viewers.LabelProvider -import org.eclipse.core.resources.IProject -import ScalaTestLaunchConstants._ -import org.eclipse.jface.viewers.TableViewer +import org.eclipse.jface.window.Window import org.eclipse.swt.SWT -import org.eclipse.swt.widgets.TableColumn -import org.eclipse.swt.widgets.Table -import org.eclipse.jface.viewers.TableViewerColumn -import org.eclipse.swt.widgets.TableItem import org.eclipse.swt.custom.TableEditor +import org.eclipse.swt.events.ModifyEvent +import org.eclipse.swt.events.ModifyListener import org.eclipse.swt.events.SelectionAdapter -import org.scalaide.core.IScalaProject +import org.eclipse.swt.events.SelectionEvent +import org.eclipse.swt.events.SelectionListener +import org.eclipse.swt.layout.GridData +import org.eclipse.swt.layout.GridLayout +import org.eclipse.swt.widgets.Button +import org.eclipse.swt.widgets.Composite +import org.eclipse.swt.widgets.Group +import org.eclipse.swt.widgets.Table +import org.eclipse.swt.widgets.TableColumn +import org.eclipse.swt.widgets.TableItem +import org.eclipse.swt.widgets.Text +import org.eclipse.ui.PlatformUI +import org.eclipse.ui.dialogs.ElementListSelectionDialog +import org.eclipse.ui.dialogs.ResourceListSelectionDialog +import org.scalaide.core.IScalaPlugin +import org.scalaide.core.internal.jdt.model.ScalaSourceFile + +import com.ibm.icu.text.MessageFormat + +import ScalaTestLaunchConstants._ class ScalaTestMainTab extends SharedJavaMainTab { // UI widgets @@ -106,11 +90,11 @@ class ScalaTestMainTab extends SharedJavaMainTab { private var fFileRadioButton: Button = null private var fPackageRadioButton: Button = null private var fIncludeNestedCheckBox: Button = null - + private var testNamesGroup: Group = null private var fTestNamesTable: Table = null private var fTestNamesEditor: TableEditor = null - + def createControl(parent: Composite) { val comp = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_BOTH) comp.getLayout.asInstanceOf[GridLayout].verticalSpacing = 0 @@ -120,36 +104,34 @@ class ScalaTestMainTab extends SharedJavaMainTab { setControl(comp) PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_MAIN_TAB) } - + private def updateUI() { if (fSuiteRadioButton.getSelection) { fIncludeNestedCheckBox.setVisible(false) testNamesGroup.setVisible(true) mainGroup.setText("Suite Class") - } - else if (fFileRadioButton.getSelection) { + } else if (fFileRadioButton.getSelection) { fIncludeNestedCheckBox.setVisible(false) testNamesGroup.setVisible(false) mainGroup.setText("Suite File") - } - else { + } else { fIncludeNestedCheckBox.setVisible(true) testNamesGroup.setVisible(false) mainGroup.setText("Package Name") } } - + val typeChangeListener = new SelectionListener() { override def widgetSelected(e: SelectionEvent) { updateUI fMainText.setText("") } - + override def widgetDefaultSelected(e: SelectionEvent) { updateUI } } - + override protected def createMainTypeEditor(parent: Composite, text: String) { val typeGroup = SWTFactory.createGroup(parent, "Type", 3, 1, GridData.FILL_HORIZONTAL) fSuiteRadioButton = SWTFactory.createRadioButton(typeGroup, "Suite") @@ -161,106 +143,106 @@ class ScalaTestMainTab extends SharedJavaMainTab { fPackageRadioButton = SWTFactory.createRadioButton(typeGroup, "Package") fPackageRadioButton.addSelectionListener(getDefaultListener) fPackageRadioButton.addSelectionListener(typeChangeListener) - - mainGroup = SWTFactory.createGroup(parent, text, 2, 1, GridData.FILL_HORIZONTAL); + + mainGroup = SWTFactory.createGroup(parent, text, 2, 1, GridData.FILL_HORIZONTAL); fMainText = SWTFactory.createSingleText(mainGroup, 1); fMainText.addModifyListener(new ModifyListener() { def modifyText(e: ModifyEvent) { updateLaunchConfigurationDialog() } }) - + fSearchButton = createPushButton(mainGroup, LauncherMessages.AbstractJavaMainTab_2, null) fSearchButton.addSelectionListener(new SelectionListener() { def widgetDefaultSelected(e: SelectionEvent) {} - def widgetSelected(e: SelectionEvent) { + def widgetSelected(e: SelectionEvent) { handleSearchButtonSelected(); } }) createMainTypeExtensions(mainGroup) - + testNamesGroup = SWTFactory.createGroup(parent, "Test Names", 2, 1, GridData.FILL_BOTH) createTestNamesTable(testNamesGroup) } - + override protected def createMainTypeExtensions(parent: Composite) { fIncludeNestedCheckBox = SWTFactory.createCheckButton(parent, "Include nested", null, false, 1) fIncludeNestedCheckBox.addSelectionListener(getDefaultListener) } - + protected def createTestNamesTable(parent: Composite) { fTestNamesTable = new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER) fTestNamesTable.setLayoutData(new GridData(GridData.FILL_BOTH)) - + val column1 = new TableColumn(fTestNamesTable, SWT.NONE) - column1.pack() - - fTestNamesEditor = new TableEditor(fTestNamesTable) - fTestNamesEditor.horizontalAlignment = SWT.LEFT - fTestNamesEditor.grabHorizontal = true - fTestNamesEditor.minimumWidth = 300 - - fTestNamesTable.addSelectionListener(new SelectionAdapter() { - override def widgetSelected(e: SelectionEvent) { - val oldEditor = fTestNamesEditor.getEditor - if (oldEditor != null) - oldEditor.dispose() - - val item = e.item.asInstanceOf[TableItem] - if (item == null) - return - - val newEditor = new Text(fTestNamesTable, SWT.NONE) - newEditor.setText(item.getText(0)) - newEditor.addModifyListener(new ModifyListener() { - override def modifyText(me: ModifyEvent) { - val text = fTestNamesEditor.getEditor.asInstanceOf[Text] - fTestNamesEditor.getItem.setText(0, text.getText) - updateLaunchConfigurationDialog() - } - }) - newEditor.selectAll() - newEditor.setFocus() - fTestNamesEditor.setEditor(newEditor, item, 0) - } - }) - - val comp = new Composite(parent, SWT.NONE) - val gridLayout = new GridLayout() - gridLayout.numColumns = 1 - comp.setLayout(gridLayout) - comp.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)) - - val addTestButton = createPushButton(comp, "Add", null) - addTestButton.addSelectionListener(new SelectionListener() { + column1.pack() + + fTestNamesEditor = new TableEditor(fTestNamesTable) + fTestNamesEditor.horizontalAlignment = SWT.LEFT + fTestNamesEditor.grabHorizontal = true + fTestNamesEditor.minimumWidth = 300 + + fTestNamesTable.addSelectionListener(new SelectionAdapter() { + override def widgetSelected(e: SelectionEvent) { + val oldEditor = fTestNamesEditor.getEditor + if (oldEditor != null) + oldEditor.dispose() + + val item = e.item.asInstanceOf[TableItem] + if (item == null) + return + + val newEditor = new Text(fTestNamesTable, SWT.NONE) + newEditor.setText(item.getText(0)) + newEditor.addModifyListener(new ModifyListener() { + override def modifyText(me: ModifyEvent) { + val text = fTestNamesEditor.getEditor.asInstanceOf[Text] + fTestNamesEditor.getItem.setText(0, text.getText) + updateLaunchConfigurationDialog() + } + }) + newEditor.selectAll() + newEditor.setFocus() + fTestNamesEditor.setEditor(newEditor, item, 0) + } + }) + + val comp = new Composite(parent, SWT.NONE) + val gridLayout = new GridLayout() + gridLayout.numColumns = 1 + comp.setLayout(gridLayout) + comp.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)) + + val addTestButton = createPushButton(comp, "Add", null) + addTestButton.addSelectionListener(new SelectionListener() { def widgetDefaultSelected(e: SelectionEvent) { widgetSelected(e) } - def widgetSelected(e: SelectionEvent) { + def widgetSelected(e: SelectionEvent) { val item = new TableItem(fTestNamesTable, SWT.NONE) item.setText(Array[String]("[enter test name]")) updateLaunchConfigurationDialog() } }) - - val removeTestButton = createPushButton(comp, "Remove", null) - removeTestButton.addSelectionListener(new SelectionListener() { - def widgetDefaultSelected(e: SelectionEvent) { widgetSelected(e) } - def widgetSelected(e: SelectionEvent) { - val editor = fTestNamesEditor.getEditor - if (editor != null) - editor.dispose() - fTestNamesTable.remove(fTestNamesTable.getSelectionIndices()) - fTestNamesTable.update() - updateLaunchConfigurationDialog() - } - }) + + val removeTestButton = createPushButton(comp, "Remove", null) + removeTestButton.addSelectionListener(new SelectionListener() { + def widgetDefaultSelected(e: SelectionEvent) { widgetSelected(e) } + def widgetSelected(e: SelectionEvent) { + val editor = fTestNamesEditor.getEditor + if (editor != null) + editor.dispose() + fTestNamesTable.remove(fTestNamesTable.getSelectionIndices()) + fTestNamesTable.update() + updateLaunchConfigurationDialog() + } + }) } - + override def getImage = JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_CLASS); - + def getName = LauncherMessages.JavaMainTab__Main_19 - + override def getId = "scala.tools.eclipse.launching.scalaTestMainTab"; //$NON-NLS-1$ - + protected def handleSearchButtonSelected() { val project = getJavaProject() var projects: Array[IJavaProject] = null @@ -268,78 +250,80 @@ class ScalaTestMainTab extends SharedJavaMainTab { val model = JavaCore.create(ResourcesPlugin.getWorkspace.getRoot) if (model != null) { try { - projects = model.getJavaProjects.filter {jp: IJavaProject => IScalaPlugin().getScalaProject(jp.getProject()).hasScalaNature } - } - catch { case e: JavaModelException => JDIDebugUIPlugin.log(e) } + projects = model.getJavaProjects.filter { jp: IJavaProject => IScalaPlugin().getScalaProject(jp.getProject()).hasScalaNature } + } catch { case e: JavaModelException => JDIDebugUIPlugin.log(e) } } - } - else { + } else { projects = Array(project) } if (projects == null) { projects = Array.empty } - + if (fSuiteRadioButton.getSelection) { - val types: Array[IType] = + val types: Array[IType] = projects.flatMap { proj => - for (file <- IScalaPlugin().getScalaProject(proj.getProject).allSourceFiles; - val ssf = ScalaSourceFile.createFromPath(file.getFullPath.toString); + for ( + file <- IScalaPlugin().getScalaProject(proj.getProject).allSourceFiles; + val ssf = ScalaSourceFile.createFromPath(file.getFullPath.toString); if ssf.isDefined; iType <- ssf.get.getAllTypes; - if ScalaTestLaunchShortcut.isScalaTestSuite(iType)) yield iType + if ScalaTestLaunchShortcut.isScalaTestSuite(iType) + ) yield iType } - - val mmsd = new DebugTypeSelectionDialog(getShell(), types, LauncherMessages.JavaMainTab_Choose_Main_Type_11) - mmsd.setTitle("ScalaTest Suite Selection") - if (mmsd.open() == Window.CANCEL) - return - - val results = mmsd.getResult + + val mmsd = new DebugTypeSelectionDialog(getShell(), types, LauncherMessages.JavaMainTab_Choose_Main_Type_11) + mmsd.setTitle("ScalaTest Suite Selection") + if (mmsd.open() == Window.CANCEL) + return + + val results = mmsd.getResult val selectedType = results(0).asInstanceOf[IType] if (selectedType != null) { fMainText.setText(selectedType.getFullyQualifiedName()) fProjText.setText(selectedType.getJavaProject().getElementName) } - } - else if (fFileRadioButton.getSelection) { - val files = + } else if (fFileRadioButton.getSelection) { + val files = projects.flatMap { proj => - for (file <- IScalaPlugin().getScalaProject(proj.getProject).allSourceFiles; - val ssf = ScalaSourceFile.createFromPath(file.getFullPath.toString); - if ssf.isDefined && ScalaTestLaunchShortcut.containsScalaTestSuite(ssf.get)) yield file.asInstanceOf[IResource] + for ( + file <- IScalaPlugin().getScalaProject(proj.getProject).allSourceFiles; + val ssf = ScalaSourceFile.createFromPath(file.getFullPath.toString); + if ssf.isDefined && ScalaTestLaunchShortcut.containsScalaTestSuite(ssf.get) + ) yield file.asInstanceOf[IResource] } - + val fileSelectionDialog = new ResourceListSelectionDialog(getShell, files) fileSelectionDialog.setTitle("Scala Source File Selection") - if (fileSelectionDialog.open() == Window.CANCEL) + if (fileSelectionDialog.open() == Window.CANCEL) return - + val results = fileSelectionDialog.getResult val selectedFile = results(0).asInstanceOf[IFile] if (selectedFile != null) { fMainText.setText(selectedFile.getFullPath.toPortableString) fProjText.setText(selectedFile.getProject.getName) } - } - else if (fPackageRadioButton.getSelection) { + } else if (fPackageRadioButton.getSelection) { case class PackageOption(name: String, project: IJavaProject) - val packageSet = + val packageSet = projects.flatMap { proj => - for (file <- IScalaPlugin().getScalaProject(proj.getProject).allSourceFiles; - val ssf = ScalaSourceFile.createFromPath(file.getFullPath.toString); + for ( + file <- IScalaPlugin().getScalaProject(proj.getProject).allSourceFiles; + val ssf = ScalaSourceFile.createFromPath(file.getFullPath.toString); if ssf.isDefined; iType <- ssf.get.getAllTypes; - if ScalaTestLaunchShortcut.isScalaTestSuite(iType)) yield PackageOption(iType.getPackageFragment.getElementName, iType.getJavaProject) - }.toSet - + if ScalaTestLaunchShortcut.isScalaTestSuite(iType) + ) yield PackageOption(iType.getPackageFragment.getElementName, iType.getJavaProject) + }.toSet + val packageSelectionDialog = new ElementListSelectionDialog(getShell, new LabelProvider() { override def getText(element: Any) = element.asInstanceOf[PackageOption].name }) packageSelectionDialog.setTitle("Package Selection") packageSelectionDialog.setMessage("Select a String (* = any string, ? = any char):") packageSelectionDialog.setElements(packageSet.toArray) if (packageSelectionDialog.open() == Window.CANCEL) return - + val results = packageSelectionDialog.getResult val selectedPackageOption = results(0).asInstanceOf[PackageOption] if (selectedPackageOption != null) { @@ -348,25 +332,25 @@ class ScalaTestMainTab extends SharedJavaMainTab { } } } - + override def initializeFrom(config: ILaunchConfiguration) { super.initializeFrom(config) updateMainTypeFromConfig(config) } - + override protected def updateMainTypeFromConfig(config: ILaunchConfiguration) { super.updateMainTypeFromConfig(config) val launchType = config.getAttribute(SCALATEST_LAUNCH_TYPE_NAME, TYPE_SUITE) launchType match { - case TYPE_SUITE => + case TYPE_SUITE => fSuiteRadioButton.setSelection(true) fFileRadioButton.setSelection(false) fPackageRadioButton.setSelection(false) - case TYPE_FILE => + case TYPE_FILE => fSuiteRadioButton.setSelection(false) fFileRadioButton.setSelection(true) fPackageRadioButton.setSelection(false) - case TYPE_PACKAGE => + case TYPE_PACKAGE => fSuiteRadioButton.setSelection(false) fFileRadioButton.setSelection(false) fPackageRadioButton.setSelection(true) @@ -376,7 +360,7 @@ class ScalaTestMainTab extends SharedJavaMainTab { fIncludeNestedCheckBox.setSelection(true) else fIncludeNestedCheckBox.setSelection(false) - + fTestNamesTable.removeAll() val rawTestSet = config.getAttributes.get(SCALATEST_LAUNCH_TESTS_NAME) val testSet: java.util.HashSet[String] = if (rawTestSet != null) rawTestSet.asInstanceOf[java.util.HashSet[String]] else new java.util.HashSet[String]() @@ -385,10 +369,10 @@ class ScalaTestMainTab extends SharedJavaMainTab { val item = new TableItem(fTestNamesTable, SWT.NONE) item.setText(Array[String](testItr.next)) } - + updateUI() } - + override def isValid(config: ILaunchConfiguration): Boolean = { setErrorMessage(null) setMessage(null) @@ -397,18 +381,17 @@ class ScalaTestMainTab extends SharedJavaMainTab { val workspace = ResourcesPlugin.getWorkspace val status = workspace.validateName(name, IResource.PROJECT) if (status.isOK) { - val project= ResourcesPlugin.getWorkspace.getRoot.getProject(name) + val project = ResourcesPlugin.getWorkspace.getRoot.getProject(name) if (!project.exists()) { setErrorMessage(MessageFormat.format(LauncherMessages.JavaMainTab_20, Array(name))) return false } - if (!project.isOpen) { - setErrorMessage(MessageFormat.format(LauncherMessages.JavaMainTab_21, Array(name))) + if (!project.isOpen) { + setErrorMessage(MessageFormat.format(LauncherMessages.JavaMainTab_21, Array(name))) return false } - } - else { - setErrorMessage(MessageFormat.format(LauncherMessages.JavaMainTab_19, Array(status.getMessage()))) + } else { + setErrorMessage(MessageFormat.format(LauncherMessages.JavaMainTab_19, Array(status.getMessage()))) return false } } @@ -418,43 +401,41 @@ class ScalaTestMainTab extends SharedJavaMainTab { setErrorMessage("Suite Class cannot be empty.") else if (fFileRadioButton.getSelection) setErrorMessage("Suite File cannot be empty.") - else + else setErrorMessage("Package Name cannot be empty.") return false } return true } - + def performApply(config: ILaunchConfigurationWorkingCopy) { - val launchType = + val launchType = if (fSuiteRadioButton.getSelection) TYPE_SUITE else if (fFileRadioButton.getSelection) TYPE_FILE else - TYPE_PACKAGE + TYPE_PACKAGE val includeNested = if (fIncludeNestedCheckBox.getSelection) INCLUDE_NESTED_TRUE else INCLUDE_NESTED_FALSE - + val testNameSet = new java.util.HashSet[String]() val items = fTestNamesTable.getItems items.foreach(i => testNameSet.add(i.getText(0))) - - val configMap = new java.util.HashMap[String, Any]() - configMap.put(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, fProjText.getText.trim) - configMap.put(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, fMainText.getText.trim) - configMap.put(SCALATEST_LAUNCH_TYPE_NAME, launchType) - configMap.put(SCALATEST_LAUNCH_INCLUDE_NESTED_NAME, includeNested) - configMap.put(SCALATEST_LAUNCH_TESTS_NAME, testNameSet) - - config.setAttributes(configMap) + + config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, fProjText.getText.trim) + config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, fMainText.getText.trim) + config.setAttribute(SCALATEST_LAUNCH_TYPE_NAME, launchType) + config.setAttribute(SCALATEST_LAUNCH_INCLUDE_NESTED_NAME, includeNested) + config.setAttribute(SCALATEST_LAUNCH_TESTS_NAME, testNameSet) + mapResources(config) } - + def setDefaults(config: ILaunchConfigurationWorkingCopy) { val javaElement = getContext - if (javaElement != null) + if (javaElement != null) initializeJavaProject(javaElement, config) - else + else config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, "") initializeMainTypeAndName(javaElement, config) config.setAttribute(SCALATEST_LAUNCH_TYPE_NAME, TYPE_SUITE) diff --git a/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/launching/ScalaTestScalaLaunchDelegate.scala b/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/launching/ScalaTestScalaLaunchDelegate.scala new file mode 100644 index 0000000..acd261f --- /dev/null +++ b/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/launching/ScalaTestScalaLaunchDelegate.scala @@ -0,0 +1,7 @@ +package scala.tools.eclipse.scalatest.launching + +import org.scalaide.debug.internal.launching.ScalaDebuggerForLaunchDelegate + +class ScalaTestScalaLaunchDelegate extends ScalaTestLaunchDelegate with ScalaDebuggerForLaunchDelegate { + override protected def addToVmRunnerClasspath(classpath: Seq[String]): Array[String] = classpath.toArray +} \ No newline at end of file diff --git a/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/ui/ScalaTestRunnerViewPart.scala b/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/ui/ScalaTestRunnerViewPart.scala index f63fe97..a61882a 100644 --- a/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/ui/ScalaTestRunnerViewPart.scala +++ b/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/ui/ScalaTestRunnerViewPart.scala @@ -917,7 +917,8 @@ class ScalaTestRunnerViewPart extends ViewPart with Observer { override def run() { val launch = session.fLaunch val delegate = new ScalaTestLaunchDelegate() - val stArgs = delegate.getScalaTestArgsForFailedTests(session.rootNode) + import ScalaTestLaunchDelegate._ + val stArgs = getScalaTestArgsForFailedTests(session.rootNode) val buildBeforeLaunch = DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugUIConstants.PREF_BUILD_BEFORE_LAUNCH) if (buildBeforeLaunch) ScalaTestPlugin.doBuild() diff --git a/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/ui/ScalaTestViewer.scala b/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/ui/ScalaTestViewer.scala index 15f40c1..ff53e9f 100644 --- a/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/ui/ScalaTestViewer.scala +++ b/org.scala-ide.sdt.scalatest/src/scala/tools/eclipse/scalatest/ui/ScalaTestViewer.scala @@ -736,7 +736,7 @@ private class RerunSuiteAction(actionName: String, fTestRunnerPart: ScalaTestRun suiteId: String) extends Action(actionName) { override def run() { val delegate = new ScalaTestLaunchDelegate() - val stArgs = delegate.getScalaTestArgsForSuite(suiteClassName, suiteId) + val stArgs = ScalaTestLaunchDelegate.getScalaTestArgsForSuite(suiteClassName, suiteId) rerun(fTestRunnerPart, delegate, stArgs) } } @@ -745,7 +745,7 @@ private class RerunTestAction(actionName: String, fTestRunnerPart: ScalaTestRunn suiteId: String, testName: String) extends Action(actionName) { override def run() { val delegate = new ScalaTestLaunchDelegate() - val stArgs = delegate.getScalaTestArgsForTest(suiteClassName, suiteId, testName) + val stArgs = ScalaTestLaunchDelegate.getScalaTestArgsForTest(suiteClassName, suiteId, testName) rerun(fTestRunnerPart, delegate, stArgs) } }