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