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

<lambda>null1 package kotlinx.coroutines
2 
3 import kotlin.test.*
4 
5 class MessageQueueTest {
6     private var scheduled = false
7     private val processed = mutableListOf<Int>()
8 
9     private val queue = object : MessageQueue() {
10         override fun schedule() {
11             assertFalse(scheduled)
12             scheduled = true
13         }
14 
15         override fun reschedule() {
16             schedule()
17         }
18     }
19 
20     inner class Box(val i: Int): Runnable {
21         override fun run() {
22             processed += i
23         }
24     }
25 
26     inner class ReBox(val i: Int): Runnable {
27         override fun run() {
28             processed += i
29             queue.enqueue(Box(10 + i))
30         }
31     }
32 
33     @Test
34     fun testBasic() {
35         assertTrue(queue.isEmpty())
36         queue.enqueue(Box(1))
37         assertFalse(queue.isEmpty())
38         assertTrue(scheduled)
39         queue.enqueue(Box(2))
40         assertFalse(queue.isEmpty())
41         scheduled = false
42         queue.process()
43         assertEquals(listOf(1, 2), processed)
44         assertFalse(scheduled)
45         assertTrue(queue.isEmpty())
46     }
47 
48     @Test fun testRescheduleFromProcess()  {
49         assertTrue(queue.isEmpty())
50         queue.enqueue(ReBox(1))
51         assertFalse(queue.isEmpty())
52         assertTrue(scheduled)
53         queue.enqueue(ReBox(2))
54         assertFalse(queue.isEmpty())
55         scheduled = false
56         queue.process()
57         assertEquals(listOf(1, 2, 11, 12), processed)
58         assertFalse(scheduled)
59         assertTrue(queue.isEmpty())
60     }
61 
62     @Test
63     fun testResizeAndWrap() {
64         repeat(10) { phase ->
65             val n = 10 * (phase + 1)
66             assertTrue(queue.isEmpty())
67             repeat(n) {
68                 queue.enqueue(Box(it))
69                 assertFalse(queue.isEmpty())
70                 assertTrue(scheduled)
71             }
72             var countYields = 0
73             while (scheduled) {
74                 scheduled = false
75                 queue.process()
76                 countYields++
77             }
78             assertEquals(List(n) { it }, processed)
79             assertEquals((n + queue.yieldEvery - 1) / queue.yieldEvery, countYields)
80             processed.clear()
81         }
82     }
83 }
84