12c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar/*
22c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar * Copyright (C) 2017 The Android Open Source Project
32c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar *
42c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
52c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar * you may not use this file except in compliance with the License.
62c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar * You may obtain a copy of the License at
72c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar *
82c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
92c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar *
102c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar * Unless required by applicable law or agreed to in writing, software
112c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
122c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar * See the License for the specific language governing permissions and
142c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar * limitations under the License.
152c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar */
162c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar
17bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viverettepackage androidx.room.integration.testapp.test;
182c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar
19540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescuimport static org.hamcrest.CoreMatchers.instanceOf;
202c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyarimport static org.hamcrest.CoreMatchers.is;
212c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyarimport static org.hamcrest.CoreMatchers.notNullValue;
222c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyarimport static org.hamcrest.MatcherAssert.assertThat;
23540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescuimport static org.junit.Assert.assertNotNull;
242c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar
25540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescuimport android.database.sqlite.SQLiteConstraintException;
26540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescuimport android.support.test.InstrumentationRegistry;
27540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescuimport android.support.test.filters.SmallTest;
28540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescuimport android.support.test.runner.AndroidJUnit4;
292c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar
30bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Room;
31bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.integration.testapp.PKeyTestDatabase;
32bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.integration.testapp.vo.IntAutoIncPKeyEntity;
33bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.integration.testapp.vo.IntegerAutoIncPKeyEntity;
34bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.integration.testapp.vo.IntegerPKeyEntity;
35bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.integration.testapp.vo.ObjectPKeyEntity;
36bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viverette
372c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyarimport org.junit.Before;
382c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyarimport org.junit.Test;
392c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyarimport org.junit.runner.RunWith;
402c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar
41f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyarimport java.util.Arrays;
42a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescuimport java.util.List;
43f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar
442c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar@RunWith(AndroidJUnit4.class)
452c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar@SmallTest
462c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyarpublic class PrimaryKeyTest {
472c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar    private PKeyTestDatabase mDatabase;
48540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu
492c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar    @Before
502c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar    public void setup() {
512c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar        mDatabase = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getTargetContext(),
522c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar                PKeyTestDatabase.class).build();
532c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar    }
542c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar
552c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar    @Test
562c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar    public void integerTest() {
572c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar        IntegerAutoIncPKeyEntity entity = new IntegerAutoIncPKeyEntity();
582c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar        entity.data = "foo";
59a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu        mDatabase.integerAutoIncPKeyDao().insertMe(entity);
60a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu        IntegerAutoIncPKeyEntity loaded = mDatabase.integerAutoIncPKeyDao().getMe(1);
612c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar        assertThat(loaded, notNullValue());
622c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar        assertThat(loaded.data, is(entity.data));
632c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar    }
642c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar
652c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar    @Test
662c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar    public void dontOverrideNullable0() {
672c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar        IntegerAutoIncPKeyEntity entity = new IntegerAutoIncPKeyEntity();
682c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar        entity.pKey = 0;
692c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar        entity.data = "foo";
70a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu        mDatabase.integerAutoIncPKeyDao().insertMe(entity);
71a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu        IntegerAutoIncPKeyEntity loaded = mDatabase.integerAutoIncPKeyDao().getMe(0);
722c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar        assertThat(loaded, notNullValue());
732c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar        assertThat(loaded.data, is(entity.data));
742c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar    }
752c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar
762c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar    @Test
772c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar    public void intTest() {
782c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar        IntAutoIncPKeyEntity entity = new IntAutoIncPKeyEntity();
792c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar        entity.data = "foo";
802c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar        mDatabase.intPKeyDao().insertMe(entity);
812c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar        IntAutoIncPKeyEntity loaded = mDatabase.intPKeyDao().getMe(1);
822c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar        assertThat(loaded, notNullValue());
832c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar        assertThat(loaded.data, is(entity.data));
842c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar    }
85f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar
86f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar    @Test
87f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar    public void getInsertedId() {
88f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar        IntAutoIncPKeyEntity entity = new IntAutoIncPKeyEntity();
89f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar        entity.data = "foo";
90f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar        final long id = mDatabase.intPKeyDao().insertAndGetId(entity);
91f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar        assertThat(mDatabase.intPKeyDao().getMe((int) id).data, is("foo"));
92f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar    }
93f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar
94f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar    @Test
95f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar    public void getInsertedIds() {
96f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar        IntAutoIncPKeyEntity entity = new IntAutoIncPKeyEntity();
97f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar        entity.data = "foo";
98f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar        IntAutoIncPKeyEntity entity2 = new IntAutoIncPKeyEntity();
99f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar        entity2.data = "foo2";
100f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar        final long[] ids = mDatabase.intPKeyDao().insertAndGetIds(entity, entity2);
101f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar        assertThat(mDatabase.intPKeyDao().loadDataById(ids), is(Arrays.asList("foo", "foo2")));
102f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar    }
103f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar
104f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar    @Test
105f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar    public void getInsertedIdFromInteger() {
106f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar        IntegerAutoIncPKeyEntity entity = new IntegerAutoIncPKeyEntity();
107f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar        entity.data = "foo";
108a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu        final long id = mDatabase.integerAutoIncPKeyDao().insertAndGetId(entity);
109a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu        assertThat(mDatabase.integerAutoIncPKeyDao().getMe((int) id).data, is("foo"));
110f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar    }
111f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar
112f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar    @Test
113f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar    public void getInsertedIdsFromInteger() {
114f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar        IntegerAutoIncPKeyEntity entity = new IntegerAutoIncPKeyEntity();
115f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar        entity.data = "foo";
116f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar        IntegerAutoIncPKeyEntity entity2 = new IntegerAutoIncPKeyEntity();
117f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar        entity2.data = "foo2";
118a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu        final long[] ids = mDatabase.integerAutoIncPKeyDao().insertAndGetIds(entity, entity2);
119a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu        assertThat(mDatabase.integerAutoIncPKeyDao().loadDataById(ids),
120a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu                is(Arrays.asList("foo", "foo2")));
121f5f2cf6b9ed63915448e81551e4b7bb72a26030eYigit Boyar    }
122540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu
123540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu    @Test
124540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu    public void insertNullPrimaryKey() throws Exception {
125540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu        ObjectPKeyEntity o1 = new ObjectPKeyEntity(null, "1");
126540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu
127540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu        Throwable throwable = null;
128540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu        try {
129540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu            mDatabase.objectPKeyDao().insertMe(o1);
130540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu        } catch (Throwable t) {
131540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu            throwable = t;
132540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu        }
133540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu        assertNotNull("Was expecting an exception", throwable);
134540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu        assertThat(throwable, instanceOf(SQLiteConstraintException.class));
135540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu    }
136a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu
137a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu    @Test
138a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu    public void insertNullPrimaryKeyForInteger() throws Exception {
139a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu        IntegerPKeyEntity entity = new IntegerPKeyEntity();
140a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu        entity.data = "data";
141a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu        mDatabase.integerPKeyDao().insertMe(entity);
142a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu
143a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu        List<IntegerPKeyEntity> list = mDatabase.integerPKeyDao().loadAll();
144a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu        assertThat(list.size(), is(1));
145a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu        assertThat(list.get(0).data, is("data"));
146a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu        assertNotNull(list.get(0).pKey);
147a1be0035ff9cb46339f02db942c990e44eab7075Florina Muntenescu    }
1482c6462f129bf43965ed8b054b026f6a28fe6fd8fYigit Boyar}
149