File tree 1 file changed +56
-0
lines changed
kotlinx-coroutines-core/jvm/test
1 file changed +56
-0
lines changed Original file line number Diff line number Diff line change
1
+ /*
2
+ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3
+ */
4
+
5
+ package kotlinx.coroutines
6
+
7
+ import org.junit.Test
8
+ import kotlin.coroutines.*
9
+ import kotlin.test.*
10
+
11
+ class IntellijIdeaDebuggerEvaluatorCompatibilityTest {
12
+
13
+ /*
14
+ * This test verifies that our CoroutineScope is accessible to IDEA debugger.
15
+ *
16
+ * Consider the following scenario:
17
+ * ```
18
+ * runBlocking<Unit> { // this: CoroutineScope
19
+ * println("runBlocking")
20
+ * }
21
+ * ```
22
+ * user puts breakpoint to `println` line, opens "Evaluate" window
23
+ * and executes `launch { println("launch") }`. They (obviously) expect it to work, but
24
+ * it won't: `{}` in `runBlocking` is `SuspendLambda` and `this` is an unused implicit receiver
25
+ * that is removed by the compiler (because it's unused).
26
+ *
27
+ * But we still want to provide consistent user experience for functions with `CoroutineScope` receiver,
28
+ * for that IDEA debugger tries to retrieve the scope via `kotlin.coroutines.coroutineContext[Job] as? CoroutineScope`
29
+ * and with this test we're fixing this behaviour.
30
+ *
31
+ * Note that this behaviour is not carved in stone: IDEA fallbacks to `kotlin.coroutines.coroutineContext` for the context if necessary.
32
+ */
33
+
34
+ @Test
35
+ fun testScopeIsAccessible () = runBlocking<Unit > {
36
+ verify()
37
+
38
+ withContext(Job ()) {
39
+ verify()
40
+ }
41
+
42
+ coroutineScope {
43
+ verify()
44
+ }
45
+
46
+ supervisorScope {
47
+ verify()
48
+ }
49
+
50
+ }
51
+
52
+ private suspend fun verify () {
53
+ val ctx = coroutineContext
54
+ assertTrue { ctx.job is CoroutineScope }
55
+ }
56
+ }
You can’t perform that action at this time.
0 commit comments