Home | History | Annotate | Download | only in lint
      1 /*
      2  * Copyright (C) 2016 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.google.checkcolor.lint;
     18 
     19 import com.android.annotations.NonNull;
     20 import com.android.tools.lint.checks.infrastructure.LintDetectorTest;
     21 import com.android.tools.lint.client.api.LintClient;
     22 import com.android.tools.lint.detector.api.Detector;
     23 import com.android.tools.lint.detector.api.Issue;
     24 import com.android.tools.lint.detector.api.Project;
     25 
     26 import java.util.Collections;
     27 import java.util.HashSet;
     28 import java.util.List;
     29 import java.util.Set;
     30 
     31 public class HardcodedColorDetectorTest extends LintDetectorTest {
     32 
     33     private Set<Issue> mEnabled = new HashSet<Issue>();
     34 
     35     @Override
     36     protected Detector getDetector() {
     37         return new HardcodedColorDetector();
     38     }
     39 
     40     @Override
     41     protected List<Issue> getIssues() {
     42         return Collections.singletonList(HardcodedColorDetector.ISSUE);
     43     }
     44 
     45     @Override
     46     protected TestConfiguration getConfiguration(LintClient client, Project project) {
     47         return new TestConfiguration(client, project, null) {
     48             @Override
     49             public boolean isEnabled(@NonNull Issue issue) {
     50                 return super.isEnabled(issue) && mEnabled.contains(issue);
     51             }
     52         };
     53     }
     54 
     55     public void testHardcodeColorInSelector() throws Exception {
     56         mEnabled = Collections.singleton(HardcodedColorDetector.ISSUE);
     57         String expected = "res/layout/selector.xml:4: Error: Using hardcoded colors is not allowed [HardcodedColor]\n" +
     58                 "        android:color=\"#ffffff\" />\n" +
     59                 "        ~~~~~~~~~~~~~~~~~~~~~~~\n" +
     60                 "1 errors, 0 warnings\n";
     61         String result = lintProject(xml("res/layout/selector.xml", "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
     62                 "<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n" +
     63                 "    <item android:state_checked=\"true\"\n" +
     64                 "        android:color=\"#ffffff\" />\n" +
     65                 "    <item android:color=\"@android:color/black\"\n" +
     66                 "        android:alpha=\".54\" />\n" +
     67                 "</selector>"));
     68         assertEquals(expected, result);
     69     }
     70 
     71     public void testHardcodeColorInLayout() throws Exception {
     72         mEnabled = Collections.singleton(HardcodedColorDetector.ISSUE);
     73         String expected = "res/layout/layout_battery.xml:13: Error: Using hardcoded colors is not allowed [HardcodedColor]\n" +
     74                 "        android:textColor=\"#ff0\" />\n" +
     75                 "        ~~~~~~~~~~~~~~~~~~~~~~~~\n" +
     76                 "res/layout/layout_battery.xml:25: Error: Using hardcoded colors is not allowed [HardcodedColor]\n" +
     77                 "        systemui:textColor=\"#66FFFFFF\" />\n" +
     78                 "        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
     79                 "2 errors, 0 warnings\n";
     80         String result = lintProject(xml("res/layout/layout_battery.xml", "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
     81                 "<LinearLayout\n" +
     82                 "    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
     83                 "    xmlns:systemui=\"http://schemas.android.com/apk/res-auto\"\n" +
     84                 "    android:layout_width=\"match_parent\"\n" +
     85                 "    android:layout_height=\"wrap_content\"\n" +
     86                 "    android:orientation=\"vertical\">\n" +
     87                 "\n" +
     88                 "    <TextView\n" +
     89                 "        android:id=\"@+id/charge_and_estimation\"\n" +
     90                 "        android:layout_width=\"match_parent\"\n" +
     91                 "        android:layout_height=\"wrap_content\"\n" +
     92                 "        android:textColor=\"#ff0\" />\n" +
     93                 "\n" +
     94                 "    <com.android.systemui.ResizingSpace\n" +
     95                 "        android:layout_width=\"match_parent\"\n" +
     96                 "        android:layout_height=\"@dimen/battery_detail_graph_space_top\" />\n" +
     97                 "\n" +
     98                 "    <com.android.settingslib.graph.UsageView\n" +
     99                 "        android:id=\"@+id/battery_usage\"\n" +
    100                 "        android:layout_width=\"match_parent\"\n" +
    101                 "        android:layout_height=\"141dp\"\n" +
    102                 "        systemui:sideLabels=\"@array/battery_labels\"\n" +
    103                 "        android:colorAccent=\"?android:attr/colorAccent\"\n" +
    104                 "        systemui:textColor=\"#66FFFFFF\" />\n" +
    105                 "</LinearLayout>"));
    106         assertEquals(expected, result);
    107     }
    108 
    109     public void testHardcodeColorInStyle() throws Exception {
    110         mEnabled = Collections.singleton(HardcodedColorDetector.ISSUE);
    111         String expected = "res/values/pxsp.xml:6: Error: Using hardcoded colors is not allowed [HardcodedColor]\n" +
    112                 "        <item name=\"android:textColor\">#b2ffffff</item>\n" +
    113                 "                                       ^\n" +
    114                 "res/values/pxsp.xml:7: Error: Using hardcoded colors is not allowed [HardcodedColor]\n" +
    115                 "        <item name=\"android:background\">#b2ffffff</item>\n" +
    116                 "                                        ^\n" +
    117                 "2 errors, 0 warnings\n";
    118         String result = lintProject(xml("res/values/pxsp.xml", "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
    119                 "<resources xmlns:android=\"http://schemas.android.com/apk/res/android\">\n" +
    120                 "    <style name=\"TextAppearance.StatusBar.Expanded.Date\">\n" +
    121                 "        <item name=\"android:textSize\">@dimen/qs_date_collapsed_size</item>\n" +
    122                 "        <item name=\"android:textStyle\">normal</item>\n" +
    123                 "        <item name=\"android:textColor\">#b2ffffff</item>\n" +
    124                 "        <item name=\"android:background\">#b2ffffff</item>\n" +
    125                 "    </style>\n" +
    126                 "</resources>"));
    127         assertEquals(expected, result);
    128     }
    129 
    130     public void testIndirectedColor() throws Exception {
    131         mEnabled = Collections.singleton(HardcodedColorDetector.ISSUE);
    132         String expected = "res/values/colors.xml:3: Error: Using hardcoded colors is not allowed [HardcodedColor]\n" +
    133                 "    <color name=\"color_red\">#ffffff</color>\n" +
    134                 "    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
    135                 "res/layout/layout_battery.xml:13: Error: Using hardcoded colors is not allowed [HardcodedColor]\n" +
    136                 "        android:textColor=\"@color/color_red\" />\n" +
    137                 "        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
    138                 "res/layout/layout_battery.xml:19: Error: Using hardcoded colors is not allowed [HardcodedColor]\n" +
    139                 "        systemui:textColor=\"#b2ffffff\" />\n" +
    140                 "        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
    141                 "3 errors, 0 warnings\n";
    142         String result = lintProject(xml("res/layout/layout_battery.xml", "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
    143                 "<LinearLayout\n" +
    144                 "    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
    145                 "    xmlns:systemui=\"http://schemas.android.com/apk/res-auto\"\n" +
    146                 "    android:layout_width=\"match_parent\"\n" +
    147                 "    android:layout_height=\"wrap_content\"\n" +
    148                 "    android:orientation=\"vertical\">\n" +
    149                 "\n" +
    150                 "    <TextView\n" +
    151                 "        android:id=\"@+id/charge_and_estimation\"\n" +
    152                 "        android:layout_width=\"match_parent\"\n" +
    153                 "        android:layout_height=\"wrap_content\"\n" +
    154                 "        android:textColor=\"@color/color_red\" />\n" +
    155                 "\n" +
    156                 "    <com.android.settingslib.graph.UsageView\n" +
    157                 "        android:id=\"@+id/battery_usage\"\n" +
    158                 "        android:layout_width=\"match_parent\"\n" +
    159                 "        android:layout_height=\"141dp\"\n" +
    160                 "        systemui:textColor=\"#b2ffffff\" />\n" +
    161                 "</LinearLayout>"),
    162                 xml("res/values/colors.xml","<resources>\n" +
    163                         "    <!-- Keyboard shortcuts colors -->\n" +
    164                         "    <color name=\"color_red\">#ffffff</color>\n" +
    165                         "    <color name=\"ksh_key_item_background\">@color/material_grey_100</color>\n" +
    166                         "</resources>\n"));
    167         assertEquals(expected, result);
    168     }
    169 
    170     public void testHardcodeColorInColorElement() throws Exception {
    171         mEnabled = Collections.singleton(HardcodedColorDetector.ISSUE);
    172         String expected = "res/values/colors.xml:3: Error: Using hardcoded colors is not allowed [HardcodedColor]\n" +
    173                 "    <color name=\"color_red\">#ffffff</color>\n" +
    174                 "    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
    175                 "1 errors, 0 warnings\n";
    176         String result = lintProject(xml("res/values/colors.xml", "<resources>\n" +
    177                 "    <!-- Keyboard shortcuts colors -->\n" +
    178                 "    <color name=\"color_red\">#ffffff</color>\n" +
    179                 "    <color name=\"ksh_key_item_background\">@color/material_grey_100</color>\n" +
    180                 "</resources>\n"));
    181         assertEquals(expected, result);
    182     }
    183 
    184     public void testHardcodeColorInVectorDrawable() throws Exception {
    185         mEnabled = Collections.singleton(HardcodedColorDetector.ISSUE);
    186         String expected = "res/values/colors.xml:2: Error: Using hardcoded colors is not allowed [HardcodedColor]\n" +
    187                 "        android:tint=\"#FFFFFF\">\n" +
    188                 "        ~~~~~~~~~~~~~~~~~~~~~~\n" +
    189                 "1 errors, 0 warnings\n";
    190         String result = lintProject(xml("res/values/colors.xml", "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
    191                 "        android:tint=\"#FFFFFF\">\n" +
    192                 "    <path\n" +
    193                 "        android:fillColor=\"#FFFFFF\"/>\n" +
    194                 "</vector>"));
    195         assertEquals(expected, result);
    196     }
    197 }
    198