1 /*
<lambda>null2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package androidx.room
17 
18 import androidx.kruth.assertThat
19 import androidx.room.ObservedTableStates.ObserveOp
20 import kotlin.test.BeforeTest
21 import kotlin.test.Test
22 import kotlin.test.assertNull
23 import kotlinx.coroutines.test.runTest
24 
25 class ObservedTableStatesTest {
26     private lateinit var tableStates: ObservedTableStates
27 
28     @BeforeTest
29     fun setup() {
30         tableStates = ObservedTableStates(TABLE_COUNT)
31     }
32 
33     @Test
34     fun basicAdd() = runTest {
35         tableStates.onObserverAdded(intArrayOf(2, 3))
36         assertThat(tableStates.getTablesToSync())
37             .isEqualTo(createSyncResult(mapOf(2 to ObserveOp.ADD, 3 to ObserveOp.ADD)))
38     }
39 
40     @Test
41     fun basicRemove() = runTest {
42         tableStates.onObserverAdded(intArrayOf(2, 3))
43         tableStates.getTablesToSync()
44 
45         tableStates.onObserverRemoved(intArrayOf(3))
46         assertThat(tableStates.getTablesToSync())
47             .isEqualTo(createSyncResult(mapOf(3 to ObserveOp.REMOVE)))
48     }
49 
50     @Test
51     fun noChange() = runTest {
52         tableStates.onObserverAdded(intArrayOf(1, 3))
53         tableStates.getTablesToSync()
54 
55         tableStates.onObserverAdded(intArrayOf(3))
56         assertNull(tableStates.getTablesToSync())
57     }
58 
59     @Test
60     fun addAndDeleteNetMoChange() = runTest {
61         tableStates.onObserverAdded(intArrayOf(1, 3))
62         tableStates.getTablesToSync()
63 
64         tableStates.onObserverRemoved(intArrayOf(1, 3))
65         tableStates.onObserverAdded(intArrayOf(1, 3))
66         assertNull(tableStates.getTablesToSync())
67     }
68 
69     @Test
70     fun multipleAdditionsDeletions() = runTest {
71         tableStates.onObserverAdded(intArrayOf(2, 4))
72         tableStates.getTablesToSync()
73 
74         tableStates.onObserverAdded(intArrayOf(2))
75         assertNull(tableStates.getTablesToSync())
76 
77         tableStates.onObserverAdded(intArrayOf(2, 4))
78         assertNull(tableStates.getTablesToSync())
79 
80         tableStates.onObserverRemoved(intArrayOf(2))
81         assertNull(tableStates.getTablesToSync())
82 
83         tableStates.onObserverRemoved(intArrayOf(2, 4))
84         assertNull(tableStates.getTablesToSync())
85 
86         tableStates.onObserverAdded(intArrayOf(1, 3))
87         tableStates.onObserverRemoved(intArrayOf(2, 4))
88         assertThat(tableStates.getTablesToSync())
89             .isEqualTo(
90                 createSyncResult(
91                     mapOf(
92                         1 to ObserveOp.ADD,
93                         2 to ObserveOp.REMOVE,
94                         3 to ObserveOp.ADD,
95                         4 to ObserveOp.REMOVE
96                     )
97                 )
98             )
99     }
100 
101     companion object {
102         private const val TABLE_COUNT = 5
103 
104         private fun createSyncResult(tuples: Map<Int, ObserveOp>): Array<ObserveOp> {
105             return Array(TABLE_COUNT) { i -> tuples[i] ?: ObserveOp.NO_OP }
106         }
107     }
108 }
109