BaseEntityParserTest.kt revision 540e3498175652abe452d8e0ed1c252e718ddf5a
11600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar/*
21600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * Copyright (C) 2016 The Android Open Source Project
31600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar *
41600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
51600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * you may not use this file except in compliance with the License.
61600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * You may obtain a copy of the License at
71600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar *
81600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
91600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar *
101600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * Unless required by applicable law or agreed to in writing, software
111600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
121600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * See the License for the specific language governing permissions and
141600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * limitations under the License.
151600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar */
161600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar
1764db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarpackage android.arch.persistence.room.processor
181600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar
194d4bae3f216e55f824d7d7fbfe2f8861906ee3e2Yigit Boyarimport android.arch.persistence.room.Embedded
2064db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarimport android.arch.persistence.room.testing.TestInvocation
2164db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarimport android.arch.persistence.room.testing.TestProcessor
2264db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarimport android.arch.persistence.room.vo.Entity
23540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescuimport android.support.annotation.NonNull
241600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyarimport com.google.auto.common.MoreElements
251600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyarimport com.google.common.truth.Truth
261600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyarimport com.google.testing.compile.CompileTester
271600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyarimport com.google.testing.compile.JavaFileObjects
281600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyarimport com.google.testing.compile.JavaSourceSubjectFactory
29dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyarimport com.google.testing.compile.JavaSourcesSubjectFactory
30dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyarimport javax.tools.JavaFileObject
311600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar
321600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyarabstract class BaseEntityParserTest {
331600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar    companion object {
341600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar        const val ENTITY_PREFIX = """
351600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar            package foo.bar;
3664db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyar            import android.arch.persistence.room.*;
37b2bfd37e6320e795bffafe24cfdc6a1d1b3da035Yuichi Araki            import android.support.annotation.NonNull;
380fc66ddc60bdc71d5466bb1db1a218e5a3d9c1fcYigit Boyar            @Entity%s
39dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar            public class MyEntity %s {
401600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar            """
411600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar        const val ENTITY_SUFFIX = "}"
421600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar    }
431600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar
440fc66ddc60bdc71d5466bb1db1a218e5a3d9c1fcYigit Boyar    fun singleEntity(input: String, attributes: Map<String, String> = mapOf(),
45dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar                     baseClass : String = "",
46dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar                     jfos : List<JavaFileObject> = emptyList(),
47c678b3a4eebc102a1a3b5923c5e07478c0eecae3Yigit Boyar                     handler: (Entity, TestInvocation) -> Unit): CompileTester {
480fc66ddc60bdc71d5466bb1db1a218e5a3d9c1fcYigit Boyar        val attributesReplacement : String
490fc66ddc60bdc71d5466bb1db1a218e5a3d9c1fcYigit Boyar        if (attributes.isEmpty()) {
500fc66ddc60bdc71d5466bb1db1a218e5a3d9c1fcYigit Boyar            attributesReplacement = ""
510fc66ddc60bdc71d5466bb1db1a218e5a3d9c1fcYigit Boyar        } else {
520fc66ddc60bdc71d5466bb1db1a218e5a3d9c1fcYigit Boyar            attributesReplacement = "(" +
530fc66ddc60bdc71d5466bb1db1a218e5a3d9c1fcYigit Boyar                    attributes.entries.map { "${it.key} = ${it.value}" }.joinToString(",") +
540fc66ddc60bdc71d5466bb1db1a218e5a3d9c1fcYigit Boyar                    ")".trimIndent()
550fc66ddc60bdc71d5466bb1db1a218e5a3d9c1fcYigit Boyar        }
56dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar        val baseClassReplacement : String
57dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar        if (baseClass == "") {
58dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar            baseClassReplacement = ""
59dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar        } else {
60dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar            baseClassReplacement = " extends $baseClass"
61dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar        }
62dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar        return Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
63dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar                .that(jfos + JavaFileObjects.forSourceString("foo.bar.MyEntity",
64dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar                        ENTITY_PREFIX.format(attributesReplacement, baseClassReplacement)
65dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar                                + input + ENTITY_SUFFIX
661600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar                ))
671600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar                .processedWith(TestProcessor.builder()
6864db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyar                        .forAnnotations(android.arch.persistence.room.Entity::class,
6964db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyar                                android.arch.persistence.room.PrimaryKey::class,
7064db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyar                                android.arch.persistence.room.Ignore::class,
714d4bae3f216e55f824d7d7fbfe2f8861906ee3e2Yigit Boyar                                Embedded::class,
72540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu                                android.arch.persistence.room.ColumnInfo::class,
73540e3498175652abe452d8e0ed1c252e718ddf5aFlorina Muntenescu                                NonNull::class)
741600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar                        .nextRunHandler { invocation ->
751600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar                            val entity = invocation.roundEnv
761600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar                                    .getElementsAnnotatedWith(
7764db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyar                                            android.arch.persistence.room.Entity::class.java)
78dc18ce63fe07921b1080e48d3e597e2b5240d17aYigit Boyar                                    .first { it.toString() == "foo.bar.MyEntity" }
79aa82fce1d73394bdc7f4c2510cf94a3572032b24Yigit Boyar                            val parser = EntityProcessor(invocation.context,
80aa82fce1d73394bdc7f4c2510cf94a3572032b24Yigit Boyar                                    MoreElements.asType(entity))
81aa82fce1d73394bdc7f4c2510cf94a3572032b24Yigit Boyar                            val parsedQuery = parser.process()
821600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar                            handler(parsedQuery, invocation)
831600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar                            true
841600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar                        }
851600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar                        .build())
861600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar    }
870fc66ddc60bdc71d5466bb1db1a218e5a3d9c1fcYigit Boyar}
88