<lambda>null1package kotlinx.coroutines 2 3 import kotlinx.coroutines.testing.* 4 import kotlin.test.* 5 6 class CompletableJobTest : TestBase() { 7 @Test 8 fun testComplete() { 9 val job = Job() 10 assertTrue(job.isActive) 11 assertFalse(job.isCompleted) 12 assertTrue(job.complete()) 13 assertTrue(job.isCompleted) 14 assertFalse(job.isActive) 15 assertFalse(job.isCancelled) 16 assertFalse(job.complete()) 17 } 18 19 @Test 20 fun testCompleteWithException() { 21 val job = Job() 22 assertTrue(job.isActive) 23 assertFalse(job.isCompleted) 24 assertTrue(job.completeExceptionally(TestException())) 25 assertTrue(job.isCompleted) 26 assertFalse(job.isActive) 27 assertTrue(job.isCancelled) 28 assertFalse(job.completeExceptionally(TestException())) 29 assertFalse(job.complete()) 30 } 31 32 @Test 33 fun testCompleteWithChildren() { 34 val parent = Job() 35 val child = Job(parent) 36 assertTrue(parent.complete()) 37 assertFalse(parent.complete()) 38 assertTrue(parent.isActive) 39 assertFalse(parent.isCompleted) 40 assertTrue(child.complete()) 41 assertTrue(child.isCompleted) 42 assertTrue(parent.isCompleted) 43 assertFalse(child.isActive) 44 assertFalse(parent.isActive) 45 } 46 47 @Test 48 fun testExceptionIsNotReportedToChildren() = parametrized { job -> 49 expect(1) 50 val child = launch(job) { 51 expect(2) 52 try { 53 // KT-33840 54 hang {} 55 } catch (e: Throwable) { 56 assertIs<CancellationException>(e) 57 assertIs<TestException>(if (RECOVER_STACK_TRACES) e.cause?.cause else e.cause) 58 expect(4) 59 throw e 60 } 61 } 62 yield() 63 expect(3) 64 job.completeExceptionally(TestException()) 65 child.join() 66 finish(5) 67 } 68 69 @Test 70 fun testCompleteExceptionallyDoesntAffectDeferred() = parametrized { job -> 71 expect(1) 72 val child = async(job) { 73 expect(2) 74 try { 75 // KT-33840 76 hang {} 77 } catch (e: Throwable) { 78 assertIs<CancellationException>(e) 79 assertIs<TestException>(if (RECOVER_STACK_TRACES) e.cause?.cause else e.cause) 80 expect(4) 81 throw e 82 } 83 } 84 yield() 85 expect(3) 86 job.completeExceptionally(TestException()) 87 child.join() 88 assertTrue { child.getCompletionExceptionOrNull() is CancellationException } 89 finish(5) 90 } 91 92 private fun parametrized(block: suspend CoroutineScope.(CompletableJob) -> Unit) { 93 runTest { 94 block(Job()) 95 reset() 96 block(SupervisorJob()) 97 } 98 } 99 } 100