<lambda>null1package 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