/* * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ @file:Suppress("unused") package kotlinx.coroutines import kotlinx.coroutines.flow.* import kotlin.coroutines.* import kotlin.test.* public expect val isStressTest: Boolean public expect val stressTestMultiplier: Int public expect open class TestBase constructor() { public fun error(message: Any, cause: Throwable? = null): Nothing public fun expect(index: Int) public fun expectUnreached() public fun finish(index: Int) public fun ensureFinished() // Ensures that 'finish' was invoked public fun reset() // Resets counter and finish flag. Workaround for parametrized tests absence in common public fun runTest( expected: ((Throwable) -> Boolean)? = null, unhandled: List<(Throwable) -> Boolean> = emptyList(), block: suspend CoroutineScope.() -> Unit ) } public suspend inline fun hang(onCancellation: () -> Unit) { try { suspendCancellableCoroutine { } } finally { onCancellation() } } public inline fun assertFailsWith(block: () -> Unit) { try { block() error("Should not be reached") } catch (e: Throwable) { assertTrue(e is T) } } public suspend inline fun assertFailsWith(flow: Flow<*>) { try { flow.collect() fail("Should be unreached") } catch (e: Throwable) { assertTrue(e is T, "Expected exception ${T::class}, but had $e instead") } } public suspend fun Flow.sum() = fold(0) { acc, value -> acc + value } public suspend fun Flow.longSum() = fold(0L) { acc, value -> acc + value } // data is added to avoid stacktrace recovery because CopyableThrowable is not accessible from common modules public class TestException(message: String? = null, private val data: Any? = null) : Throwable(message) public class TestException1(message: String? = null, private val data: Any? = null) : Throwable(message) public class TestException2(message: String? = null, private val data: Any? = null) : Throwable(message) public class TestException3(message: String? = null, private val data: Any? = null) : Throwable(message) public class TestCancellationException(message: String? = null, private val data: Any? = null) : CancellationException(message) public class TestRuntimeException(message: String? = null, private val data: Any? = null) : RuntimeException(message) public class RecoverableTestException(message: String? = null) : RuntimeException(message) public class RecoverableTestCancellationException(message: String? = null) : CancellationException(message) public fun wrapperDispatcher(context: CoroutineContext): CoroutineContext { val dispatcher = context[ContinuationInterceptor] as CoroutineDispatcher return object : CoroutineDispatcher() { override fun isDispatchNeeded(context: CoroutineContext): Boolean = dispatcher.isDispatchNeeded(context) override fun dispatch(context: CoroutineContext, block: Runnable) = dispatcher.dispatch(context, block) } } public suspend fun wrapperDispatcher(): CoroutineContext = wrapperDispatcher(coroutineContext) class BadClass { override fun equals(other: Any?): Boolean = error("equals") override fun hashCode(): Int = error("hashCode") override fun toString(): String = error("toString") }