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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
/*
* 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)
}
}
|