1757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar/*
2757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar * Copyright 2018 The Android Open Source Project
3757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar *
4757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar * you may not use this file except in compliance with the License.
6757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar * You may obtain a copy of the License at
7757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar *
8757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar *
10757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar * Unless required by applicable law or agreed to in writing, software
11757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar * See the License for the specific language governing permissions and
14757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar * limitations under the License.
15757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar */
16757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
17bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viverettepackage androidx.room.integration.testapp.test;
18757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
19757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyarimport static org.hamcrest.CoreMatchers.is;
20757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyarimport static org.hamcrest.MatcherAssert.assertThat;
21757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
22757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyarimport android.support.test.InstrumentationRegistry;
23757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyarimport android.support.test.filters.SmallTest;
24757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyarimport android.support.test.runner.AndroidJUnit4;
25757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
26bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.annotation.NonNull;
27bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Dao;
28bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Database;
29bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Entity;
30bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Insert;
31bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.PrimaryKey;
32bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Query;
33bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Room;
34bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.RoomDatabase;
35bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viverette
36757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyarimport org.junit.After;
37757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyarimport org.junit.Before;
38757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyarimport org.junit.Test;
39757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyarimport org.junit.runner.RunWith;
40757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
41757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar@RunWith(AndroidJUnit4.class)
42757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar@SmallTest
43757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyarpublic class GenericEntityTest {
44757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    private GenericDb mDb;
45757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    private GenericDao mDao;
46757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
47757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    @Before
48757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    public void init() {
49757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        mDb = Room.inMemoryDatabaseBuilder(
50757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar                InstrumentationRegistry.getTargetContext(),
51757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar                GenericDb.class
52757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        ).build();
53757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        mDao = mDb.getDao();
54757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    }
55757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
56757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    @After
57757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    public void close() {
58757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        mDb.close();
59757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    }
60757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
61757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    @Test
62757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    public void readWriteEntity() {
63757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        EntityItem item = new EntityItem("abc", "def");
64757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        mDao.insert(item);
65757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        EntityItem received = mDao.get("abc");
66757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        assertThat(received, is(item));
67757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    }
68757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
69757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    @Test
70757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    public void readPojo() {
71757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        EntityItem item = new EntityItem("abc", "def");
72757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        mDao.insert(item);
73757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        PojoItem received = mDao.getPojo("abc");
74757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        assertThat(received.id, is("abc"));
75757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    }
76757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
77757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    static class Item<P, F> {
78757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        @NonNull
79757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        @PrimaryKey
80757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        public final P id;
81757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        private F mField;
82757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
83757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        Item(@NonNull P id) {
84757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar            this.id = id;
85757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        }
86757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
87757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        public F getField() {
88757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar            return mField;
89757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        }
90757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
91757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        public void setField(F field) {
92757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar            mField = field;
93757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        }
94757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
95757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        @Override
96757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        public boolean equals(Object o) {
97757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar            if (this == o) return true;
98757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar            if (o == null || getClass() != o.getClass()) return false;
99757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar            Item<?, ?> item = (Item<?, ?>) o;
100359e3f1cf1dbc468b1bbdf58c6b74e7a5b6abb70Yuichi Araki            //noinspection SimplifiableIfStatement
101359e3f1cf1dbc468b1bbdf58c6b74e7a5b6abb70Yuichi Araki            if (!id.equals(item.id)) return false;
102359e3f1cf1dbc468b1bbdf58c6b74e7a5b6abb70Yuichi Araki            return mField != null ? mField.equals(item.mField) : item.mField == null;
103757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        }
104757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
105757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        @Override
106757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        public int hashCode() {
107359e3f1cf1dbc468b1bbdf58c6b74e7a5b6abb70Yuichi Araki            int result = id.hashCode();
108359e3f1cf1dbc468b1bbdf58c6b74e7a5b6abb70Yuichi Araki            result = 31 * result + (mField != null ? mField.hashCode() : 0);
109359e3f1cf1dbc468b1bbdf58c6b74e7a5b6abb70Yuichi Araki            return result;
110757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        }
111757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    }
112757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
113757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    static class PojoItem extends Item<String, Integer> {
114757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        PojoItem(String id) {
115757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar            super(id);
116757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        }
117757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    }
118757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
119757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    @Entity
120757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    static class EntityItem extends Item<String, Integer> {
121757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        public final String name;
122757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
123757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        EntityItem(String id, String name) {
124757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar            super(id);
125757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar            this.name = name;
126757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        }
127757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
128757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        @Override
129757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        public boolean equals(Object o) {
130757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar            if (this == o) return true;
131757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar            if (o == null || getClass() != o.getClass()) return false;
132359e3f1cf1dbc468b1bbdf58c6b74e7a5b6abb70Yuichi Araki            if (!super.equals(o)) return false;
133359e3f1cf1dbc468b1bbdf58c6b74e7a5b6abb70Yuichi Araki            EntityItem that = (EntityItem) o;
134359e3f1cf1dbc468b1bbdf58c6b74e7a5b6abb70Yuichi Araki            return name != null ? name.equals(that.name) : that.name == null;
135757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        }
136757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
137757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        @Override
138757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        public int hashCode() {
139359e3f1cf1dbc468b1bbdf58c6b74e7a5b6abb70Yuichi Araki            int result = super.hashCode();
140359e3f1cf1dbc468b1bbdf58c6b74e7a5b6abb70Yuichi Araki            result = 31 * result + (name != null ? name.hashCode() : 0);
141359e3f1cf1dbc468b1bbdf58c6b74e7a5b6abb70Yuichi Araki            return result;
142757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        }
143757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    }
144757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
145757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    @Dao
146757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    public interface GenericDao {
147757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        @Insert
148757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        void insert(EntityItem... items);
149757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
150757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        @Query("SELECT * FROM EntityItem WHERE id = :id")
151757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        EntityItem get(String id);
152757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
153757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        @Query("SELECT * FROM EntityItem WHERE id = :id")
154757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        PojoItem getPojo(String id);
155757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    }
156757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar
157757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    @Database(version = 1, entities = {EntityItem.class}, exportSchema = false)
158757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    public abstract static class GenericDb extends RoomDatabase {
159757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar        abstract GenericDao getDao();
160757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar    }
161757abd3002dff7725cde3cebdbf9bfeed691d2f9Yigit Boyar}
162