1e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis/*
2e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * Copyright 2018 The Android Open Source Project
3e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis *
4e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * Licensed under the Apache License, Version 2.0 (the "License");
5e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * you may not use this file except in compliance with the License.
6e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * You may obtain a copy of the License at
7e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis *
8e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis *      http://www.apache.org/licenses/LICENSE-2.0
9e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis *
10e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * Unless required by applicable law or agreed to in writing, software
11e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * distributed under the License is distributed on an "AS IS" BASIS,
12e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * See the License for the specific language governing permissions and
14e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis * limitations under the License.
15e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis */
16e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
17ba381a314edcd57963ed1ac5910595e04faf29ccFilip Pavlispackage com.android.tools.build.jetifier.core
18e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
19ba381a314edcd57963ed1ac5910595e04faf29ccFilip Pavlisimport com.android.tools.build.jetifier.core.config.Config
20ba381a314edcd57963ed1ac5910595e04faf29ccFilip Pavlisimport com.android.tools.build.jetifier.core.rule.RewriteRule
21ba381a314edcd57963ed1ac5910595e04faf29ccFilip Pavlisimport com.android.tools.build.jetifier.core.rule.RewriteRulesMap
22ba381a314edcd57963ed1ac5910595e04faf29ccFilip Pavlisimport com.android.tools.build.jetifier.core.type.JavaType
23ba381a314edcd57963ed1ac5910595e04faf29ccFilip Pavlisimport com.android.tools.build.jetifier.core.type.TypesMap
24e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlisimport com.google.common.truth.Truth
25e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlisimport org.junit.Test
26e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
27e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlisclass TypeRewriterTest {
28e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
29e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    @Test fun simpleRewrite_typesMap() {
30e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        testRewrite(
31e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            from = "test.sample.Class",
32e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            to = "test.sample2.Class2",
33e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            typesMap = TypesMap(
34e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis                JavaType.fromDotVersion("test.sample.Class")
35e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis                        to JavaType.fromDotVersion("test.sample2.Class2")
36e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            )
37e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        )
38e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    }
39e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
40dee52f68e1f6a3edc0cb77caa0902bc10cb50c33Filip Pavlis    @Test fun prefixAllowedForRewrite() {
41e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        testRewrite(
42e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            from = "test.sample.Class",
43dee52f68e1f6a3edc0cb77caa0902bc10cb50c33Filip Pavlis            to = "test.sample2.Class2",
44e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            packagePrefix = "notTest/",
45e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            typesMap = TypesMap(
46e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis                JavaType.fromDotVersion("test.sample.Class")
47e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis                        to JavaType.fromDotVersion("test.sample2.Class2")
48e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            )
49e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        )
50e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    }
51e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
52e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    @Test fun typeMissingInMap_returnNull() {
53e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        testRewrite(
54e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            from = "test.sample.Class",
55e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            to = null
56e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        )
57e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    }
58e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
59e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    @Test fun typeMissingInMap_useFallback_shouldRewrite() {
60e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        testRewrite(
61e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            from = "test.sample.Class",
62e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            to = "test.sample2.Class2",
63e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            rewriteRulesMap = RewriteRulesMap(RewriteRule(
64e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis                "test/sample/Cl(.*)",
65e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis                "test/sample2/Cl{0}2"
66e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            )),
67e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            useFallback = true
68e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        )
69e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    }
70e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
71e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    @Test fun typeMissingInMap_useFallback_innerClass_shouldRewrite() {
72e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        testRewrite(
73e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            from = "test.sample.Class\$Inner",
74e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            to = "test.sample2.Class2\$Inner",
75e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            rewriteRulesMap = RewriteRulesMap(RewriteRule(
76ba381a314edcd57963ed1ac5910595e04faf29ccFilip Pavlis                    "test/sample/Class(.*)",
77ba381a314edcd57963ed1ac5910595e04faf29ccFilip Pavlis                    "test/sample2/Class2{0}"
78e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            )),
79e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            useFallback = true
80e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        )
81e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    }
82e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
83e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    @Test fun typeMissingInMap_useFallback_reversedMap_shouldRewrite() {
84e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        testRewrite(
85e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            from = "test.sample.Class",
86e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            to = "test.sample2.Class2",
87e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            rewriteRulesMap = RewriteRulesMap(RewriteRule(
88e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis                "test/sample2/Cl(.*)2",
89e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis                "test/sample/Cl{0}"
90e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            )).reverse(),
91e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            useFallback = true
92e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        )
93e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    }
94e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
95e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    @Test fun useBothMaps_typesMapHasPriority() {
96e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        testRewrite(
97e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            from = "test.sample.Class",
98e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            to = "test.sample2.Class2",
99e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            typesMap = TypesMap(
100e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis                JavaType.fromDotVersion("test.sample.Class")
101e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis                        to JavaType.fromDotVersion("test.sample2.Class2")
102e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            ),
103e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            rewriteRulesMap = RewriteRulesMap(RewriteRule(
104e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis                "test/sample/Cl(.*)",
105e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis                "test/sample3/Cl{0}3"
106e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            )),
107e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            useFallback = true
108e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        )
109e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    }
110e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
111e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    @Test fun ignoreRule_shouldNotRewrite() {
112e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        testRewrite(
113e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            from = "test.sample.Class",
114e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            to = "test.sample2.Class2",
115e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            typesMap = TypesMap(
116e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis                JavaType.fromDotVersion("test.sample.Class")
117e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis                        to JavaType.fromDotVersion("test.sample2.Class2")
118e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            ),
119e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            rewriteRulesMap = RewriteRulesMap(RewriteRule(
120e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis                "test/sample/Cl(.*)",
121e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis                "ignoreInRuntime"
122e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            ))
123e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        )
124e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    }
125e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
126e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    fun testRewrite(
127e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            from: String,
128e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            to: String?,
129e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            packagePrefix: String = "test/",
130e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            typesMap: TypesMap = TypesMap.EMPTY,
131e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            rewriteRulesMap: RewriteRulesMap = RewriteRulesMap.EMPTY,
132e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            useFallback: Boolean = false) {
1335b12e59efaab28afee6ffc712a7c8d6ecbae8144Filip Pavlis        val config = Config.fromOptional(
134e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            restrictToPackagePrefixes = setOf(packagePrefix),
135e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            rulesMap = rewriteRulesMap,
1365b12e59efaab28afee6ffc712a7c8d6ecbae8144Filip Pavlis            typesMap = typesMap
137e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        )
138e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
139e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        val rewriter = TypeRewriter(config, useFallback)
140e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        val result = rewriter.rewriteType(JavaType.fromDotVersion(from))
141e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis
142e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        if (to == null) {
143e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            Truth.assertThat(result).isNull()
144e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        } else {
145e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis            Truth.assertThat(result).isEqualTo(JavaType.fromDotVersion(to))
146e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis        }
147e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis    }
148e30cfbbfc62160fa5a9aa305a2fba9b11ebbd1e8Filip Pavlis}