diff --git a/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsTest.kt b/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsTest.kt index 3738aa3a8a1..5c0e8f70610 100644 --- a/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsTest.kt +++ b/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsTest.kt @@ -37,11 +37,7 @@ class MainKtsTest { @Test fun testResolveJunit() { val res = evalFile(File("testData/hello-resolve-junit.main.kts")) - - Assert.assertTrue( - "test failed:\n ${res.reports.joinToString("\n ") { it.message + if (it.exception == null) "" else ": ${it.exception}" }}", - res is ResultWithDiagnostics.Success - ) + assertSucceeded(res) } // @Test @@ -51,44 +47,34 @@ class MainKtsTest { // TODO: 2. implement proper handling of pom-typed dependencies (e.g. consider to reimplement it on aether as in JarRepositoryManager (from IDEA)) fun testResolveWithArtifactType() { val res = evalFile(File("testData/resolve-moneta.main.kts")) - - Assert.assertTrue( - "test failed:\n ${res.reports.joinToString("\n ") { it.message + if (it.exception == null) "" else ": ${it.exception}" }}", - res is ResultWithDiagnostics.Success - ) + assertSucceeded(res) } + @Test + fun testResolveJunitDynamicVer() { + val errRes = evalFile(File("testData/hello-resolve-junit-dynver-error.main.kts")) + assertFailed("Unresolved reference: assertThrows", errRes) + + val res = evalFile(File("testData/hello-resolve-junit-dynver.main.kts")) + assertSucceeded(res) + } @Test fun testUnresolvedJunit() { val res = evalFile(File("testData/hello-unresolved-junit.main.kts")) - - Assert.assertTrue( - "test failed - expecting a failure with the message \"Unresolved reference: junit\" but received " + - (if (res is ResultWithDiagnostics.Failure) "failure" else "success") + - ":\n ${res.reports.joinToString("\n ") { it.message + if (it.exception == null) "" else ": ${it.exception}" }}", - res is ResultWithDiagnostics.Failure && res.reports.any { it.message.contains("Unresolved reference: junit") }) + assertFailed("Unresolved reference: junit", res) } @Test fun testResolveError() { val res = evalFile(File("testData/hello-resolve-error.main.kts")) - - Assert.assertTrue( - "test failed - expecting a failure with the message \"Unrecognized set of arguments to maven resolver: abracadabra\" but received " + - (if (res is ResultWithDiagnostics.Failure) "failure" else "success") + - ":\n ${res.reports.joinToString("\n ") { it.message + if (it.exception == null) "" else ": ${it.exception}" }}", - res is ResultWithDiagnostics.Failure && res.reports.any { it.message.contains("Unrecognized set of arguments to ivy resolver: abracadabra") }) + assertFailed("Unrecognized set of arguments to ivy resolver: abracadabra", res) } @Test fun testResolveLog4jAndDocopt() { val res = evalFile(File("testData/resolve-log4j-and-docopt.main.kts")) - - Assert.assertTrue( - "test failed:\n ${res.reports.joinToString("\n ") { it.message + if (it.exception == null) "" else ": ${it.exception}" }}", - res is ResultWithDiagnostics.Success - ) + assertSucceeded(res) } @Test @@ -96,15 +82,27 @@ class MainKtsTest { val out = captureOut { val res = evalFile(File("testData/import-test.main.kts")) - - Assert.assertTrue( - "test failed:\n ${res.reports.joinToString("\n ") { it.message + if (it.exception == null) "" else ": ${it.exception}" }}", - res is ResultWithDiagnostics.Success - ) + assertSucceeded(res) }.lines() Assert.assertEquals(listOf("Hi from common", "Hi from middle", "sharedVar == 5"), out) } + + private fun assertSucceeded(res: ResultWithDiagnostics) { + Assert.assertTrue( + "test failed:\n ${res.reports.joinToString("\n ") { it.message + if (it.exception == null) "" else ": ${it.exception}" }}", + res is ResultWithDiagnostics.Success + ) + } + + private fun assertFailed(expectedError: String, res: ResultWithDiagnostics) { + Assert.assertTrue( + "test failed - expecting a failure with the message \"$expectedError\" but received " + + (if (res is ResultWithDiagnostics.Failure) "failure" else "success") + + ":\n ${res.reports.joinToString("\n ") { it.message + if (it.exception == null) "" else ": ${it.exception}" }}", + res is ResultWithDiagnostics.Failure && res.reports.any { it.message.contains("$expectedError") } + ) + } } private fun captureOut(body: () -> Unit): String { diff --git a/libraries/tools/kotlin-main-kts-test/testData/hello-resolve-junit-dynver-error.main.kts b/libraries/tools/kotlin-main-kts-test/testData/hello-resolve-junit-dynver-error.main.kts new file mode 100644 index 00000000000..0fbad0f3387 --- /dev/null +++ b/libraries/tools/kotlin-main-kts-test/testData/hello-resolve-junit-dynver-error.main.kts @@ -0,0 +1,9 @@ + +@file:DependsOn("junit:junit:(4.11,4.12]") + +org.junit.Assert.assertThrows(NullPointerException::class.java) { + throw null!! +} + +println("Hello, World!") + diff --git a/libraries/tools/kotlin-main-kts-test/testData/hello-resolve-junit-dynver.main.kts b/libraries/tools/kotlin-main-kts-test/testData/hello-resolve-junit-dynver.main.kts new file mode 100644 index 00000000000..88935a77309 --- /dev/null +++ b/libraries/tools/kotlin-main-kts-test/testData/hello-resolve-junit-dynver.main.kts @@ -0,0 +1,9 @@ + +@file:DependsOn("junit:junit:(4.12,5.0)") + +org.junit.Assert.assertThrows(NullPointerException::class.java) { + throw null!! +} + +println("Hello, World!") + diff --git a/libraries/tools/kotlin-script-util/src/test/kotlin/org/jetbrains/kotlin/script/util/ScriptUtilIT.kt b/libraries/tools/kotlin-script-util/src/test/kotlin/org/jetbrains/kotlin/script/util/ScriptUtilIT.kt index 652a2c5d5cc..1ba8cd97936 100644 --- a/libraries/tools/kotlin-script-util/src/test/kotlin/org/jetbrains/kotlin/script/util/ScriptUtilIT.kt +++ b/libraries/tools/kotlin-script-util/src/test/kotlin/org/jetbrains/kotlin/script/util/ScriptUtilIT.kt @@ -107,6 +107,17 @@ done } } + @Test + fun testResolveStdJUnitDynVer() { + val (_, err) = captureOutAndErr { + Assert.assertNull(compileScript("args-junit-dynver-error.kts", StandardArgsScriptTemplateWithMavenResolving::class)) + } + Assert.assertTrue("Expecting error: unresolved reference: assertThrows", err.contains("error: unresolved reference: assertThrows")) + + val scriptClass = compileScript("args-junit-dynver.kts", StandardArgsScriptTemplateWithMavenResolving::class) + Assert.assertNotNull(scriptClass) + } + private fun compileScript( scriptFileName: String, scriptTemplate: KClass, @@ -170,18 +181,24 @@ done private fun String.linesSplitTrim() = split('\n','\r').map(String::trim).filter(String::isNotBlank) - private fun captureOut(body: () -> Unit): String { + private fun captureOut(body: () -> Unit): String = captureOutAndErr(body).first + + private fun captureOutAndErr(body: () -> Unit): Pair { val outStream = ByteArrayOutputStream() + val errStream = ByteArrayOutputStream() val prevOut = System.out + val prevErr = System.err System.setOut(PrintStream(outStream)) + System.setErr(PrintStream(errStream)) try { body() - } - finally { + } finally { System.out.flush() + System.err.flush() System.setOut(prevOut) + System.setErr(prevErr) } - return outStream.toString() + return outStream.toString() to errStream.toString() } } diff --git a/libraries/tools/kotlin-script-util/src/test/resources/scripts/args-junit-dynver-error.kts b/libraries/tools/kotlin-script-util/src/test/resources/scripts/args-junit-dynver-error.kts new file mode 100644 index 00000000000..1ec699be1f7 --- /dev/null +++ b/libraries/tools/kotlin-script-util/src/test/resources/scripts/args-junit-dynver-error.kts @@ -0,0 +1,9 @@ + +@file:DependsOn("junit:junit:(4.11,4.12]") + +org.junit.Assert.assertThrows(NullPointerException::class.java) { + throw null!! +} + +println("Hello, world!") + diff --git a/libraries/tools/kotlin-script-util/src/test/resources/scripts/args-junit-dynver.kts b/libraries/tools/kotlin-script-util/src/test/resources/scripts/args-junit-dynver.kts new file mode 100644 index 00000000000..e176b8b1cc0 --- /dev/null +++ b/libraries/tools/kotlin-script-util/src/test/resources/scripts/args-junit-dynver.kts @@ -0,0 +1,9 @@ + +@file:DependsOn("junit:junit:(4.12,5.0)") + +org.junit.Assert.assertThrows(NullPointerException::class.java) { + throw null!! +} + +println("Hello, world!") +