Home | History | Annotate | Download | only in map
      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