TypeRewriterTest.kt revision dee52f68e1f6a3edc0cb77caa0902bc10cb50c33
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright 2018 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenpackage com.android.tools.build.jetifier.core
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.tools.build.jetifier.core.config.Config
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.tools.build.jetifier.core.rule.RewriteRule
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.tools.build.jetifier.core.rule.RewriteRulesMap
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.tools.build.jetifier.core.type.JavaType
23f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilsonimport com.android.tools.build.jetifier.core.type.TypesMap
24f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilsonimport com.google.common.truth.Truth
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.junit.Test
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilsonclass TypeRewriterTest {
28f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Test fun simpleRewrite_typesMap() {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        testRewrite(
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            from = "test.sample.Class",
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            to = "test.sample2.Class2",
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            typesMap = TypesMap(
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                JavaType.fromDotVersion("test.sample.Class")
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        to JavaType.fromDotVersion("test.sample2.Class2")
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            )
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        )
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Test fun prefixAllowedForRewrite() {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        testRewrite(
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            from = "test.sample.Class",
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            to = "test.sample2.Class2",
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            packagePrefix = "notTest/",
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            typesMap = TypesMap(
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                JavaType.fromDotVersion("test.sample.Class")
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        to JavaType.fromDotVersion("test.sample2.Class2")
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            )
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        )
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson
52100d7290264338c6536739abd59879aaaa812537Kenny Root    @Test fun typeMissingInMap_returnNull() {
53f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson        testRewrite(
54f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson            from = "test.sample.Class",
55f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson            to = null
56f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson        )
57100d7290264338c6536739abd59879aaaa812537Kenny Root    }
58f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson
59f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson    @Test fun typeMissingInMap_useFallback_shouldRewrite() {
60f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson        testRewrite(
61f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson            from = "test.sample.Class",
62100d7290264338c6536739abd59879aaaa812537Kenny Root            to = "test.sample2.Class2",
63f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson            rewriteRulesMap = RewriteRulesMap(RewriteRule(
64100d7290264338c6536739abd59879aaaa812537Kenny Root                "test/sample/Cl(.*)",
65f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson                "test/sample2/Cl{0}2"
66f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson            )),
67f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson            useFallback = true
68f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson        )
69f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson    }
70100d7290264338c6536739abd59879aaaa812537Kenny Root
712108ead7f125536874d6de6ca1c0c4cffbf61b44Jesse Wilson    @Test fun typeMissingInMap_useFallback_innerClass_shouldRewrite() {
72100d7290264338c6536739abd59879aaaa812537Kenny Root        testRewrite(
732108ead7f125536874d6de6ca1c0c4cffbf61b44Jesse Wilson            from = "test.sample.Class\$Inner",
742108ead7f125536874d6de6ca1c0c4cffbf61b44Jesse Wilson            to = "test.sample2.Class2\$Inner",
752108ead7f125536874d6de6ca1c0c4cffbf61b44Jesse Wilson            rewriteRulesMap = RewriteRulesMap(RewriteRule(
76f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson                    "test/sample/Class(.*)",
77f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson                    "test/sample2/Class2{0}"
78100d7290264338c6536739abd59879aaaa812537Kenny Root            )),
79f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson            useFallback = true
80100d7290264338c6536739abd59879aaaa812537Kenny Root        )
81f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson    }
82f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson
83f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson    @Test fun typeMissingInMap_useFallback_reversedMap_shouldRewrite() {
84f5fb5e80963abeabdf0ff10dcee068344235082eJesse Wilson        testRewrite(
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            from = "test.sample.Class",
86            to = "test.sample2.Class2",
87            rewriteRulesMap = RewriteRulesMap(RewriteRule(
88                "test/sample2/Cl(.*)2",
89                "test/sample/Cl{0}"
90            )).reverse(),
91            useFallback = true
92        )
93    }
94
95    @Test fun useBothMaps_typesMapHasPriority() {
96        testRewrite(
97            from = "test.sample.Class",
98            to = "test.sample2.Class2",
99            typesMap = TypesMap(
100                JavaType.fromDotVersion("test.sample.Class")
101                        to JavaType.fromDotVersion("test.sample2.Class2")
102            ),
103            rewriteRulesMap = RewriteRulesMap(RewriteRule(
104                "test/sample/Cl(.*)",
105                "test/sample3/Cl{0}3"
106            )),
107            useFallback = true
108        )
109    }
110
111    @Test fun ignoreRule_shouldNotRewrite() {
112        testRewrite(
113            from = "test.sample.Class",
114            to = "test.sample2.Class2",
115            typesMap = TypesMap(
116                JavaType.fromDotVersion("test.sample.Class")
117                        to JavaType.fromDotVersion("test.sample2.Class2")
118            ),
119            rewriteRulesMap = RewriteRulesMap(RewriteRule(
120                "test/sample/Cl(.*)",
121                "ignoreInRuntime"
122            ))
123        )
124    }
125
126    fun testRewrite(
127            from: String,
128            to: String?,
129            packagePrefix: String = "test/",
130            typesMap: TypesMap = TypesMap.EMPTY,
131            rewriteRulesMap: RewriteRulesMap = RewriteRulesMap.EMPTY,
132            useFallback: Boolean = false) {
133        val config = Config.fromOptional(
134            restrictToPackagePrefixes = setOf(packagePrefix),
135            rulesMap = rewriteRulesMap,
136            typesMap = typesMap
137        )
138
139        val rewriter = TypeRewriter(config, useFallback)
140        val result = rewriter.rewriteType(JavaType.fromDotVersion(from))
141
142        if (to == null) {
143            Truth.assertThat(result).isNull()
144        } else {
145            Truth.assertThat(result).isEqualTo(JavaType.fromDotVersion(to))
146        }
147    }
148}