• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download

<lambda>null1 package 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