1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
/*
* 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 ResultTest {
class CustomException(message: String) : Exception(message) {
override fun toString(): String = "CustomException: $message"
}
fun error(message: String): Nothing = throw CustomException(message)
@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 = Result.success("OK")
checkSuccess(ok, "OK", true)
}
@Test
fun testConstructedFailure() {
val fail = Result.failure<Unit>(CustomException("F"))
checkFailure(fail, "F", true)
}
private fun <T> checkSuccess(ok: Result<T>, 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.getOrDefault("DEF"))
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("Success($v)", 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 <T> checkFailure(fail: Result<T>, 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("DEF", fail.getOrDefault("DEF"))
assertEquals("EX:CustomException: $msg", fail.getOrElse { "EX:$it" })
assertEquals("EX:CustomException: $msg", fail.fold({ "V:$it" }, { "EX:$it" }))
assertEquals(msg, fail.exceptionOrNull()!!.message)
assertEquals(msg, fail.fold(onSuccess = { null }, onFailure = { it })!!.message)
assertEquals("Failure(CustomException: $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)
}
}
|