| /* |
| * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. |
| */ |
| |
| @file:Suppress("NAMED_ARGUMENTS_NOT_ALLOWED") // KT-21913 |
| |
| package kotlinx.coroutines |
| |
| import kotlin.test.* |
| |
| /** |
| * Tests that the transitions to the state of the [Job] correspond to documentation in the |
| * table that is presented in the [Job] documentation. |
| */ |
| class JobStatesTest : TestBase() { |
| @Test |
| public fun testNormalCompletion() = runTest { |
| expect(1) |
| val job = launch(start = CoroutineStart.LAZY) { |
| expect(2) |
| // launches child |
| launch { |
| expect(4) |
| } |
| // completes normally |
| } |
| // New job |
| assertFalse(job.isActive) |
| assertFalse(job.isCompleted) |
| assertFalse(job.isCancelled) |
| // New -> Active |
| job.start() |
| assertTrue(job.isActive) |
| assertFalse(job.isCompleted) |
| assertFalse(job.isCancelled) |
| // Active -> Completing |
| yield() // scheduled & starts child |
| expect(3) |
| assertTrue(job.isActive) |
| assertFalse(job.isCompleted) |
| assertFalse(job.isCancelled) |
| // Completing -> Completed |
| yield() |
| finish(5) |
| assertFalse(job.isActive) |
| assertTrue(job.isCompleted) |
| assertFalse(job.isCancelled) |
| } |
| |
| @Test |
| public fun testCompletingFailed() = runTest( |
| unhandled = listOf({ it -> it is TestException }) |
| ) { |
| expect(1) |
| val job = launch(NonCancellable, start = CoroutineStart.LAZY) { |
| expect(2) |
| // launches child |
| launch { |
| expect(4) |
| throw TestException() |
| } |
| // completes normally |
| } |
| // New job |
| assertFalse(job.isActive) |
| assertFalse(job.isCompleted) |
| assertFalse(job.isCancelled) |
| // New -> Active |
| job.start() |
| assertTrue(job.isActive) |
| assertFalse(job.isCompleted) |
| assertFalse(job.isCancelled) |
| // Active -> Completing |
| yield() // scheduled & starts child |
| expect(3) |
| assertTrue(job.isActive) |
| assertFalse(job.isCompleted) |
| assertFalse(job.isCancelled) |
| // Completing -> Cancelled |
| yield() |
| finish(5) |
| assertFalse(job.isActive) |
| assertTrue(job.isCompleted) |
| assertTrue(job.isCancelled) |
| } |
| |
| @Test |
| public fun testFailed() = runTest( |
| unhandled = listOf({ it -> it is TestException }) |
| ) { |
| expect(1) |
| val job = launch(NonCancellable, start = CoroutineStart.LAZY) { |
| expect(2) |
| // launches child |
| launch(start = CoroutineStart.ATOMIC) { |
| expect(4) |
| } |
| // failing |
| throw TestException() |
| } |
| // New job |
| assertFalse(job.isActive) |
| assertFalse(job.isCompleted) |
| assertFalse(job.isCancelled) |
| // New -> Active |
| job.start() |
| assertTrue(job.isActive) |
| assertFalse(job.isCompleted) |
| assertFalse(job.isCancelled) |
| // Active -> Cancelling |
| yield() // scheduled & starts child |
| expect(3) |
| assertFalse(job.isActive) |
| assertFalse(job.isCompleted) |
| assertTrue(job.isCancelled) |
| // Cancelling -> Cancelled |
| yield() |
| finish(5) |
| assertFalse(job.isActive) |
| assertTrue(job.isCompleted) |
| assertTrue(job.isCancelled) |
| } |
| |
| @Test |
| public fun testCancelling() = runTest { |
| expect(1) |
| val job = launch(NonCancellable, start = CoroutineStart.LAZY) { |
| expect(2) |
| // launches child |
| launch(start = CoroutineStart.ATOMIC) { |
| expect(4) |
| } |
| // completes normally |
| } |
| // New job |
| assertFalse(job.isActive) |
| assertFalse(job.isCompleted) |
| assertFalse(job.isCancelled) |
| // New -> Active |
| job.start() |
| assertTrue(job.isActive) |
| assertFalse(job.isCompleted) |
| assertFalse(job.isCancelled) |
| // Active -> Completing |
| yield() // scheduled & starts child |
| expect(3) |
| assertTrue(job.isActive) |
| assertFalse(job.isCompleted) |
| assertFalse(job.isCancelled) |
| // Completing -> Cancelling |
| job.cancel() |
| assertFalse(job.isActive) |
| assertFalse(job.isCompleted) |
| assertTrue(job.isCancelled) |
| // Cancelling -> Cancelled |
| yield() |
| finish(5) |
| assertFalse(job.isActive) |
| assertTrue(job.isCompleted) |
| assertTrue(job.isCancelled) |
| } |
| } |