| /* |
| * Copyright 2023 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package androidx.room.integration.kotlintestapp.test |
| |
| import android.content.Context |
| import androidx.room.Dao |
| import androidx.room.Database |
| import androidx.room.Entity |
| import androidx.room.Insert |
| import androidx.room.PrimaryKey |
| import androidx.room.Query |
| import androidx.room.Room |
| import androidx.room.RoomDatabase |
| import androidx.room.TypeConverters |
| import androidx.room.androidx.room.integration.kotlintestapp.vo.Experiment |
| import androidx.room.androidx.room.integration.kotlintestapp.vo.Schrodinger |
| import androidx.room.androidx.room.integration.kotlintestapp.vo.SchrodingerConverter |
| import androidx.room.integration.kotlintestapp.vo.DateConverter |
| import androidx.test.core.app.ApplicationProvider |
| import androidx.test.ext.junit.runners.AndroidJUnit4 |
| import androidx.test.filters.SmallTest |
| import com.google.common.truth.Truth.assertThat |
| import java.util.Date |
| import java.util.UUID |
| import org.junit.After |
| import org.junit.Before |
| import org.junit.Test |
| import org.junit.runner.RunWith |
| |
| @SmallTest |
| @RunWith(AndroidJUnit4::class) |
| class ValueClassConverterWrapperTest { |
| |
| @JvmInline |
| value class UserWithInt(val password: Int) |
| |
| @JvmInline |
| value class UserWithString(val password: String) |
| |
| @JvmInline |
| value class UserWithUUID(val password: UUID) |
| |
| @JvmInline |
| value class UserWithByte(val password: Byte) |
| |
| @JvmInline |
| value class UserWithDate(val password: Date) |
| |
| @JvmInline |
| value class UserWithGeneric<T>(val password: T) |
| |
| enum class Season { |
| WINTER, SUMMER, SPRING, FALL |
| } |
| |
| @JvmInline |
| value class UserWithEnum(val password: Season) |
| |
| @JvmInline |
| value class UserWithStringInternal(internal val password: String) |
| |
| @JvmInline |
| value class UserWithByteArray(val password: ByteArray) |
| |
| @Entity |
| @TypeConverters(DateConverter::class, SchrodingerConverter::class) |
| class UserInfo( |
| @PrimaryKey |
| val pk: Int, |
| val userIntPwd: UserWithInt, |
| val userStringPwd: UserWithString, |
| val userUUIDPwd: UserWithUUID, |
| val userBytePwd: UserWithByte, |
| val userEnumPwd: UserWithEnum, |
| val userDatePwd: UserWithDate, |
| val userStringInternalPwd: UserWithStringInternal, |
| val userGenericPwd: UserWithGeneric<String>, |
| val userByteArrayPwd: UserWithByteArray, |
| val schrodingerUser: Schrodinger |
| ) { |
| override fun equals(other: Any?): Boolean { |
| val otherEntity = other as UserInfo |
| return pk == otherEntity.pk && |
| userIntPwd == otherEntity.userIntPwd && |
| userStringPwd == otherEntity.userStringPwd && |
| userBytePwd == otherEntity.userBytePwd && |
| userUUIDPwd == otherEntity.userUUIDPwd && |
| userEnumPwd == otherEntity.userEnumPwd && |
| userDatePwd == otherEntity.userDatePwd && |
| userStringInternalPwd == otherEntity.userStringInternalPwd && |
| userGenericPwd == otherEntity.userGenericPwd && |
| userByteArrayPwd.password.contentEquals(otherEntity.userByteArrayPwd.password) && |
| schrodingerUser.experiment.isCatAlive == |
| otherEntity.schrodingerUser.experiment.isCatAlive |
| } |
| |
| override fun hashCode(): Int { |
| return 1 |
| } |
| } |
| |
| @Dao |
| interface SampleDao { |
| @Query("SELECT * FROM UserInfo") |
| fun getEntity(): UserInfo |
| |
| @Insert |
| fun insert(item: UserInfo) |
| } |
| |
| @Database( |
| entities = [UserInfo::class], |
| version = 1, |
| exportSchema = false |
| ) |
| abstract class ValueClassConverterWrapperDatabase : RoomDatabase() { |
| abstract fun dao(): SampleDao |
| } |
| |
| private lateinit var db: ValueClassConverterWrapperDatabase |
| private val pk = 0 |
| private val intPwd = UserWithInt(123) |
| private val stringPwd = UserWithString("open_sesame") |
| private val uuidPwd = UserWithUUID(UUID.randomUUID()) |
| private val bytePwd = UserWithByte(Byte.MIN_VALUE) |
| private val enumPwd = UserWithEnum(Season.SUMMER) |
| private val datePwd = UserWithDate(Date(2023L)) |
| private val internalPwd = UserWithStringInternal("open_sesame") |
| private val genericPwd = UserWithGeneric("open_sesame") |
| private val byteArrayPwd = UserWithByteArray(byteArrayOf(Byte.MIN_VALUE)) |
| private val shrodingerPwd = Schrodinger(Experiment("the cat is alive!")) |
| |
| @Test |
| fun readAndWriteValueClassToDatabase() { |
| val customerInfo = UserInfo( |
| pk = pk, |
| userIntPwd = intPwd, |
| userStringPwd = stringPwd, |
| userUUIDPwd = uuidPwd, |
| userBytePwd = bytePwd, |
| userEnumPwd = enumPwd, |
| userDatePwd = datePwd, |
| userStringInternalPwd = internalPwd, |
| userGenericPwd = genericPwd, |
| userByteArrayPwd = byteArrayPwd, |
| schrodingerUser = shrodingerPwd |
| ) |
| |
| db.dao().insert(customerInfo) |
| |
| val readEntity = db.dao().getEntity() |
| |
| assertThat(readEntity).isEqualTo(customerInfo) |
| } |
| |
| @Before |
| fun initDb() { |
| val context = ApplicationProvider.getApplicationContext<Context>() |
| db = Room.inMemoryDatabaseBuilder( |
| context, |
| ValueClassConverterWrapperDatabase::class.java |
| ).build() |
| } |
| |
| @After |
| fun teardown() { |
| db.close() |
| } |
| } |