diff --git a/libraries/stdlib/coroutines/jvm/test/SuccessOrFailureTest.kt b/libraries/stdlib/coroutines/jvm/test/SuccessOrFailureTest.kt new file mode 100644 index 00000000000..efe59412c38 --- /dev/null +++ b/libraries/stdlib/coroutines/jvm/test/SuccessOrFailureTest.kt @@ -0,0 +1,92 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package test.kotlin + +import kotlin.test.* + +class SuccessOrFailureTest { + @Test + fun testRunCatchingSuccess() { + val ok = runCatching { "OK" } + checkSuccess(ok, "OK", true) + } + + @Test + fun testRunCatchingFailure() { + val fail = runCatching { error("F") } + checkFailure(fail, "F", true) + } + + @Test + fun testConstructedSuccess() { + val ok = SuccessOrFailure.success("OK") + checkSuccess(ok, "OK", true) + } + + @Test + fun testConstructedFailure() { + val fail = SuccessOrFailure.failure(IllegalStateException("F")) + checkFailure(fail, "F", true) + } + + private fun checkSuccess(ok: SuccessOrFailure, v: T, topLevel: Boolean = false) { + assertTrue(ok.isSuccess) + assertFalse(ok.isFailure) + assertEquals(v, ok.getOrThrow()) + assertEquals(v, ok.getOrElse { throw it }) + assertEquals(v, ok.getOrNull()) + assertEquals(v, ok.getOrElse { null }) + assertEquals(v, ok.getOrElse { "EX:$it" }) + assertEquals("V:$v", ok.fold({ "V:$it" }, { "EX:$it" })) + assertEquals(null, ok.exceptionOrNull()) + assertEquals(null, ok.fold(onSuccess = { null }, onFailure = { it })) + assertEquals(v.toString(), ok.toString()) + assertEquals(ok, ok) + if (topLevel) { + checkSuccess(ok.map { 42 }, 42) + checkSuccess(ok.mapCatching { 42 }, 42) + checkFailure(ok.mapCatching { error("FAIL") }, "FAIL") + checkSuccess(ok.recover { 42 }, "OK") + checkSuccess(ok.recoverCatching { 42 }, "OK") + checkSuccess(ok.recoverCatching { error("FAIL") }, "OK") + } + var sCnt = 0 + var fCnt = 0 + assertEquals(ok, ok.onSuccess { sCnt++ }) + assertEquals(ok, ok.onFailure { fCnt++ }) + assertEquals(1, sCnt) + assertEquals(0, fCnt) + } + + private fun checkFailure(fail: SuccessOrFailure, msg: String, topLevel: Boolean = false) { + assertFalse(fail.isSuccess) + assertTrue(fail.isFailure) + assertFails { fail.getOrThrow() } + assertFails { fail.getOrElse { throw it } } + assertEquals(null, fail.getOrNull()) + assertEquals(null, fail.getOrElse { null }) + assertEquals("EX:java.lang.IllegalStateException: $msg", fail.getOrElse { "EX:$it" }) + assertEquals("EX:java.lang.IllegalStateException: $msg", fail.fold({ "V:$it" }, { "EX:$it" })) + assertEquals(msg, fail.exceptionOrNull()!!.message) + assertEquals(msg, fail.fold(onSuccess = { null }, onFailure = { it })!!.message) + assertEquals("Failure(java.lang.IllegalStateException: $msg)", fail.toString()) + assertEquals(fail, fail) + if (topLevel) { + checkFailure(fail.map { 42 }, msg) + checkFailure(fail.mapCatching { 42 }, msg) + checkFailure(fail.mapCatching { error("FAIL") }, msg) + checkSuccess(fail.recover { 42 }, 42) + checkSuccess(fail.recoverCatching { 42 }, 42) + checkFailure(fail.recoverCatching { error("FAIL") }, "FAIL") + } + var sCnt = 0 + var fCnt = 0 + assertEquals(fail, fail.onSuccess { sCnt++ }) + assertEquals(fail, fail.onFailure { fCnt++ }) + assertEquals(0, sCnt) + assertEquals(1, fCnt) + } +} \ No newline at end of file diff --git a/libraries/stdlib/jvm/build.gradle b/libraries/stdlib/jvm/build.gradle index 2f13c716086..8569c03a704 100644 --- a/libraries/stdlib/jvm/build.gradle +++ b/libraries/stdlib/jvm/build.gradle @@ -41,7 +41,11 @@ sourceSets { kotlin { srcDir '../coroutines/jvm/src' } - compileClasspath += sourceSets.main.output + } + coroutinesTest { + kotlin { + srcDir '../coroutines/jvm/test' + } } test { kotlin { @@ -70,6 +74,11 @@ dependencies { testCompile project(':kotlin-test:kotlin-test-junit') + coroutinesCompile sourceSets.main.output + + coroutinesTestCompile sourceSets.coroutines.output + coroutinesTestCompile project(':kotlin-test:kotlin-test-junit') + unsignedCompile sourceSets.main.output } @@ -207,6 +216,26 @@ compileCoroutinesKotlin { } } +compileCoroutinesTestKotlin { + kotlinOptions { + languageVersion = "1.3" + apiVersion = "1.3" + freeCompilerArgs = [ + "-version", + "-Xallow-kotlin-package", + "-Xmultifile-parts-inherit", + "-module-name", "kotlin-stdlib-coroutines" + ] + } +} + +task coroutinesTest(type: Test, dependsOn: coroutinesTestClasses) { + testClassesDirs = sourceSets.coroutinesTest.output.classesDirs + classpath = sourceSets.coroutinesTest.runtimeClasspath +} + +test.dependsOn coroutinesTest + compileUnsignedKotlin { kotlinOptions { languageVersion = "1.3"