1 /*
2  * 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 
17 
18 package androidx.room;
19 
20 
21 import static androidx.room.InvalidationTracker.ObservedTableTracker.ADD;
22 import static androidx.room.InvalidationTracker.ObservedTableTracker.NO_OP;
23 import static androidx.room.InvalidationTracker.ObservedTableTracker.REMOVE;
24 
25 import static org.hamcrest.CoreMatchers.is;
26 import static org.hamcrest.CoreMatchers.nullValue;
27 import static org.hamcrest.MatcherAssert.assertThat;
28 
29 import org.junit.Before;
30 import org.junit.Test;
31 import org.junit.runner.RunWith;
32 import org.junit.runners.JUnit4;
33 
34 import java.util.Arrays;
35 
36 @RunWith(JUnit4.class)
37 public class ObservedTableTrackerTest {
38     private static final int TABLE_COUNT = 5;
39     private InvalidationTracker.ObservedTableTracker mTracker;
40 
41     @Before
setup()42     public void setup() {
43         mTracker = new InvalidationTracker.ObservedTableTracker(TABLE_COUNT);
44     }
45 
46     @Test
basicAdd()47     public void basicAdd() {
48         mTracker.onAdded(2, 3);
49         assertThat(mTracker.getTablesToSync(), is(createResponse(2, ADD, 3, ADD)));
50     }
51 
52     @Test
basicRemove()53     public void basicRemove() {
54         initState(2, 3);
55         mTracker.onRemoved(3);
56         assertThat(mTracker.getTablesToSync(), is(createResponse(3, REMOVE)));
57     }
58 
59     @Test
noChange()60     public void noChange() {
61         initState(1, 3);
62         mTracker.onAdded(3);
63         assertThat(mTracker.getTablesToSync(), is(nullValue()));
64     }
65 
66     @Test
returnNullUntilSync()67     public void returnNullUntilSync() {
68         initState(1, 3);
69         mTracker.onAdded(4);
70         assertThat(mTracker.getTablesToSync(), is(createResponse(4, ADD)));
71         mTracker.onAdded(0);
72         assertThat(mTracker.getTablesToSync(), is(nullValue()));
73         mTracker.onSyncCompleted();
74         assertThat(mTracker.getTablesToSync(), is(createResponse(0, ADD)));
75     }
76 
77     @Test
multipleAdditionsDeletions()78     public void multipleAdditionsDeletions() {
79         initState(2, 4);
80         mTracker.onAdded(2);
81         assertThat(mTracker.getTablesToSync(), is(nullValue()));
82         mTracker.onAdded(2, 4);
83         assertThat(mTracker.getTablesToSync(), is(nullValue()));
84         mTracker.onRemoved(2);
85         assertThat(mTracker.getTablesToSync(), is(nullValue()));
86         mTracker.onRemoved(2, 4);
87         assertThat(mTracker.getTablesToSync(), is(nullValue()));
88         mTracker.onAdded(1, 3);
89         mTracker.onRemoved(2, 4);
90         assertThat(mTracker.getTablesToSync(), is(
91                 createResponse(1, ADD, 2, REMOVE, 3, ADD, 4, REMOVE)));
92     }
93 
initState(int... tableIds)94     private void initState(int... tableIds) {
95         mTracker.onAdded(tableIds);
96         mTracker.getTablesToSync();
97         mTracker.onSyncCompleted();
98     }
99 
createResponse(int... tuples)100     private static int[] createResponse(int... tuples) {
101         int[] result = new int[TABLE_COUNT];
102         Arrays.fill(result, NO_OP);
103         for (int i = 0; i < tuples.length; i += 2) {
104             result[tuples[i]] = tuples[i + 1];
105         }
106         return result;
107     }
108 }
109