1 /* 2 * Copyright 2017 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 17 package com.android.tools.build.jetifier.processor.map 18 19 import com.android.tools.build.jetifier.core.config.Config 20 import com.android.tools.build.jetifier.core.rule.RewriteRule 21 import com.android.tools.build.jetifier.core.rule.RewriteRulesMap 22 import com.android.tools.build.jetifier.core.type.JavaType 23 import com.android.tools.build.jetifier.processor.type.MapGeneratorRemapper 24 import com.google.common.truth.Truth 25 import org.junit.Test 26 27 class MapGenerationTest { 28 29 @Test fun fromOneType_toOneType() { 30 ScanTester 31 .testThatRules( 32 RewriteRule("android/support/v7/(.*)", "android/test/{0}") 33 ) 34 .withAllowedPrefixes("android/support/" 35 ) 36 .forGivenTypes( 37 JavaType("android/support/v7/pref/Preference") 38 ) 39 .mapInto( 40 types = mapOf( 41 "android/support/v7/pref/Preference" to "android/test/pref/Preference" 42 ) 43 ) 44 .andIsComplete() 45 } 46 47 @Test fun fromTwoTypes_toOneType_prefixRespected() { 48 ScanTester 49 .testThatRules( 50 RewriteRule("android/support/v7/(.*)", "android/test/{0}"), 51 RewriteRule("android/support/v14/(.*)", "android/test/{0}") 52 ) 53 .withAllowedPrefixes( 54 "android/support/v7/" 55 ) 56 .forGivenTypes( 57 JavaType("android/support/v7/pref/Preference"), 58 JavaType("android/support/v14/pref/PreferenceDialog") 59 ) 60 .mapInto( 61 types = mapOf( 62 "android/support/v7/pref/Preference" to "android/test/pref/Preference" 63 ) 64 ) 65 .andIsComplete() 66 } 67 68 @Test fun fromTwoTypes_toTwoTypes_distinctRules() { 69 ScanTester 70 .testThatRules( 71 RewriteRule("android/support/v7/(.*)", "android/test/{0}"), 72 RewriteRule("android/support/v14/(.*)", "android/test/{0}") 73 ) 74 .withAllowedPrefixes( 75 "android/support/v7/", 76 "android/support/v14/" 77 ) 78 .forGivenTypes( 79 JavaType("android/support/v7/pref/Preference"), 80 JavaType("android/support/v14/pref/PreferenceDialog") 81 ) 82 .mapInto( 83 types = mapOf( 84 "android/support/v7/pref/Preference" to "android/test/pref/Preference", 85 "android/support/v14/pref/PreferenceDialog" 86 to "android/test/pref/PreferenceDialog" 87 ) 88 ) 89 .andIsComplete() 90 } 91 92 @Test fun fromTwoTypes_toTwoTypes_respectsOrder() { 93 ScanTester 94 .testThatRules( 95 RewriteRule("android/support/v14/(.*)", "android/test/{0}"), 96 RewriteRule("android/support/(.*)", "android/fallback/{0}") 97 ) 98 .withAllowedPrefixes( 99 "android/support/" 100 ) 101 .forGivenTypes( 102 JavaType("android/support/v7/pref/Preference"), 103 JavaType("android/support/v14/pref/PreferenceDialog") 104 ) 105 .mapInto( 106 types = mapOf( 107 "android/support/v7/pref/Preference" to "android/fallback/v7/pref/Preference", 108 "android/support/v14/pref/PreferenceDialog" 109 to "android/test/pref/PreferenceDialog" 110 ) 111 ) 112 .andIsComplete() 113 } 114 115 @Test fun mapTwoTypes_shouldIgnoreFirstTwo() { 116 ScanTester 117 .testThatRules( 118 RewriteRule("android/support/v7/(.*)", "ignore"), 119 RewriteRule("android/support/v8/(.*)", "ignoreInPreprocessorOnly"), 120 RewriteRule("android/support/v14/(.*)", "android/test/{0}") 121 ) 122 .withAllowedPrefixes( 123 "android/support/" 124 ) 125 .forGivenTypes( 126 JavaType("android/support/v7/pref/Preference"), 127 JavaType("android/support/v8/pref/Preference"), 128 JavaType("android/support/v14/pref/Preference") 129 ) 130 .mapInto( 131 types = mapOf( 132 "android/support/v14/pref/Preference" to "android/test/pref/Preference" 133 ) 134 ) 135 .andIsComplete() 136 } 137 138 object ScanTester { 139 140 fun testThatRules(vararg rules: RewriteRule) = Step1(rules.toList()) 141 142 class Step1(private val rules: List<RewriteRule>) { 143 144 fun withAllowedPrefixes(vararg prefixes: String) = Step2(rules, prefixes.toSet()) 145 146 class Step2(private val rules: List<RewriteRule>, private val prefixes: Set<String>) { 147 148 private val allTypes: MutableList<JavaType> = mutableListOf() 149 private var wasMapIncomplete = false 150 151 fun forGivenTypes(vararg types: JavaType): Step2 { 152 allTypes.addAll(types) 153 return this 154 } 155 156 fun mapInto(types: Map<String, String>): Step2 { 157 val config = Config.fromOptional( 158 restrictToPackagePrefixes = prefixes, 159 rulesMap = RewriteRulesMap(rules)) 160 val scanner = MapGeneratorRemapper(config) 161 162 allTypes.forEach { scanner.rewriteType(it) } 163 164 val typesMap = scanner.createTypesMap().toJson() 165 wasMapIncomplete = scanner.isMapNotComplete 166 167 Truth.assertThat(typesMap.types).containsExactlyEntriesIn(types) 168 return this 169 } 170 171 fun andIsNotComplete() { 172 Truth.assertThat(wasMapIncomplete).isTrue() 173 } 174 175 fun andIsComplete() { 176 Truth.assertThat(wasMapIncomplete).isFalse() 177 } 178 } 179 } 180 } 181 } 182 183