1/*
2 * Copyright 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.tools.build.jetifier.core
18
19import com.android.tools.build.jetifier.core.config.Config
20import com.android.tools.build.jetifier.core.rule.RewriteRule
21import com.android.tools.build.jetifier.core.rule.RewriteRulesMap
22import com.android.tools.build.jetifier.core.type.JavaType
23import com.android.tools.build.jetifier.core.type.TypesMap
24import com.google.common.truth.Truth
25import org.junit.Test
26
27class TypeRewriterTest {
28
29    @Test fun simpleRewrite_typesMap() {
30        testRewrite(
31            from = "test.sample.Class",
32            to = "test.sample2.Class2",
33            typesMap = TypesMap(
34                JavaType.fromDotVersion("test.sample.Class")
35                        to JavaType.fromDotVersion("test.sample2.Class2")
36            )
37        )
38    }
39
40    @Test fun prefixAllowedForRewrite() {
41        testRewrite(
42            from = "test.sample.Class",
43            to = "test.sample2.Class2",
44            packagePrefix = "notTest/",
45            typesMap = TypesMap(
46                JavaType.fromDotVersion("test.sample.Class")
47                        to JavaType.fromDotVersion("test.sample2.Class2")
48            )
49        )
50    }
51
52    @Test fun typeMissingInMap_returnNull() {
53        testRewrite(
54            from = "test.sample.Class",
55            to = null
56        )
57    }
58
59    @Test fun typeMissingInMap_useFallback_shouldRewrite() {
60        testRewrite(
61            from = "test.sample.Class",
62            to = "test.sample2.Class2",
63            rewriteRulesMap = RewriteRulesMap(RewriteRule(
64                "test/sample/Cl(.*)",
65                "test/sample2/Cl{0}2"
66            )),
67            useFallback = true
68        )
69    }
70
71    @Test fun typeMissingInMap_useFallback_innerClass_shouldRewrite() {
72        testRewrite(
73            from = "test.sample.Class\$Inner",
74            to = "test.sample2.Class2\$Inner",
75            rewriteRulesMap = RewriteRulesMap(RewriteRule(
76                    "test/sample/Class(.*)",
77                    "test/sample2/Class2{0}"
78            )),
79            useFallback = true
80        )
81    }
82
83    @Test fun typeMissingInMap_useFallback_reversedMap_shouldRewrite() {
84        testRewrite(
85            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}