aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2012-08-06 13:16:22 -0700
committerTor Norbye <tnorbye@google.com>2012-08-06 13:16:22 -0700
commit8ae549d926c4233479dc8f1cb268e45cf6284e05 (patch)
tree61cb2b27e59073f1371cdd8032a5c8b1348661a7
parent81245308f77fcaddb0498463cf477bcfe92ea508 (diff)
downloadsdk-8ae549d926c4233479dc8f1cb268e45cf6284e05.zip
sdk-8ae549d926c4233479dc8f1cb268e45cf6284e05.tar.gz
sdk-8ae549d926c4233479dc8f1cb268e45cf6284e05.tar.bz2
Update lint unit test golden files to contain more details
The lint golden files was using a custom unit test reporter which wrote out the test strings in alphabetical order. However, this output was missing some information such as the actual source lines containing the error and the particular error range underlined, which the CLI prints. This changeset replaces the unit test reporter with the CLI one, which not only has the benefit of providing more details in the unit tests (which for example shows that bytecode based issues correctly identify the right source level range), but it also tests the CLI reporter itself such as its sorting. Other than a minor fix to handling \r's in the CLI error output, this changeset does not contain any changes to any of the lint detectors, it just updates the golden files. Change-Id: Iae8f13a47efe6ba5e5cfd84af0dd548f78513879
-rw-r--r--lint/cli/src/com/android/tools/lint/Main.java47
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AbstractCheckTest.java125
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AccessibilityDetectorTest.java15
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AlwaysShowActionDetectorTest.java25
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AnnotationDetectorTest.java18
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ApiDetectorTest.java388
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ArraySizeDetectorTest.java18
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ButtonDetectorTest.java200
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ChildCountDetectorTest.java9
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ColorUsageDetectorTest.java14
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DeprecationDetectorTest.java46
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DetectMissingPrefixTest.java22
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DuplicateIdDetectorTest.java46
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ExtraTextDetectorTest.java10
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/FieldGetterDetectorTest.java44
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/FragmentDetectorTest.java26
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/GridLayoutDetectorTest.java6
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/HandlerDetectorTest.java10
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/HardcodedDebugModeDetectorTest.java9
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/HardcodedValuesDetectorTest.java19
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/IconDetectorTest.java54
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/InefficientWeightDetectorTest.java28
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/JavaPerformanceDetectorTest.java78
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ManifestOrderDetectorTest.java149
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/MathDetectorTest.java26
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/MergeRootFrameLayoutDetectorTest.java28
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/NamespaceDetectorTest.java51
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/NestedScrollingWidgetDetectorTest.java9
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/NonInternationalizedSmsDetectorTest.java6
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ObsoleteLayoutParamsDetectorTest.java52
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/OnClickDetectorTest.java38
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/OverdrawDetectorTest.java18
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/PrivateKeyDetectorTest.java4
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/PrivateResourceDetectorTest.java9
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ProguardDetectorTest.java55
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/PxUsageDetectorTest.java38
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/RegistrationDetectorTest.java40
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ScrollViewChildDetectorTest.java7
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SdCardDetectorTest.java54
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SecureRandomDetectorTest.java30
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SecurityDetectorTest.java86
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SetJavaScriptEnabledDetectorTest.java14
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SharedPrefsDetectorTest.java10
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/StateListDetectorTest.java24
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/StringFormatDetectorTest.java54
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/StyleCycleDetectorTest.java13
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TextFieldDetectorTest.java6
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TextViewDetectorTest.java86
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ToastDetectorTest.java18
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TooManyViewsDetectorTest.java18
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TranslationDetectorTest.java67
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TypoDetectorTest.java100
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TypographyDetectorTest.java66
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/UnusedResourceDetectorTest.java66
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/UseCompoundDrawableDetectorTest.java9
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/UselessViewDetectorTest.java22
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/Utf8DetectorTest.java14
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ViewConstructorDetectorTest.java17
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ViewTypeDetectorTest.java6
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WakelockDetectorTest.java45
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WrongIdDetectorTest.java36
-rw-r--r--lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WrongImportDetectorTest.java6
62 files changed, 1893 insertions, 761 deletions
diff --git a/lint/cli/src/com/android/tools/lint/Main.java b/lint/cli/src/com/android/tools/lint/Main.java
index 6cdb689..20825cb 100644
--- a/lint/cli/src/com/android/tools/lint/Main.java
+++ b/lint/cli/src/com/android/tools/lint/Main.java
@@ -105,29 +105,29 @@ public class Main extends LintClient {
private static final int ERRNO_HELP = 4;
private static final int ERRNO_INVALIDARGS = 5;
- private List<Warning> mWarnings = new ArrayList<Warning>();
- private Set<String> mSuppress = new HashSet<String>();
- private Set<String> mEnabled = new HashSet<String>();
+ protected List<Warning> mWarnings = new ArrayList<Warning>();
+ protected Set<String> mSuppress = new HashSet<String>();
+ protected Set<String> mEnabled = new HashSet<String>();
/** If non-null, only run the specified checks (possibly modified by enable/disables) */
- private Set<String> mCheck = null;
- private boolean mHasErrors;
- private boolean mSetExitCode;
- private boolean mFullPath;
- private int mErrorCount;
- private int mWarningCount;
- private boolean mShowLines = true;
- private List<Reporter> mReporters = Lists.newArrayList();
- private boolean mQuiet;
- private boolean mWarnAll;
- private boolean mNoWarnings;
- private boolean mAllErrors;
- private List<File> mSources;
- private List<File> mClasses;
-
- private Configuration mDefaultConfiguration;
- private IssueRegistry mRegistry;
- private LintDriver mDriver;
- private boolean mShowAll;
+ protected Set<String> mCheck = null;
+ protected boolean mHasErrors;
+ protected boolean mSetExitCode;
+ protected boolean mFullPath;
+ protected int mErrorCount;
+ protected int mWarningCount;
+ protected boolean mShowLines = true;
+ protected List<Reporter> mReporters = Lists.newArrayList();
+ protected boolean mQuiet;
+ protected boolean mWarnAll;
+ protected boolean mNoWarnings;
+ protected boolean mAllErrors;
+ protected List<File> mSources;
+ protected List<File> mClasses;
+
+ protected Configuration mDefaultConfiguration;
+ protected IssueRegistry mRegistry;
+ protected LintDriver mDriver;
+ protected boolean mShowAll;
/** Creates a CLI driver */
public Main() {
@@ -1149,6 +1149,9 @@ public class Main extends LintClient {
static String getLineOfOffset(String contents, int offset) {
int end = contents.indexOf('\n', offset);
+ if (end == -1) {
+ end = contents.indexOf('\r', offset);
+ }
return contents.substring(offset, end != -1 ? end : contents.length());
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AbstractCheckTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AbstractCheckTest.java
index da84ae1..4351a7e 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AbstractCheckTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AbstractCheckTest.java
@@ -19,6 +19,8 @@ package com.android.tools.lint.checks;
import com.android.tools.lint.LintCliXmlParser;
import com.android.tools.lint.LombokParser;
import com.android.tools.lint.Main;
+import com.android.tools.lint.Reporter;
+import com.android.tools.lint.TextReporter;
import com.android.tools.lint.client.api.Configuration;
import com.android.tools.lint.client.api.IDomParser;
import com.android.tools.lint.client.api.IJavaParser;
@@ -28,7 +30,6 @@ import com.android.tools.lint.detector.api.Context;
import com.android.tools.lint.detector.api.Detector;
import com.android.tools.lint.detector.api.Issue;
import com.android.tools.lint.detector.api.Location;
-import com.android.tools.lint.detector.api.Position;
import com.android.tools.lint.detector.api.Project;
import com.android.tools.lint.detector.api.Severity;
import com.google.common.io.Files;
@@ -38,6 +39,7 @@ import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
+import java.io.StringWriter;
import java.net.URISyntaxException;
import java.net.URL;
import java.security.CodeSource;
@@ -92,23 +94,7 @@ public abstract class AbstractCheckTest extends TestCase {
protected String checkLint(List<File> files) throws Exception {
mOutput = new StringBuilder();
TestLintClient lintClient = new TestLintClient();
- LintDriver driver = new LintDriver(new CustomIssueRegistry(), lintClient);
- driver.analyze(files, null /* scope */);
-
- List<String> errors = lintClient.getErrors();
- Collections.sort(errors);
- for (String error : errors) {
- if (mOutput.length() > 0) {
- mOutput.append('\n');
- }
- mOutput.append(error);
- }
-
- if (mOutput.length() == 0) {
- mOutput.append("No warnings.");
- }
-
- String result = mOutput.toString();
+ String result = lintClient.analyze(files);
// The output typically contains a few directory/filenames.
// On Windows we need to change the separators to the unix-style
@@ -269,84 +255,71 @@ public abstract class AbstractCheckTest extends TestCase {
}
public class TestLintClient extends Main {
- private List<String> mErrors = new ArrayList<String>();
+ private StringWriter mWriter = new StringWriter();
- public List<String> getErrors() {
- return mErrors;
+ TestLintClient() {
+ mReporters.add(new TextReporter(this, mWriter, false));
}
- @Override
- public void report(Context context, Issue issue, Severity severity, Location location,
- String message, Object data) {
- StringBuilder sb = new StringBuilder();
+ public String analyze(List<File> files) throws Exception {
+ mDriver = new LintDriver(new CustomIssueRegistry(), this);
+ mDriver.analyze(files, null /* scope */);
- if (issue == IssueRegistry.LINT_ERROR) {
- return;
+ Collections.sort(mWarnings);
+
+ for (Reporter reporter : mReporters) {
+ reporter.write(mErrorCount, mWarningCount, mWarnings);
}
- if (location != null && location.getFile() != null) {
- // Include parent directory for locations that have alternates, since
- // frequently the file name is the same across different resource folders
- // and we want to make sure in the tests that we're indeed passing the
- // right files in as secondary locations
- if (location.getSecondary() != null || includeParentPath()) {
- sb.append(location.getFile().getParentFile().getName() + "/"
- + location.getFile().getName());
- } else {
- sb.append(location.getFile().getName());
- }
+ mOutput.append(mWriter.toString());
- sb.append(':');
+ if (mOutput.length() == 0) {
+ mOutput.append("No warnings.");
+ }
- Position startPosition = location.getStart();
- if (startPosition != null) {
- int line = startPosition.getLine();
- if (line >= 0) {
- // line is 0-based, should display 1-based
- sb.append(Integer.toString(line + 1));
- sb.append(':');
- }
- }
+ String result = mOutput.toString();
+ if (result.equals("\nNo issues found.\n")) {
+ result = "No warnings.";
+ }
- sb.append(' ');
+ if (sTempDir != null && result.contains(sTempDir.getPath())) {
+ result = result.replace(sTempDir.getCanonicalFile().getPath(), "/TESTROOT");
+ result = result.replace(sTempDir.getAbsoluteFile().getPath(), "/TESTROOT");
+ result = result.replace(sTempDir.getPath(), "/TESTROOT");
+ }
+
+ return result;
+ }
+
+ public String getErrors() throws Exception {
+ return mWriter.toString();
+ }
+
+ @Override
+ public void report(Context context, Issue issue, Severity severity, Location location,
+ String message, Object data) {
+ if (issue == IssueRegistry.LINT_ERROR) {
+ return;
}
if (severity == Severity.FATAL) {
// Treat fatal errors like errors in the golden files.
severity = Severity.ERROR;
}
- sb.append(severity.getDescription());
- sb.append(": ");
-
- sb.append(message);
+ // For messages into all secondary locations to ensure they get
+ // specifically included in the text report
if (location != null && location.getSecondary() != null) {
- location = location.getSecondary();
- while (location != null) {
- if (location.getMessage() != null) {
- sb.append('\n');
- sb.append("=> ");
- sb.append(location.getFile().getParentFile().getName() + "/"
- + location.getFile().getName());
- sb.append(':');
- Position startPosition = location.getStart();
- if (startPosition != null) {
- int line = startPosition.getLine();
- if (line >= 0) {
- // line is 0-based, should display 1-based
- sb.append(Integer.toString(line + 1));
- sb.append(':');
- }
- }
- sb.append(' ');
- if (location.getMessage() != null) {
- sb.append(location.getMessage());
- }
+ Location l = location.getSecondary();
+ while (l != null) {
+ if (l.getMessage() == null) {
+ l.setMessage("<No location-specific message");
}
- location = location.getSecondary();
+ l = l.getSecondary();
}
}
- mErrors.add(sb.toString());
+
+ super.report(context, issue, severity, location, message, data);
}
@Override
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AccessibilityDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AccessibilityDetectorTest.java
index 9ba2826..9f8d13d 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AccessibilityDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AccessibilityDetectorTest.java
@@ -27,10 +27,15 @@ public class AccessibilityDetectorTest extends AbstractCheckTest {
public void testAccessibility() throws Exception {
assertEquals(
- "accessibility.xml:4: Warning: [Accessibility] Missing contentDescription " +
- "attribute on image\n" +
- "accessibility.xml:5: Warning: [Accessibility] Missing contentDescription " +
- "attribute on image",
- lintProject("res/layout/accessibility.xml"));
+ "res/layout/accessibility.xml:4: Warning: [Accessibility] Missing contentDescription attribute on image [ContentDescription]\n" +
+ " <ImageView android:id=\"@+id/android_logo\" android:layout_width=\"wrap_content\" android:layout_height=\"wrap_content\" android:src=\"@drawable/android_button\" android:focusable=\"false\" android:clickable=\"false\" android:layout_weight=\"1.0\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/accessibility.xml:5: Warning: [Accessibility] Missing contentDescription attribute on image [ContentDescription]\n" +
+ " <ImageButton android:importantForAccessibility=\"yes\" android:id=\"@+id/android_logo2\" android:layout_width=\"wrap_content\" android:layout_height=\"wrap_content\" android:src=\"@drawable/android_button\" android:focusable=\"false\" android:clickable=\"false\" android:layout_weight=\"1.0\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 2 warnings\n" +
+ "",
+
+ lintProject("res/layout/accessibility.xml"));
}
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AlwaysShowActionDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AlwaysShowActionDetectorTest.java
index f38500b..51273d1 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AlwaysShowActionDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AlwaysShowActionDetectorTest.java
@@ -27,22 +27,39 @@ public class AlwaysShowActionDetectorTest extends AbstractCheckTest {
public void testXmlMenus() throws Exception {
assertEquals(
- "menu-land/actions.xml:6: Warning: Prefer \"ifRoom\" instead of \"always\"",
+ "res/menu-land/actions.xml:6: Warning: Prefer \"ifRoom\" instead of \"always\" [AlwaysShowAction]\n" +
+ " android:showAsAction=\"always|collapseActionView\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ " res/menu-land/actions.xml:13: <No location-specific message\n" +
+ " res/menu-land/actions.xml:18: <No location-specific message\n" +
+ " res/menu-land/actions.xml:54: <No location-specific message\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject("res/menu-land/actions.xml"));
}
public void testXmlMenusWithFlags() throws Exception {
assertEquals(
- "menu-land/actions2.xml:6: Warning: Prefer \"ifRoom\" instead of \"always\"",
+ "res/menu-land/actions2.xml:6: Warning: Prefer \"ifRoom\" instead of \"always\" [AlwaysShowAction]\n" +
+ " android:showAsAction=\"always|collapseActionView\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ " res/menu-land/actions2.xml:13: <No location-specific message\n" +
+ " res/menu-land/actions2.xml:18: <No location-specific message\n" +
+ " res/menu-land/actions2.xml:54: <No location-specific message\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject("res/menu-land/actions2.xml"));
}
public void testJavaFail() throws Exception {
assertEquals(
- "ActionTest1.java:7: Warning: Prefer \"SHOW_AS_ACTION_IF_ROOM\" instead of " +
- "\"SHOW_AS_ACTION_ALWAYS\"",
+ "src/test/pkg/ActionTest1.java:7: Warning: Prefer \"SHOW_AS_ACTION_IF_ROOM\" instead of \"SHOW_AS_ACTION_ALWAYS\" [AlwaysShowAction]\n" +
+ " System.out.println(MenuItem.SHOW_AS_ACTION_ALWAYS);\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
// Only references to ALWAYS
lintProject("src/test/pkg/ActionTest1.java.txt=>src/test/pkg/ActionTest1.java"));
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AnnotationDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AnnotationDetectorTest.java
index 962b559..4c9d34d 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AnnotationDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/AnnotationDetectorTest.java
@@ -25,10 +25,20 @@ import java.util.List;
public class AnnotationDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "WrongAnnotation.java:11: Error: The @SuppresLint annotation cannot be used on a local variable with the lint check 'NewApi': move out to the surrounding method\n" +
- "WrongAnnotation.java:13: Error: The @SuppresLint annotation cannot be used on a local variable with the lint check 'NewApi': move out to the surrounding method\n" +
- "WrongAnnotation.java:8: Error: The @SuppresLint annotation cannot be used on a local variable with the lint check 'NewApi': move out to the surrounding method\n" +
- "WrongAnnotation.java:9: Error: The @SuppresLint annotation cannot be used on a local variable with the lint check 'NewApi': move out to the surrounding method",
+ "src/test/pkg/WrongAnnotation.java:8: Error: The @SuppresLint annotation cannot be used on a local variable with the lint check 'NewApi': move out to the surrounding method [LocalSuppress]\n" +
+ " public static void foobar(View view, @SuppressLint(\"NewApi\") int foo) { // Invalid: class-file check\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/WrongAnnotation.java:9: Error: The @SuppresLint annotation cannot be used on a local variable with the lint check 'NewApi': move out to the surrounding method [LocalSuppress]\n" +
+ " @SuppressLint(\"NewApi\") // Invalid\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/WrongAnnotation.java:11: Error: The @SuppresLint annotation cannot be used on a local variable with the lint check 'NewApi': move out to the surrounding method [LocalSuppress]\n" +
+ " @SuppressLint({\"SdCardPath\", \"NewApi\"}) // Invalid: class-file based check on local variable\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/WrongAnnotation.java:13: Error: The @SuppresLint annotation cannot be used on a local variable with the lint check 'NewApi': move out to the surrounding method [LocalSuppress]\n" +
+ " @android.annotation.SuppressLint({\"SdCardPath\", \"NewApi\"}) // Invalid (FQN)\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "4 errors, 0 warnings\n" +
+ "",
lintProject(
"src/test/pkg/WrongAnnotation.java.txt=>src/test/pkg/WrongAnnotation.java"
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ApiDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ApiDetectorTest.java
index 686c730..b6cc828 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ApiDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ApiDetectorTest.java
@@ -27,20 +27,36 @@ public class ApiDetectorTest extends AbstractCheckTest {
public void testXmlApi1() throws Exception {
assertEquals(
- "colors.xml:9: Error: @android:color/holo_red_light requires API level 14 (current min is 1)\n" +
- "layout.xml:15: Error: View requires API level 11 (current min is 1): <CalendarView>\n" +
- "layout.xml:21: Error: View requires API level 14 (current min is 1): <GridLayout>\n" +
- "layout.xml:22: Error: @android:attr/actionBarSplitStyle requires API level 14 (current min is 1)\n" +
- "layout.xml:23: Error: @android:color/holo_red_light requires API level 14 (current min is 1)\n" +
- "layout.xml:9: Error: View requires API level 5 (current min is 1): <QuickContactBadge>\n" +
- "themes.xml:9: Error: @android:color/holo_red_light requires API level 14 (current min is 1)",
+ "res/color/colors.xml:9: Error: @android:color/holo_red_light requires API level 14 (current min is 1) [NewApi]\n" +
+ " <item name=\"android:windowBackground\"> @android:color/holo_red_light </item>\n" +
+ " ^\n" +
+ "res/layout/layout.xml:9: Error: View requires API level 5 (current min is 1): <QuickContactBadge> [NewApi]\n" +
+ " <QuickContactBadge\n" +
+ " ^\n" +
+ "res/layout/layout.xml:15: Error: View requires API level 11 (current min is 1): <CalendarView> [NewApi]\n" +
+ " <CalendarView\n" +
+ " ^\n" +
+ "res/layout/layout.xml:21: Error: View requires API level 14 (current min is 1): <GridLayout> [NewApi]\n" +
+ " <GridLayout\n" +
+ " ^\n" +
+ "res/layout/layout.xml:22: Error: @android:attr/actionBarSplitStyle requires API level 14 (current min is 1) [NewApi]\n" +
+ " foo=\"@android:attr/actionBarSplitStyle\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/layout.xml:23: Error: @android:color/holo_red_light requires API level 14 (current min is 1) [NewApi]\n" +
+ " bar=\"@android:color/holo_red_light\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/values/themes.xml:9: Error: @android:color/holo_red_light requires API level 14 (current min is 1) [NewApi]\n" +
+ " <item name=\"android:windowBackground\"> @android:color/holo_red_light </item>\n" +
+ " ^\n" +
+ "7 errors, 0 warnings\n" +
+ "",
- lintProject(
- "apicheck/minsdk1.xml=>AndroidManifest.xml",
- "apicheck/layout.xml=>res/layout/layout.xml",
- "apicheck/themes.xml=>res/values/themes.xml",
- "apicheck/themes.xml=>res/color/colors.xml"
- ));
+ lintProject(
+ "apicheck/minsdk1.xml=>AndroidManifest.xml",
+ "apicheck/layout.xml=>res/layout/layout.xml",
+ "apicheck/themes.xml=>res/values/themes.xml",
+ "apicheck/themes.xml=>res/color/colors.xml"
+ ));
}
public void testXmlApi14() throws Exception {
@@ -57,18 +73,30 @@ public class ApiDetectorTest extends AbstractCheckTest {
public void testXmlApiFolderVersion11() throws Exception {
assertEquals(
- "colors.xml:9: Error: @android:color/holo_red_light requires API level 14 (current min is 1)\n" +
- "layout.xml:21: Error: View requires API level 14 (current min is 1): <GridLayout>\n" +
- "layout.xml:22: Error: @android:attr/actionBarSplitStyle requires API level 14 (current min is 1)\n" +
- "layout.xml:23: Error: @android:color/holo_red_light requires API level 14 (current min is 1)\n" +
- "themes.xml:9: Error: @android:color/holo_red_light requires API level 14 (current min is 1)",
+ "res/color-v11/colors.xml:9: Error: @android:color/holo_red_light requires API level 14 (current min is 1) [NewApi]\n" +
+ " <item name=\"android:windowBackground\"> @android:color/holo_red_light </item>\n" +
+ " ^\n" +
+ "res/layout-v11/layout.xml:21: Error: View requires API level 14 (current min is 1): <GridLayout> [NewApi]\n" +
+ " <GridLayout\n" +
+ " ^\n" +
+ "res/layout-v11/layout.xml:22: Error: @android:attr/actionBarSplitStyle requires API level 14 (current min is 1) [NewApi]\n" +
+ " foo=\"@android:attr/actionBarSplitStyle\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout-v11/layout.xml:23: Error: @android:color/holo_red_light requires API level 14 (current min is 1) [NewApi]\n" +
+ " bar=\"@android:color/holo_red_light\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/values-v11/themes.xml:9: Error: @android:color/holo_red_light requires API level 14 (current min is 1) [NewApi]\n" +
+ " <item name=\"android:windowBackground\"> @android:color/holo_red_light </item>\n" +
+ " ^\n" +
+ "5 errors, 0 warnings\n" +
+ "",
- lintProject(
- "apicheck/minsdk1.xml=>AndroidManifest.xml",
- "apicheck/layout.xml=>res/layout-v11/layout.xml",
- "apicheck/themes.xml=>res/values-v11/themes.xml",
- "apicheck/themes.xml=>res/color-v11/colors.xml"
- ));
+ lintProject(
+ "apicheck/minsdk1.xml=>AndroidManifest.xml",
+ "apicheck/layout.xml=>res/layout-v11/layout.xml",
+ "apicheck/themes.xml=>res/values-v11/themes.xml",
+ "apicheck/themes.xml=>res/color-v11/colors.xml"
+ ));
}
public void testXmlApiFolderVersion14() throws Exception {
@@ -85,18 +113,44 @@ public class ApiDetectorTest extends AbstractCheckTest {
public void testApi1() throws Exception {
assertEquals(
- "ApiCallTest.java:18: Error: Class requires API level 8 (current min is 1): org.w3c.dom.DOMLocator\n" +
- "ApiCallTest.java:20: Error: Call requires API level 11 (current min is 1): android.app.Activity#getActionBar\n" +
- "ApiCallTest.java:23: Error: Class requires API level 8 (current min is 1): org.w3c.dom.DOMError\n" +
- "ApiCallTest.java:24: Error: Class requires API level 8 (current min is 1): org.w3c.dom.DOMErrorHandler\n" +
- "ApiCallTest.java:27: Error: Call requires API level 3 (current min is 1): android.widget.Chronometer#getOnChronometerTickListener\n" +
- "ApiCallTest.java:30: Error: Call requires API level 11 (current min is 1): android.widget.Chronometer#setTextIsSelectable\n" +
- "ApiCallTest.java:33: Error: Field requires API level 11 (current min is 1): dalvik.bytecode.OpcodeInfo#MAXIMUM_VALUE\n" +
- "ApiCallTest.java:38: Error: Class requires API level 14 (current min is 1): android.app.ApplicationErrorReport.BatteryInfo\n" +
- "ApiCallTest.java:38: Error: Field requires API level 14 (current min is 1): android.app.ApplicationErrorReport#batteryInfo\n" +
- "ApiCallTest.java:41: Error: Field requires API level 11 (current min is 1): android.graphics.PorterDuff$Mode#OVERLAY\n" +
- "ApiCallTest.java:45: Error: Class requires API level 14 (current min is 1): android.widget.GridLayout\n" +
- "ApiCallTest.java:49: Error: Class requires API level 14 (current min is 1): android.app.ApplicationErrorReport",
+ "src/foo/bar/ApiCallTest.java:18: Error: Class requires API level 8 (current min is 1): org.w3c.dom.DOMLocator [NewApi]\n" +
+ " public void method(Chronometer chronometer, DOMLocator locator) {\n" +
+ " ~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:20: Error: Call requires API level 11 (current min is 1): android.app.Activity#getActionBar [NewApi]\n" +
+ " getActionBar(); // API 11\n" +
+ " ~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:23: Error: Class requires API level 8 (current min is 1): org.w3c.dom.DOMError [NewApi]\n" +
+ " DOMError error = null; // API 8\n" +
+ " ~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:24: Error: Class requires API level 8 (current min is 1): org.w3c.dom.DOMErrorHandler [NewApi]\n" +
+ " Class<?> clz = DOMErrorHandler.class; // API 8\n" +
+ " ~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:27: Error: Call requires API level 3 (current min is 1): android.widget.Chronometer#getOnChronometerTickListener [NewApi]\n" +
+ " chronometer.getOnChronometerTickListener(); // API 3 \n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:30: Error: Call requires API level 11 (current min is 1): android.widget.Chronometer#setTextIsSelectable [NewApi]\n" +
+ " chronometer.setTextIsSelectable(true); // API 11\n" +
+ " ~~~~~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:33: Error: Field requires API level 11 (current min is 1): dalvik.bytecode.OpcodeInfo#MAXIMUM_VALUE [NewApi]\n" +
+ " int field = OpcodeInfo.MAXIMUM_VALUE; // API 11\n" +
+ " ~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:38: Error: Class requires API level 14 (current min is 1): android.app.ApplicationErrorReport.BatteryInfo [NewApi]\n" +
+ " BatteryInfo batteryInfo = getReport().batteryInfo;\n" +
+ " ^\n" +
+ "src/foo/bar/ApiCallTest.java:38: Error: Field requires API level 14 (current min is 1): android.app.ApplicationErrorReport#batteryInfo [NewApi]\n" +
+ " BatteryInfo batteryInfo = getReport().batteryInfo;\n" +
+ " ~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:41: Error: Field requires API level 11 (current min is 1): android.graphics.PorterDuff$Mode#OVERLAY [NewApi]\n" +
+ " Mode mode = PorterDuff.Mode.OVERLAY; // API 11\n" +
+ " ~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:45: Error: Class requires API level 14 (current min is 1): android.widget.GridLayout [NewApi]\n" +
+ " GridLayout getGridLayout() { // API 14\n" +
+ " ~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:49: Error: Class requires API level 14 (current min is 1): android.app.ApplicationErrorReport [NewApi]\n" +
+ " private ApplicationErrorReport getReport() {\n" +
+ " ~~~~~~~~~\n" +
+ "12 errors, 0 warnings\n" +
+ "",
lintProject(
"apicheck/classpath=>.classpath",
@@ -108,18 +162,44 @@ public class ApiDetectorTest extends AbstractCheckTest {
public void testApi2() throws Exception {
assertEquals(
- "ApiCallTest.java:18: Error: Class requires API level 8 (current min is 2): org.w3c.dom.DOMLocator\n" +
- "ApiCallTest.java:20: Error: Call requires API level 11 (current min is 2): android.app.Activity#getActionBar\n" +
- "ApiCallTest.java:23: Error: Class requires API level 8 (current min is 2): org.w3c.dom.DOMError\n" +
- "ApiCallTest.java:24: Error: Class requires API level 8 (current min is 2): org.w3c.dom.DOMErrorHandler\n" +
- "ApiCallTest.java:27: Error: Call requires API level 3 (current min is 2): android.widget.Chronometer#getOnChronometerTickListener\n" +
- "ApiCallTest.java:30: Error: Call requires API level 11 (current min is 2): android.widget.Chronometer#setTextIsSelectable\n" +
- "ApiCallTest.java:33: Error: Field requires API level 11 (current min is 2): dalvik.bytecode.OpcodeInfo#MAXIMUM_VALUE\n" +
- "ApiCallTest.java:38: Error: Class requires API level 14 (current min is 2): android.app.ApplicationErrorReport.BatteryInfo\n" +
- "ApiCallTest.java:38: Error: Field requires API level 14 (current min is 2): android.app.ApplicationErrorReport#batteryInfo\n" +
- "ApiCallTest.java:41: Error: Field requires API level 11 (current min is 2): android.graphics.PorterDuff$Mode#OVERLAY\n" +
- "ApiCallTest.java:45: Error: Class requires API level 14 (current min is 2): android.widget.GridLayout\n" +
- "ApiCallTest.java:49: Error: Class requires API level 14 (current min is 2): android.app.ApplicationErrorReport",
+ "src/foo/bar/ApiCallTest.java:18: Error: Class requires API level 8 (current min is 2): org.w3c.dom.DOMLocator [NewApi]\n" +
+ " public void method(Chronometer chronometer, DOMLocator locator) {\n" +
+ " ~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:20: Error: Call requires API level 11 (current min is 2): android.app.Activity#getActionBar [NewApi]\n" +
+ " getActionBar(); // API 11\n" +
+ " ~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:23: Error: Class requires API level 8 (current min is 2): org.w3c.dom.DOMError [NewApi]\n" +
+ " DOMError error = null; // API 8\n" +
+ " ~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:24: Error: Class requires API level 8 (current min is 2): org.w3c.dom.DOMErrorHandler [NewApi]\n" +
+ " Class<?> clz = DOMErrorHandler.class; // API 8\n" +
+ " ~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:27: Error: Call requires API level 3 (current min is 2): android.widget.Chronometer#getOnChronometerTickListener [NewApi]\n" +
+ " chronometer.getOnChronometerTickListener(); // API 3 \n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:30: Error: Call requires API level 11 (current min is 2): android.widget.Chronometer#setTextIsSelectable [NewApi]\n" +
+ " chronometer.setTextIsSelectable(true); // API 11\n" +
+ " ~~~~~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:33: Error: Field requires API level 11 (current min is 2): dalvik.bytecode.OpcodeInfo#MAXIMUM_VALUE [NewApi]\n" +
+ " int field = OpcodeInfo.MAXIMUM_VALUE; // API 11\n" +
+ " ~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:38: Error: Class requires API level 14 (current min is 2): android.app.ApplicationErrorReport.BatteryInfo [NewApi]\n" +
+ " BatteryInfo batteryInfo = getReport().batteryInfo;\n" +
+ " ^\n" +
+ "src/foo/bar/ApiCallTest.java:38: Error: Field requires API level 14 (current min is 2): android.app.ApplicationErrorReport#batteryInfo [NewApi]\n" +
+ " BatteryInfo batteryInfo = getReport().batteryInfo;\n" +
+ " ~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:41: Error: Field requires API level 11 (current min is 2): android.graphics.PorterDuff$Mode#OVERLAY [NewApi]\n" +
+ " Mode mode = PorterDuff.Mode.OVERLAY; // API 11\n" +
+ " ~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:45: Error: Class requires API level 14 (current min is 2): android.widget.GridLayout [NewApi]\n" +
+ " GridLayout getGridLayout() { // API 14\n" +
+ " ~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:49: Error: Class requires API level 14 (current min is 2): android.app.ApplicationErrorReport [NewApi]\n" +
+ " private ApplicationErrorReport getReport() {\n" +
+ " ~~~~~~~~~\n" +
+ "12 errors, 0 warnings\n" +
+ "",
lintProject(
"apicheck/classpath=>.classpath",
@@ -131,17 +211,41 @@ public class ApiDetectorTest extends AbstractCheckTest {
public void testApi4() throws Exception {
assertEquals(
- "ApiCallTest.java:18: Error: Class requires API level 8 (current min is 4): org.w3c.dom.DOMLocator\n" +
- "ApiCallTest.java:20: Error: Call requires API level 11 (current min is 4): android.app.Activity#getActionBar\n" +
- "ApiCallTest.java:23: Error: Class requires API level 8 (current min is 4): org.w3c.dom.DOMError\n" +
- "ApiCallTest.java:24: Error: Class requires API level 8 (current min is 4): org.w3c.dom.DOMErrorHandler\n" +
- "ApiCallTest.java:30: Error: Call requires API level 11 (current min is 4): android.widget.Chronometer#setTextIsSelectable\n" +
- "ApiCallTest.java:33: Error: Field requires API level 11 (current min is 4): dalvik.bytecode.OpcodeInfo#MAXIMUM_VALUE\n" +
- "ApiCallTest.java:38: Error: Class requires API level 14 (current min is 4): android.app.ApplicationErrorReport.BatteryInfo\n" +
- "ApiCallTest.java:38: Error: Field requires API level 14 (current min is 4): android.app.ApplicationErrorReport#batteryInfo\n" +
- "ApiCallTest.java:41: Error: Field requires API level 11 (current min is 4): android.graphics.PorterDuff$Mode#OVERLAY\n" +
- "ApiCallTest.java:45: Error: Class requires API level 14 (current min is 4): android.widget.GridLayout\n" +
- "ApiCallTest.java:49: Error: Class requires API level 14 (current min is 4): android.app.ApplicationErrorReport",
+ "src/foo/bar/ApiCallTest.java:18: Error: Class requires API level 8 (current min is 4): org.w3c.dom.DOMLocator [NewApi]\n" +
+ " public void method(Chronometer chronometer, DOMLocator locator) {\n" +
+ " ~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:20: Error: Call requires API level 11 (current min is 4): android.app.Activity#getActionBar [NewApi]\n" +
+ " getActionBar(); // API 11\n" +
+ " ~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:23: Error: Class requires API level 8 (current min is 4): org.w3c.dom.DOMError [NewApi]\n" +
+ " DOMError error = null; // API 8\n" +
+ " ~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:24: Error: Class requires API level 8 (current min is 4): org.w3c.dom.DOMErrorHandler [NewApi]\n" +
+ " Class<?> clz = DOMErrorHandler.class; // API 8\n" +
+ " ~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:30: Error: Call requires API level 11 (current min is 4): android.widget.Chronometer#setTextIsSelectable [NewApi]\n" +
+ " chronometer.setTextIsSelectable(true); // API 11\n" +
+ " ~~~~~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:33: Error: Field requires API level 11 (current min is 4): dalvik.bytecode.OpcodeInfo#MAXIMUM_VALUE [NewApi]\n" +
+ " int field = OpcodeInfo.MAXIMUM_VALUE; // API 11\n" +
+ " ~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:38: Error: Class requires API level 14 (current min is 4): android.app.ApplicationErrorReport.BatteryInfo [NewApi]\n" +
+ " BatteryInfo batteryInfo = getReport().batteryInfo;\n" +
+ " ^\n" +
+ "src/foo/bar/ApiCallTest.java:38: Error: Field requires API level 14 (current min is 4): android.app.ApplicationErrorReport#batteryInfo [NewApi]\n" +
+ " BatteryInfo batteryInfo = getReport().batteryInfo;\n" +
+ " ~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:41: Error: Field requires API level 11 (current min is 4): android.graphics.PorterDuff$Mode#OVERLAY [NewApi]\n" +
+ " Mode mode = PorterDuff.Mode.OVERLAY; // API 11\n" +
+ " ~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:45: Error: Class requires API level 14 (current min is 4): android.widget.GridLayout [NewApi]\n" +
+ " GridLayout getGridLayout() { // API 14\n" +
+ " ~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:49: Error: Class requires API level 14 (current min is 4): android.app.ApplicationErrorReport [NewApi]\n" +
+ " private ApplicationErrorReport getReport() {\n" +
+ " ~~~~~~~~~\n" +
+ "11 errors, 0 warnings\n" +
+ "",
lintProject(
"apicheck/classpath=>.classpath",
@@ -153,14 +257,32 @@ public class ApiDetectorTest extends AbstractCheckTest {
public void testApi10() throws Exception {
assertEquals(
- "ApiCallTest.java:20: Error: Call requires API level 11 (current min is 10): android.app.Activity#getActionBar\n" +
- "ApiCallTest.java:30: Error: Call requires API level 11 (current min is 10): android.widget.Chronometer#setTextIsSelectable\n" +
- "ApiCallTest.java:33: Error: Field requires API level 11 (current min is 10): dalvik.bytecode.OpcodeInfo#MAXIMUM_VALUE\n" +
- "ApiCallTest.java:38: Error: Class requires API level 14 (current min is 10): android.app.ApplicationErrorReport.BatteryInfo\n" +
- "ApiCallTest.java:38: Error: Field requires API level 14 (current min is 10): android.app.ApplicationErrorReport#batteryInfo\n" +
- "ApiCallTest.java:41: Error: Field requires API level 11 (current min is 10): android.graphics.PorterDuff$Mode#OVERLAY\n" +
- "ApiCallTest.java:45: Error: Class requires API level 14 (current min is 10): android.widget.GridLayout\n" +
- "ApiCallTest.java:49: Error: Class requires API level 14 (current min is 10): android.app.ApplicationErrorReport",
+ "src/foo/bar/ApiCallTest.java:20: Error: Call requires API level 11 (current min is 10): android.app.Activity#getActionBar [NewApi]\n" +
+ " getActionBar(); // API 11\n" +
+ " ~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:30: Error: Call requires API level 11 (current min is 10): android.widget.Chronometer#setTextIsSelectable [NewApi]\n" +
+ " chronometer.setTextIsSelectable(true); // API 11\n" +
+ " ~~~~~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:33: Error: Field requires API level 11 (current min is 10): dalvik.bytecode.OpcodeInfo#MAXIMUM_VALUE [NewApi]\n" +
+ " int field = OpcodeInfo.MAXIMUM_VALUE; // API 11\n" +
+ " ~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:38: Error: Class requires API level 14 (current min is 10): android.app.ApplicationErrorReport.BatteryInfo [NewApi]\n" +
+ " BatteryInfo batteryInfo = getReport().batteryInfo;\n" +
+ " ^\n" +
+ "src/foo/bar/ApiCallTest.java:38: Error: Field requires API level 14 (current min is 10): android.app.ApplicationErrorReport#batteryInfo [NewApi]\n" +
+ " BatteryInfo batteryInfo = getReport().batteryInfo;\n" +
+ " ~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:41: Error: Field requires API level 11 (current min is 10): android.graphics.PorterDuff$Mode#OVERLAY [NewApi]\n" +
+ " Mode mode = PorterDuff.Mode.OVERLAY; // API 11\n" +
+ " ~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:45: Error: Class requires API level 14 (current min is 10): android.widget.GridLayout [NewApi]\n" +
+ " GridLayout getGridLayout() { // API 14\n" +
+ " ~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest.java:49: Error: Class requires API level 14 (current min is 10): android.app.ApplicationErrorReport [NewApi]\n" +
+ " private ApplicationErrorReport getReport() {\n" +
+ " ~~~~~~~~~\n" +
+ "8 errors, 0 warnings\n" +
+ "",
lintProject(
"apicheck/classpath=>.classpath",
@@ -184,10 +306,20 @@ public class ApiDetectorTest extends AbstractCheckTest {
public void testInheritStatic() throws Exception {
assertEquals(
- "ApiCallTest5.java:16: Error: Call requires API level 11 (current min is 2): android.view.View#resolveSizeAndState\n" +
- "ApiCallTest5.java:18: Error: Call requires API level 11 (current min is 2): android.view.View#resolveSizeAndState\n" +
- "ApiCallTest5.java:20: Error: Call requires API level 11 (current min is 2): android.view.View#combineMeasuredStates\n" +
- "ApiCallTest5.java:21: Error: Call requires API level 11 (current min is 2): android.view.View#combineMeasuredStates",
+ "src/foo/bar/ApiCallTest5.java:16: Error: Call requires API level 11 (current min is 2): android.view.View#resolveSizeAndState [NewApi]\n" +
+ " int measuredWidth = View.resolveSizeAndState(widthMeasureSpec,\n" +
+ " ~~~~~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest5.java:18: Error: Call requires API level 11 (current min is 2): android.view.View#resolveSizeAndState [NewApi]\n" +
+ " int measuredHeight = resolveSizeAndState(heightMeasureSpec,\n" +
+ " ~~~~~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest5.java:20: Error: Call requires API level 11 (current min is 2): android.view.View#combineMeasuredStates [NewApi]\n" +
+ " View.combineMeasuredStates(0, 0);\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiCallTest5.java:21: Error: Call requires API level 11 (current min is 2): android.view.View#combineMeasuredStates [NewApi]\n" +
+ " ApiCallTest5.combineMeasuredStates(0, 0);\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~\n" +
+ "4 errors, 0 warnings\n" +
+ "",
lintProject(
"apicheck/classpath=>.classpath",
@@ -201,7 +333,11 @@ public class ApiDetectorTest extends AbstractCheckTest {
// Test virtual dispatch in a local class which extends some other local class (which
// in turn extends an Android API)
assertEquals(
- "ApiCallTest3.java:10: Error: Call requires API level 11 (current min is 1): android.app.Activity#getActionBar",
+ "src/test/pkg/ApiCallTest3.java:10: Error: Call requires API level 11 (current min is 1): android.app.Activity#getActionBar [NewApi]\n" +
+ " getActionBar(); // API 11\n" +
+ " ~~~~~~~~~~~~\n" +
+ "1 errors, 0 warnings\n" +
+ "",
lintProject(
"apicheck/classpath=>.classpath",
@@ -215,10 +351,20 @@ public class ApiDetectorTest extends AbstractCheckTest {
public void testViewClassLayoutReference() throws Exception {
assertEquals(
- "view.xml:16: Error: View requires API level 11 (current min is 1): <CalendarView>\n" +
- "view.xml:24: Error: ?android:attr/dividerHorizontal requires API level 11 (current min is 1)\n" +
- "view.xml:25: Error: ?android:attr/textColorLinkInverse requires API level 11 (current min is 1)\n" +
- "view.xml:9: Error: View requires API level 5 (current min is 1): <QuickContactBadge>",
+ "res/layout/view.xml:9: Error: View requires API level 5 (current min is 1): <QuickContactBadge> [NewApi]\n" +
+ " <view\n" +
+ " ^\n" +
+ "res/layout/view.xml:16: Error: View requires API level 11 (current min is 1): <CalendarView> [NewApi]\n" +
+ " <view\n" +
+ " ^\n" +
+ "res/layout/view.xml:24: Error: ?android:attr/dividerHorizontal requires API level 11 (current min is 1) [NewApi]\n" +
+ " unknown=\"?android:attr/dividerHorizontal\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/view.xml:25: Error: ?android:attr/textColorLinkInverse requires API level 11 (current min is 1) [NewApi]\n" +
+ " android:textColor=\"?android:attr/textColorLinkInverse\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "4 errors, 0 warnings\n" +
+ "",
lintProject(
"apicheck/minsdk1.xml=>AndroidManifest.xml",
@@ -229,7 +375,11 @@ public class ApiDetectorTest extends AbstractCheckTest {
public void testIOException() throws Exception {
// See http://code.google.com/p/android/issues/detail?id=35190
assertEquals(
- "ApiCallTest6.java:8: Error: Call requires API level 9 (current min is 1): java.io.IOException#<init>",
+ "src/test/pkg/ApiCallTest6.java:8: Error: Call requires API level 9 (current min is 1): java.io.IOException#<init> [NewApi]\n" +
+ " IOException ioException = new IOException(throwable);\n" +
+ " ~~~~~~~~~~~\n" +
+ "1 errors, 0 warnings\n" +
+ "",
lintProject(
"apicheck/classpath=>.classpath",
@@ -248,22 +398,50 @@ public class ApiDetectorTest extends AbstractCheckTest {
// These errors are correctly -not- suppressed because they
// appear in method3 (line 74-98) which is annotated with a
// @SuppressLint annotation specifying only an unrelated issue id
- "SuppressTest1.java:74: Error: Class requires API level 8 (current min is 1): org.w3c.dom.DOMLocator\n" +
- "SuppressTest1.java:76: Error: Call requires API level 11 (current min is 1): android.app.Activity#getActionBar\n" +
- "SuppressTest1.java:79: Error: Class requires API level 8 (current min is 1): org.w3c.dom.DOMError\n" +
- "SuppressTest1.java:80: Error: Class requires API level 8 (current min is 1): org.w3c.dom.DOMErrorHandler\n" +
- "SuppressTest1.java:83: Error: Call requires API level 3 (current min is 1): android.widget.Chronometer#getOnChronometerTickListener\n" +
- "SuppressTest1.java:86: Error: Call requires API level 11 (current min is 1): android.widget.Chronometer#setTextIsSelectable\n" +
- "SuppressTest1.java:89: Error: Field requires API level 11 (current min is 1): dalvik.bytecode.OpcodeInfo#MAXIMUM_VALUE\n" +
- "SuppressTest1.java:94: Error: Class requires API level 14 (current min is 1): android.app.ApplicationErrorReport.BatteryInfo\n" +
- "SuppressTest1.java:94: Error: Field requires API level 14 (current min is 1): android.app.ApplicationErrorReport#batteryInfo\n" +
- "SuppressTest1.java:97: Error: Field requires API level 11 (current min is 1): android.graphics.PorterDuff$Mode#OVERLAY\n" +
+ "src/foo/bar/SuppressTest1.java:74: Error: Class requires API level 8 (current min is 1): org.w3c.dom.DOMLocator [NewApi]\n" +
+ " public void method3(Chronometer chronometer, DOMLocator locator) {\n" +
+ " ~~~~~~~~~~\n" +
+ "src/foo/bar/SuppressTest1.java:76: Error: Call requires API level 11 (current min is 1): android.app.Activity#getActionBar [NewApi]\n" +
+ " getActionBar(); // API 11\n" +
+ " ~~~~~~~~~~~~\n" +
+ "src/foo/bar/SuppressTest1.java:79: Error: Class requires API level 8 (current min is 1): org.w3c.dom.DOMError [NewApi]\n" +
+ " DOMError error = null; // API 8\n" +
+ " ~~~~~~~~\n" +
+ "src/foo/bar/SuppressTest1.java:80: Error: Class requires API level 8 (current min is 1): org.w3c.dom.DOMErrorHandler [NewApi]\n" +
+ " Class<?> clz = DOMErrorHandler.class; // API 8\n" +
+ " ~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/SuppressTest1.java:83: Error: Call requires API level 3 (current min is 1): android.widget.Chronometer#getOnChronometerTickListener [NewApi]\n" +
+ " chronometer.getOnChronometerTickListener(); // API 3\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/SuppressTest1.java:86: Error: Call requires API level 11 (current min is 1): android.widget.Chronometer#setTextIsSelectable [NewApi]\n" +
+ " chronometer.setTextIsSelectable(true); // API 11\n" +
+ " ~~~~~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/SuppressTest1.java:89: Error: Field requires API level 11 (current min is 1): dalvik.bytecode.OpcodeInfo#MAXIMUM_VALUE [NewApi]\n" +
+ " int field = OpcodeInfo.MAXIMUM_VALUE; // API 11\n" +
+ " ~~~~~~~~~~~~~\n" +
+ "src/foo/bar/SuppressTest1.java:94: Error: Class requires API level 14 (current min is 1): android.app.ApplicationErrorReport.BatteryInfo [NewApi]\n" +
+ " BatteryInfo batteryInfo = getReport().batteryInfo;\n" +
+ " ^\n" +
+ "src/foo/bar/SuppressTest1.java:94: Error: Field requires API level 14 (current min is 1): android.app.ApplicationErrorReport#batteryInfo [NewApi]\n" +
+ " BatteryInfo batteryInfo = getReport().batteryInfo;\n" +
+ " ~~~~~~~~~~~\n" +
+ "src/foo/bar/SuppressTest1.java:97: Error: Field requires API level 11 (current min is 1): android.graphics.PorterDuff$Mode#OVERLAY [NewApi]\n" +
+ " Mode mode = PorterDuff.Mode.OVERLAY; // API 11\n" +
+ " ~~~~~~~\n" +
// Note: These annotations are within the methods, not ON the methods, so they have
// no effect (because they don't end up in the bytecode)
- "SuppressTest4.java:16: Error: Class requires API level 14 (current min is 1): android.app.ApplicationErrorReport\n" +
- "SuppressTest4.java:19: Error: Class requires API level 14 (current min is 1): android.app.ApplicationErrorReport.BatteryInfo\n" +
- "SuppressTest4.java:19: Error: Field requires API level 14 (current min is 1): android.app.ApplicationErrorReport#batteryInfo",
+
+ "src/foo/bar/SuppressTest4.java:16: Error: Class requires API level 14 (current min is 1): android.app.ApplicationErrorReport [NewApi]\n" +
+ " ApplicationErrorReport report = null;\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/SuppressTest4.java:19: Error: Class requires API level 14 (current min is 1): android.app.ApplicationErrorReport.BatteryInfo [NewApi]\n" +
+ " BatteryInfo batteryInfo = report.batteryInfo;\n" +
+ " ^\n" +
+ "src/foo/bar/SuppressTest4.java:19: Error: Field requires API level 14 (current min is 1): android.app.ApplicationErrorReport#batteryInfo [NewApi]\n" +
+ " BatteryInfo batteryInfo = report.batteryInfo;\n" +
+ " ~~~~~~~~~~~\n" +
+ "13 errors, 0 warnings\n",
lintProject(
"apicheck/classpath=>.classpath",
@@ -284,8 +462,14 @@ public class ApiDetectorTest extends AbstractCheckTest {
// These errors are correctly -not- suppressed because they
// appear outside the middle inner class suppressing its own errors
// and its child's errors
- "ApiCallTest4.java:38: Error: Call requires API level 14 (current min is 1): android.widget.GridLayout#<init>\n" +
- "ApiCallTest4.java:9: Error: Call requires API level 14 (current min is 1): android.widget.GridLayout#<init>",
+ "src/test/pkg/ApiCallTest4.java:9: Error: Call requires API level 14 (current min is 1): android.widget.GridLayout#<init> [NewApi]\n" +
+ " new GridLayout(null, null, 0);\n" +
+ " ~~~~~~~~~~\n" +
+ "src/test/pkg/ApiCallTest4.java:38: Error: Call requires API level 14 (current min is 1): android.widget.GridLayout#<init> [NewApi]\n" +
+ " new GridLayout(null, null, 0);\n" +
+ " ~~~~~~~~~~\n" +
+ "2 errors, 0 warnings\n" +
+ "",
lintProject(
"apicheck/classpath=>.classpath",
@@ -301,9 +485,17 @@ public class ApiDetectorTest extends AbstractCheckTest {
public void testApiTargetAnnotation() throws Exception {
assertEquals(
- "ApiTargetTest.java:13: Error: Class requires API level 8 (current min is 1): org.w3c.dom.DOMErrorHandler\n" +
- "ApiTargetTest.java:25: Error: Class requires API level 8 (current min is 4): org.w3c.dom.DOMErrorHandler\n" +
- "ApiTargetTest.java:39: Error: Class requires API level 8 (current min is 7): org.w3c.dom.DOMErrorHandler",
+ "src/foo/bar/ApiTargetTest.java:13: Error: Class requires API level 8 (current min is 1): org.w3c.dom.DOMErrorHandler [NewApi]\n" +
+ " Class<?> clz = DOMErrorHandler.class; // API 8\n" +
+ " ~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiTargetTest.java:25: Error: Class requires API level 8 (current min is 4): org.w3c.dom.DOMErrorHandler [NewApi]\n" +
+ " Class<?> clz = DOMErrorHandler.class; // API 8\n" +
+ " ~~~~~~~~~~~~~~~\n" +
+ "src/foo/bar/ApiTargetTest.java:39: Error: Class requires API level 8 (current min is 7): org.w3c.dom.DOMErrorHandler [NewApi]\n" +
+ " Class<?> clz = DOMErrorHandler.class; // API 8\n" +
+ " ~~~~~~~~~~~~~~~\n" +
+ "3 errors, 0 warnings\n" +
+ "",
lintProject(
"apicheck/classpath=>.classpath",
@@ -316,7 +508,11 @@ public class ApiDetectorTest extends AbstractCheckTest {
public void testTargetAnnotationInner() throws Exception {
assertEquals(
- "ApiTargetTest2.java:32: Error: Call requires API level 14 (current min is 3): android.widget.GridLayout#<init>",
+ "src/test/pkg/ApiTargetTest2.java:32: Error: Call requires API level 14 (current min is 3): android.widget.GridLayout#<init> [NewApi]\n" +
+ " new GridLayout(null, null, 0);\n" +
+ " ~~~~~~~~~~\n" +
+ "1 errors, 0 warnings\n" +
+ "",
lintProject(
"apicheck/classpath=>.classpath",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ArraySizeDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ArraySizeDetectorTest.java
index 37f6af2..629f43c 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ArraySizeDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ArraySizeDetectorTest.java
@@ -26,12 +26,18 @@ public class ArraySizeDetectorTest extends AbstractCheckTest {
}
public void testArraySizes() throws Exception {
assertEquals(
- "values/arrays.xml:10: Warning: Array signal_strength has an inconsistent number of items (5 in values/arrays.xml, 6 in values-land/arrays.xml)\n" +
- "=> values-land/arrays.xml:2: Declaration with array size (6)\n" +
- "values/arrays.xml:3: Warning: Array security_questions has an inconsistent number of items (3 in values-nl-rNL/arrays.xml, 4 in values-cs/arrays.xml)\n" +
- "=> values-cs/arrays.xml:3: Declaration with array size (4)\n" +
- "=> values-es/strings.xml:12: Declaration with array size (4)\n" +
- "=> values-nl-rNL/arrays.xml:3: Declaration with array size (3)",
+ "res/values/arrays.xml:3: Warning: Array security_questions has an inconsistent number of items (3 in values-nl-rNL/arrays.xml, 4 in values-cs/arrays.xml) [InconsistentArrays]\n" +
+ " <string-array name=\"security_questions\">\n" +
+ " ^\n" +
+ " res/values-cs/arrays.xml:3: Declaration with array size (4)\n" +
+ " res/values-es/strings.xml:12: Declaration with array size (4)\n" +
+ " res/values-nl-rNL/arrays.xml:3: Declaration with array size (3)\n" +
+ "res/values/arrays.xml:10: Warning: Array signal_strength has an inconsistent number of items (5 in values/arrays.xml, 6 in values-land/arrays.xml) [InconsistentArrays]\n" +
+ " <array name=\"signal_strength\">\n" +
+ " ^\n" +
+ " res/values-land/arrays.xml:2: Declaration with array size (6)\n" +
+ "0 errors, 2 warnings\n" +
+ "",
lintProject(
"res/values/arrays.xml",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ButtonDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ButtonDetectorTest.java
index ae43039..f9fb059 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ButtonDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ButtonDetectorTest.java
@@ -37,13 +37,29 @@ public class ButtonDetectorTest extends AbstractCheckTest {
public void testButtonOrder() throws Exception {
sTestIssue = ButtonDetector.ORDER;
assertEquals(
- "buttonbar.xml:124: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")\n" +
- "buttonbar.xml:12: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")\n" +
- "buttonbar.xml:140: Warning: OK button should be on the right (was \"Ok | CANCEL\", should be \"CANCEL | Ok\")\n" +
- "buttonbar.xml:156: Warning: OK button should be on the right (was \"OK | Abort\", should be \"Abort | OK\")\n" +
- "buttonbar.xml:177: Warning: Cancel button should be on the left (was \"Send | Cancel\", should be \"Cancel | Send\")\n" +
- "buttonbar.xml:44: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")\n" +
- "buttonbar.xml:92: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")",
+ "res/layout/buttonbar.xml:12: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout/buttonbar.xml:44: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout/buttonbar.xml:92: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout/buttonbar.xml:124: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout/buttonbar.xml:140: Warning: OK button should be on the right (was \"Ok | CANCEL\", should be \"CANCEL | Ok\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout/buttonbar.xml:156: Warning: OK button should be on the right (was \"OK | Abort\", should be \"Abort | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout/buttonbar.xml:177: Warning: Cancel button should be on the left (was \"Send | Cancel\", should be \"Cancel | Send\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "0 errors, 7 warnings\n" +
+ "",
lintProject(
"apicheck/minsdk14.xml=>AndroidManifest.xml",
@@ -55,13 +71,29 @@ public class ButtonDetectorTest extends AbstractCheckTest {
// If the layout is in v14, it had better have the right order
sTestIssue = ButtonDetector.ORDER;
assertEquals(
- "buttonbar.xml:124: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")\n" +
- "buttonbar.xml:12: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")\n" +
- "buttonbar.xml:140: Warning: OK button should be on the right (was \"Ok | CANCEL\", should be \"CANCEL | Ok\")\n" +
- "buttonbar.xml:156: Warning: OK button should be on the right (was \"OK | Abort\", should be \"Abort | OK\")\n" +
- "buttonbar.xml:177: Warning: Cancel button should be on the left (was \"Send | Cancel\", should be \"Cancel | Send\")\n" +
- "buttonbar.xml:44: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")\n" +
- "buttonbar.xml:92: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")",
+ "res/layout-v14/buttonbar.xml:12: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-v14/buttonbar.xml:44: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-v14/buttonbar.xml:92: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-v14/buttonbar.xml:124: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-v14/buttonbar.xml:140: Warning: OK button should be on the right (was \"Ok | CANCEL\", should be \"CANCEL | Ok\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-v14/buttonbar.xml:156: Warning: OK button should be on the right (was \"OK | Abort\", should be \"Abort | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-v14/buttonbar.xml:177: Warning: Cancel button should be on the left (was \"Send | Cancel\", should be \"Cancel | Send\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "0 errors, 7 warnings\n" +
+ "",
lintProject(
"minsdk5targetsdk14.xml=>AndroidManifest.xml",
@@ -73,13 +105,29 @@ public class ButtonDetectorTest extends AbstractCheckTest {
// Similar to test 3, but also complain if the -v version is *higher* than 14
sTestIssue = ButtonDetector.ORDER;
assertEquals(
- "buttonbar.xml:124: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")\n" +
- "buttonbar.xml:12: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")\n" +
- "buttonbar.xml:140: Warning: OK button should be on the right (was \"Ok | CANCEL\", should be \"CANCEL | Ok\")\n" +
- "buttonbar.xml:156: Warning: OK button should be on the right (was \"OK | Abort\", should be \"Abort | OK\")\n" +
- "buttonbar.xml:177: Warning: Cancel button should be on the left (was \"Send | Cancel\", should be \"Cancel | Send\")\n" +
- "buttonbar.xml:44: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")\n" +
- "buttonbar.xml:92: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")",
+ "res/layout-v16/buttonbar.xml:12: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-v16/buttonbar.xml:44: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-v16/buttonbar.xml:92: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-v16/buttonbar.xml:124: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-v16/buttonbar.xml:140: Warning: OK button should be on the right (was \"Ok | CANCEL\", should be \"CANCEL | Ok\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-v16/buttonbar.xml:156: Warning: OK button should be on the right (was \"OK | Abort\", should be \"Abort | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-v16/buttonbar.xml:177: Warning: Cancel button should be on the left (was \"Send | Cancel\", should be \"Cancel | Send\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "0 errors, 7 warnings\n" +
+ "",
lintProject(
"minsdk5targetsdk14.xml=>AndroidManifest.xml",
@@ -91,13 +139,29 @@ public class ButtonDetectorTest extends AbstractCheckTest {
// Targeting 14 but using a layout that also needs to work for older platforms:
sTestIssue = ButtonDetector.ORDER;
assertEquals(
- "buttonbar.xml:124: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")\n" +
- "buttonbar.xml:12: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")\n" +
- "buttonbar.xml:140: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"Ok | CANCEL\", should be \"CANCEL | Ok\")\n" +
- "buttonbar.xml:156: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"OK | Abort\", should be \"Abort | OK\")\n" +
- "buttonbar.xml:177: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: Cancel button should be on the left (was \"Send | Cancel\", should be \"Cancel | Send\")\n" +
- "buttonbar.xml:44: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")\n" +
- "buttonbar.xml:92: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")",
+ "res/layout/buttonbar.xml:12: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout/buttonbar.xml:44: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout/buttonbar.xml:92: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout/buttonbar.xml:124: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout/buttonbar.xml:140: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"Ok | CANCEL\", should be \"CANCEL | Ok\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout/buttonbar.xml:156: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: OK button should be on the right (was \"OK | Abort\", should be \"Abort | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout/buttonbar.xml:177: Warning: Layout uses the wrong button order for API >= 14: Create a layout-v14/buttonbar.xml file with opposite order: Cancel button should be on the left (was \"Send | Cancel\", should be \"Cancel | Send\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "0 errors, 7 warnings\n" +
+ "",
lintProject(
"minsdk5targetsdk14.xml=>AndroidManifest.xml",
@@ -130,7 +194,11 @@ public class ButtonDetectorTest extends AbstractCheckTest {
public void testButtonOrderRelativeLayout2() throws Exception {
sTestIssue = ButtonDetector.ORDER;
assertEquals(
- "buttonbar3.xml:27: Warning: Cancel button should be on the left",
+ "res/layout/buttonbar3.xml:27: Warning: Cancel button should be on the left [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"apicheck/minsdk14.xml=>AndroidManifest.xml",
@@ -150,8 +218,14 @@ public class ButtonDetectorTest extends AbstractCheckTest {
public void testCase() throws Exception {
sTestIssue = ButtonDetector.CASE;
assertEquals(
- "buttonbar-values.xml:10: Warning: The standard Android way to capitalize CANCEL is \"Cancel\" (tip: use @android:string/ok instead)\n" +
- "buttonbar-values.xml:9: Warning: The standard Android way to capitalize Ok is \"OK\" (tip: use @android:string/ok instead)",
+ "res/values/buttonbar-values.xml:9: Warning: The standard Android way to capitalize Ok is \"OK\" (tip: use @android:string/ok instead) [ButtonCase]\n" +
+ " <string name=\"resume2\"> Ok </string>\n" +
+ " ^\n" +
+ "res/values/buttonbar-values.xml:10: Warning: The standard Android way to capitalize CANCEL is \"Cancel\" (tip: use @android:string/ok instead) [ButtonCase]\n" +
+ " <string name=\"giveup2\">\"CANCEL\"</string>\n" +
+ " ^\n" +
+ "0 errors, 2 warnings\n" +
+ "",
lintProject("res/layout/buttonbar.xml", "res/values/buttonbar-values.xml"));
}
@@ -159,7 +233,11 @@ public class ButtonDetectorTest extends AbstractCheckTest {
public void testBack() throws Exception {
sTestIssue = ButtonDetector.BACKBUTTON;
assertEquals(
- "buttonbar.xml:183: Warning: Back buttons are not standard on Android; see design guide's navigation section",
+ "res/layout/buttonbar.xml:183: Warning: Back buttons are not standard on Android; see design guide's navigation section [BackButton]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject("res/layout/buttonbar.xml", "res/values/buttonbar-values.xml"));
}
@@ -179,31 +257,53 @@ public class ButtonDetectorTest extends AbstractCheckTest {
public void testEnglishLocales() throws Exception {
sTestIssue = ButtonDetector.ORDER;
assertEquals(
- "buttonbar.xml:124: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")\n" +
- "buttonbar.xml:12: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")\n" +
- "buttonbar.xml:140: Warning: OK button should be on the right (was \"Ok | CANCEL\", should be \"CANCEL | Ok\")\n" +
- "buttonbar.xml:156: Warning: OK button should be on the right (was \"OK | Abort\", should be \"Abort | OK\")\n" +
- "buttonbar.xml:177: Warning: Cancel button should be on the left (was \"Send | Cancel\", should be \"Cancel | Send\")\n" +
- "buttonbar.xml:44: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")\n" +
- "buttonbar.xml:92: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")",
+ "res/layout-en-rGB/buttonbar.xml:12: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-en-rGB/buttonbar.xml:44: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-en-rGB/buttonbar.xml:92: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-en-rGB/buttonbar.xml:124: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-en-rGB/buttonbar.xml:140: Warning: OK button should be on the right (was \"Ok | CANCEL\", should be \"CANCEL | Ok\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-en-rGB/buttonbar.xml:156: Warning: OK button should be on the right (was \"OK | Abort\", should be \"Abort | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-en-rGB/buttonbar.xml:177: Warning: Cancel button should be on the left (was \"Send | Cancel\", should be \"Cancel | Send\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "0 errors, 7 warnings\n" +
+ "",
- lintProject(
- "apicheck/minsdk14.xml=>AndroidManifest.xml",
- "res/layout/buttonbar.xml=>res/layout-en-rGB/buttonbar.xml",
- "res/values/buttonbar-values.xml=>res/values-en-rGB/buttonbar-values.xml"));
+ lintProject(
+ "apicheck/minsdk14.xml=>AndroidManifest.xml",
+ "res/layout/buttonbar.xml=>res/layout-en-rGB/buttonbar.xml",
+ "res/values/buttonbar-values.xml=>res/values-en-rGB/buttonbar-values.xml"));
}
public void testOtherLocales() throws Exception {
sTestIssue = ButtonDetector.ORDER;
assertEquals(
- // Hardcoded values only
- "buttonbar.xml:12: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")\n" +
- "buttonbar.xml:44: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\")",
+ // Hardcoded values only
+ "res/layout-de/buttonbar.xml:12: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "res/layout-de/buttonbar.xml:44: Warning: OK button should be on the right (was \"OK | Cancel\", should be \"Cancel | OK\") [ButtonOrder]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "0 errors, 2 warnings\n" +
+ "",
- lintProject(
- "apicheck/minsdk14.xml=>AndroidManifest.xml",
- "res/layout/buttonbar.xml=>res/layout-de/buttonbar.xml",
- "res/values/buttonbar-values.xml=>res/values-de/buttonbar-values.xml"));
+ lintProject(
+ "apicheck/minsdk14.xml=>AndroidManifest.xml",
+ "res/layout/buttonbar.xml=>res/layout-de/buttonbar.xml",
+ "res/values/buttonbar-values.xml=>res/values-de/buttonbar-values.xml"));
}
public void testOtherLocales2() throws Exception {
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ChildCountDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ChildCountDetectorTest.java
index b668c31..517ca4d 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ChildCountDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ChildCountDetectorTest.java
@@ -27,9 +27,12 @@ public class ChildCountDetectorTest extends AbstractCheckTest {
public void testChildCount() throws Exception {
assertEquals(
- "has_children.xml:3: Warning: A list/grid should have no children declared " +
- "in XML",
- lintFiles("res/layout/has_children.xml"));
+ "res/layout/has_children.xml:3: Warning: A list/grid should have no children declared in XML [AdapterViewChildren]\n" +
+ "<ListView\n" +
+ "^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
+ lintFiles("res/layout/has_children.xml"));
}
public void testChildCount2() throws Exception {
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ColorUsageDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ColorUsageDetectorTest.java
index f30f05e..d1a04e1 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ColorUsageDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ColorUsageDetectorTest.java
@@ -27,9 +27,17 @@ public class ColorUsageDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "WrongColor.java:11: Error: Should pass resolved color instead of resource id here: getResources().getColor(R.color.red)\n" +
- "WrongColor.java:12: Error: Should pass resolved color instead of resource id here: getResources().getColor(android.R.color.red)\n" +
- "WrongColor.java:9: Error: Should pass resolved color instead of resource id here: getResources().getColor(R.color.blue)",
+ "src/test/pkg/WrongColor.java:9: Error: Should pass resolved color instead of resource id here: getResources().getColor(R.color.blue) [ResourceAsColor]\n" +
+ " paint2.setColor(R.color.blue);\n" +
+ " ~~~~~~~~~~~~\n" +
+ "src/test/pkg/WrongColor.java:11: Error: Should pass resolved color instead of resource id here: getResources().getColor(R.color.red) [ResourceAsColor]\n" +
+ " textView.setTextColor(R.color.red);\n" +
+ " ~~~~~~~~~~~\n" +
+ "src/test/pkg/WrongColor.java:12: Error: Should pass resolved color instead of resource id here: getResources().getColor(android.R.color.red) [ResourceAsColor]\n" +
+ " textView.setTextColor(android.R.color.red);\n" +
+ " ~~~~~~~~~~~~~~~~~~~\n" +
+ "3 errors, 0 warnings\n" +
+ "",
lintProject("src/test/pkg/WrongColor.java.txt=>src/test/pkg/WrongColor.java"));
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DeprecationDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DeprecationDetectorTest.java
index 5185737..0e4ec2f 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DeprecationDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DeprecationDetectorTest.java
@@ -27,9 +27,14 @@ public class DeprecationDetectorTest extends AbstractCheckTest {
public void testApi1() throws Exception {
assertEquals(
- "deprecation.xml:18: Warning: android:editable is deprecated: Use an <EditText> to make it editable\n" +
- //"deprecation.xml:19: Warning: android:enabled is deprecated: Use state_enabled instead\n" +
- "deprecation.xml:2: Warning: AbsoluteLayout is deprecated",
+ "res/layout/deprecation.xml:2: Warning: AbsoluteLayout is deprecated [Deprecated]\n" +
+ "<AbsoluteLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
+ "^\n" +
+ "res/layout/deprecation.xml:18: Warning: android:editable is deprecated: Use an <EditText> to make it editable [Deprecated]\n" +
+ " android:editable=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 2 warnings\n" +
+ "",
lintProject(
"apicheck/minsdk1.xml=>AndroidManifest.xml",
@@ -38,15 +43,32 @@ public class DeprecationDetectorTest extends AbstractCheckTest {
public void testApi4() throws Exception {
assertEquals(
- "deprecation.xml:16: Warning: android:autoText is deprecated: Use inputType instead\n" +
- "deprecation.xml:17: Warning: android:capitalize is deprecated: Use inputType instead\n" +
- "deprecation.xml:18: Warning: android:editable is deprecated: Use an <EditText> to make it editable\n" +
- //"deprecation.xml:19: Warning: android:enabled is deprecated: Use state_enabled instead\n" +
- "deprecation.xml:20: Warning: android:inputMethod is deprecated: Use inputType instead\n" +
- "deprecation.xml:21: Warning: android:numeric is deprecated: Use inputType instead\n" +
- "deprecation.xml:22: Warning: android:password is deprecated: Use inputType instead\n" +
- "deprecation.xml:23: Warning: android:phoneNumber is deprecated: Use inputType instead\n" +
- "deprecation.xml:2: Warning: AbsoluteLayout is deprecated",
+ "res/layout/deprecation.xml:2: Warning: AbsoluteLayout is deprecated [Deprecated]\n" +
+ "<AbsoluteLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
+ "^\n" +
+ "res/layout/deprecation.xml:16: Warning: android:autoText is deprecated: Use inputType instead [Deprecated]\n" +
+ " android:autoText=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/deprecation.xml:17: Warning: android:capitalize is deprecated: Use inputType instead [Deprecated]\n" +
+ " android:capitalize=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/deprecation.xml:18: Warning: android:editable is deprecated: Use an <EditText> to make it editable [Deprecated]\n" +
+ " android:editable=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/deprecation.xml:20: Warning: android:inputMethod is deprecated: Use inputType instead [Deprecated]\n" +
+ " android:inputMethod=\"@+id/foo\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/deprecation.xml:21: Warning: android:numeric is deprecated: Use inputType instead [Deprecated]\n" +
+ " android:numeric=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/deprecation.xml:22: Warning: android:password is deprecated: Use inputType instead [Deprecated]\n" +
+ " android:password=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/deprecation.xml:23: Warning: android:phoneNumber is deprecated: Use inputType instead [Deprecated]\n" +
+ " android:phoneNumber=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 8 warnings\n" +
+ "",
lintProject(
"apicheck/minsdk4.xml=>AndroidManifest.xml",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DetectMissingPrefixTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DetectMissingPrefixTest.java
index 2f15558..8a4f6b0 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DetectMissingPrefixTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DetectMissingPrefixTest.java
@@ -27,17 +27,27 @@ public class DetectMissingPrefixTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "namespace.xml:2: Warning: Attribute is missing the Android namespace prefix\n" +
- "namespace.xml:3: Warning: Attribute is missing the Android namespace prefix",
-
- lintFiles("res/layout/namespace.xml"));
+ "res/layout/namespace.xml:2: Warning: Attribute is missing the Android namespace prefix [MissingPrefix]\n" +
+ "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:id=\"@+id/newlinear\" android:orientation=\"vertical\" android:layout_width=\"match_parent\" android:layout_height=\"match_parent\" orientation=\"true\">\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/namespace.xml:3: Warning: Attribute is missing the Android namespace prefix [MissingPrefix]\n" +
+ " <Button style=\"@style/setupWizardOuterFrame\" android.text=\"Button\" android:id=\"@+id/button1\" android:layout_width=\"wrap_content\" android:layout_height=\"wrap_content\"></Button>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 2 warnings\n" +
+ "",
+
+ lintFiles("res/layout/namespace.xml"));
}
public void testCustomNamespace() throws Exception {
assertEquals(
- "namespace2.xml:8: Warning: Attribute is missing the Android namespace prefix",
+ "res/layout/namespace2.xml:8: Warning: Attribute is missing the Android namespace prefix [MissingPrefix]\n" +
+ " customprefix:orientation=\"vertical\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
- lintFiles("res/layout/namespace2.xml"));
+ lintFiles("res/layout/namespace2.xml"));
}
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DuplicateIdDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DuplicateIdDetectorTest.java
index 284ea42..72a9035 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DuplicateIdDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DuplicateIdDetectorTest.java
@@ -27,23 +27,35 @@ public class DuplicateIdDetectorTest extends AbstractCheckTest {
public void testDuplicate() throws Exception {
assertEquals(
- "layout/duplicate.xml:5: Warning: Duplicate id @+id/android_logo, already defined earlier in this layout\n" +
- "=> layout/duplicate.xml:4: @+id/android_logo originally defined here",
+ "res/layout/duplicate.xml:5: Warning: Duplicate id @+id/android_logo, already defined earlier in this layout [DuplicateIds]\n" +
+ " <ImageButton android:id=\"@+id/android_logo\" android:layout_width=\"wrap_content\" android:layout_height=\"wrap_content\" android:src=\"@drawable/android_button\" android:focusable=\"false\" android:clickable=\"false\" android:layout_weight=\"1.0\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ " res/layout/duplicate.xml:4: @+id/android_logo originally defined here\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintFiles("res/layout/duplicate.xml"));
}
public void testDuplicateChains() throws Exception {
assertEquals(
- "layout/layout1.xml:7: Warning: Duplicate id @+id/button1, defined or included multiple times in layout/layout1.xml: [layout/layout1.xml defines @+id/button1, layout/layout1.xml => layout/layout2.xml => layout/layout3.xml defines @+id/button1, layout/layout1.xml => layout/layout2.xml => layout/layout4.xml defines @+id/button1]\n" +
- "=> layout/layout1.xml:13: Defined here\n" +
- "=> layout/layout3.xml:8: Defined here, included via layout/layout1.xml => layout/layout2.xml => layout/layout3.xml defines @+id/button1\n" +
- "=> layout/layout4.xml:8: Defined here, included via layout/layout1.xml => layout/layout2.xml => layout/layout4.xml defines @+id/button1\n" +
- "layout/layout1.xml:7: Warning: Duplicate id @+id/button2, defined or included multiple times in layout/layout1.xml: [layout/layout1.xml defines @+id/button2, layout/layout1.xml => layout/layout2.xml => layout/layout4.xml defines @+id/button2]\n" +
- "=> layout/layout1.xml:19: Defined here\n" +
- "=> layout/layout4.xml:14: Defined here, included via layout/layout1.xml => layout/layout2.xml => layout/layout4.xml defines @+id/button2\n" +
- "layout/layout2.xml:18: Warning: Duplicate id @+id/button1, defined or included multiple times in layout/layout2.xml: [layout/layout2.xml => layout/layout3.xml defines @+id/button1, layout/layout2.xml => layout/layout4.xml defines @+id/button1]\n" +
- "=> layout/layout3.xml:8: Defined here, included via layout/layout2.xml => layout/layout3.xml defines @+id/button1\n" +
- "=> layout/layout4.xml:8: Defined here, included via layout/layout2.xml => layout/layout4.xml defines @+id/button1",
+ "res/layout/layout1.xml:7: Warning: Duplicate id @+id/button1, defined or included multiple times in layout/layout1.xml: [layout/layout1.xml defines @+id/button1, layout/layout1.xml => layout/layout2.xml => layout/layout3.xml defines @+id/button1, layout/layout1.xml => layout/layout2.xml => layout/layout4.xml defines @+id/button1] [DuplicateIncludedIds]\n" +
+ " <include\n" +
+ " ^\n" +
+ " res/layout/layout1.xml:13: Defined here\n" +
+ " res/layout/layout3.xml:8: Defined here, included via layout/layout1.xml => layout/layout2.xml => layout/layout3.xml defines @+id/button1\n" +
+ " res/layout/layout4.xml:8: Defined here, included via layout/layout1.xml => layout/layout2.xml => layout/layout4.xml defines @+id/button1\n" +
+ "res/layout/layout1.xml:7: Warning: Duplicate id @+id/button2, defined or included multiple times in layout/layout1.xml: [layout/layout1.xml defines @+id/button2, layout/layout1.xml => layout/layout2.xml => layout/layout4.xml defines @+id/button2] [DuplicateIncludedIds]\n" +
+ " <include\n" +
+ " ^\n" +
+ " res/layout/layout1.xml:19: Defined here\n" +
+ " res/layout/layout4.xml:14: Defined here, included via layout/layout1.xml => layout/layout2.xml => layout/layout4.xml defines @+id/button2\n" +
+ "res/layout/layout2.xml:18: Warning: Duplicate id @+id/button1, defined or included multiple times in layout/layout2.xml: [layout/layout2.xml => layout/layout3.xml defines @+id/button1, layout/layout2.xml => layout/layout4.xml defines @+id/button1] [DuplicateIncludedIds]\n" +
+ " <include\n" +
+ " ^\n" +
+ " res/layout/layout3.xml:8: Defined here, included via layout/layout2.xml => layout/layout3.xml defines @+id/button1\n" +
+ " res/layout/layout4.xml:8: Defined here, included via layout/layout2.xml => layout/layout4.xml defines @+id/button1\n" +
+ "0 errors, 3 warnings\n" +
+ "",
// layout1: defines @+id/button1, button2
// layout3: defines @+id/button1
@@ -62,9 +74,13 @@ public class DuplicateIdDetectorTest extends AbstractCheckTest {
public void testSuppress() throws Exception {
assertEquals(
- "layout/layout2.xml:18: Warning: Duplicate id @+id/button1, defined or included multiple times in layout/layout2.xml: [layout/layout2.xml => layout/layout3.xml defines @+id/button1, layout/layout2.xml => layout/layout4.xml defines @+id/button1]\n" +
- "=> layout/layout3.xml:8: Defined here, included via layout/layout2.xml => layout/layout3.xml defines @+id/button1\n" +
- "=> layout/layout4.xml:8: Defined here, included via layout/layout2.xml => layout/layout4.xml defines @+id/button1",
+ "res/layout/layout2.xml:18: Warning: Duplicate id @+id/button1, defined or included multiple times in layout/layout2.xml: [layout/layout2.xml => layout/layout3.xml defines @+id/button1, layout/layout2.xml => layout/layout4.xml defines @+id/button1] [DuplicateIncludedIds]\n" +
+ " <include\n" +
+ " ^\n" +
+ " res/layout/layout3.xml:8: Defined here, included via layout/layout2.xml => layout/layout3.xml defines @+id/button1\n" +
+ " res/layout/layout4.xml:8: Defined here, included via layout/layout2.xml => layout/layout4.xml defines @+id/button1\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"res/layout/layout1_ignore.xml=>res/layout/layout1.xml",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ExtraTextDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ExtraTextDetectorTest.java
index 5016828..9f6c2d3 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ExtraTextDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ExtraTextDetectorTest.java
@@ -27,9 +27,11 @@ public class ExtraTextDetectorTest extends AbstractCheckTest {
public void testBroken() throws Exception {
assertEquals(
- "broken.xml:6: Warning: Unexpected text found in layout file: \"ImageButton " +
- "android:id=\"@+id/android_logo2\" android:layout_width=\"wrap_content\"" +
- " android:layout_heigh...\"",
- lintProject("res/layout/broken.xml"));
+ "res/layout/broken.xml:6: Warning: Unexpected text found in layout file: \"ImageButton android:id=\"@+id/android_logo2\" android:layout_width=\"wrap_content\" android:layout_heigh...\" [ExtraText]\n" +
+ " <Button android:text=\"Button\" android:id=\"@+id/button2\" android:layout_width=\"wrap_content\" android:layout_height=\"wrap_content\"></Button>\n" +
+ " ^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
+ lintProject("res/layout/broken.xml"));
}
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/FieldGetterDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/FieldGetterDetectorTest.java
index 0c5db09..81c6f20 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/FieldGetterDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/FieldGetterDetectorTest.java
@@ -27,11 +27,23 @@ public class FieldGetterDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "GetterTest.java:47: Warning: Calling getter method getFoo1() on self is slower than field access (mFoo1)\n" +
- "GetterTest.java:48: Warning: Calling getter method getFoo2() on self is slower than field access (mFoo2)\n" +
- "GetterTest.java:52: Warning: Calling getter method isBar1() on self is slower than field access (mBar1)\n" +
- "GetterTest.java:54: Warning: Calling getter method getFoo1() on self is slower than field access (mFoo1)\n" +
- "GetterTest.java:55: Warning: Calling getter method getFoo2() on self is slower than field access (mFoo2)",
+ "src/test/bytecode/GetterTest.java:47: Warning: Calling getter method getFoo1() on self is slower than field access (mFoo1) [FieldGetter]\n" +
+ " getFoo1();\n" +
+ " ~~~~~~~\n" +
+ "src/test/bytecode/GetterTest.java:48: Warning: Calling getter method getFoo2() on self is slower than field access (mFoo2) [FieldGetter]\n" +
+ " getFoo2();\n" +
+ " ~~~~~~~\n" +
+ "src/test/bytecode/GetterTest.java:52: Warning: Calling getter method isBar1() on self is slower than field access (mBar1) [FieldGetter]\n" +
+ " isBar1();\n" +
+ " ~~~~~~\n" +
+ "src/test/bytecode/GetterTest.java:54: Warning: Calling getter method getFoo1() on self is slower than field access (mFoo1) [FieldGetter]\n" +
+ " this.getFoo1();\n" +
+ " ~~~~~~~\n" +
+ "src/test/bytecode/GetterTest.java:55: Warning: Calling getter method getFoo2() on self is slower than field access (mFoo2) [FieldGetter]\n" +
+ " this.getFoo2();\n" +
+ " ~~~~~~~\n" +
+ "0 errors, 5 warnings\n" +
+ "",
lintProject(
"bytecode/.classpath=>.classpath",
@@ -70,11 +82,23 @@ public class FieldGetterDetectorTest extends AbstractCheckTest {
public void testJar() throws Exception {
assertEquals(
- "GetterTest.java:47: Warning: Calling getter method getFoo1() on self is slower than field access (mFoo1)\n" +
- "GetterTest.java:48: Warning: Calling getter method getFoo2() on self is slower than field access (mFoo2)\n" +
- "GetterTest.java:52: Warning: Calling getter method isBar1() on self is slower than field access (mBar1)\n" +
- "GetterTest.java:54: Warning: Calling getter method getFoo1() on self is slower than field access (mFoo1)\n" +
- "GetterTest.java:55: Warning: Calling getter method getFoo2() on self is slower than field access (mFoo2)",
+ "src/test/bytecode/GetterTest.java:47: Warning: Calling getter method getFoo1() on self is slower than field access (mFoo1) [FieldGetter]\n" +
+ " getFoo1();\n" +
+ " ~~~~~~~\n" +
+ "src/test/bytecode/GetterTest.java:48: Warning: Calling getter method getFoo2() on self is slower than field access (mFoo2) [FieldGetter]\n" +
+ " getFoo2();\n" +
+ " ~~~~~~~\n" +
+ "src/test/bytecode/GetterTest.java:52: Warning: Calling getter method isBar1() on self is slower than field access (mBar1) [FieldGetter]\n" +
+ " isBar1();\n" +
+ " ~~~~~~\n" +
+ "src/test/bytecode/GetterTest.java:54: Warning: Calling getter method getFoo1() on self is slower than field access (mFoo1) [FieldGetter]\n" +
+ " this.getFoo1();\n" +
+ " ~~~~~~~\n" +
+ "src/test/bytecode/GetterTest.java:55: Warning: Calling getter method getFoo2() on self is slower than field access (mFoo2) [FieldGetter]\n" +
+ " this.getFoo2();\n" +
+ " ~~~~~~~\n" +
+ "0 errors, 5 warnings\n" +
+ "",
lintProject(
"bytecode/classpath-jar=>.classpath",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/FragmentDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/FragmentDetectorTest.java
index 467f286..f732f71 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/FragmentDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/FragmentDetectorTest.java
@@ -27,12 +27,26 @@ public class FragmentDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "FragmentTest.java:10: Warning: This fragment class should be public (test.pkg.FragmentTest.Fragment1)\n" +
- "FragmentTest.java:15: Warning: This fragment inner class should be static (test.pkg.FragmentTest.Fragment2)\n" +
- "FragmentTest.java:21: Warning: The default constructor must be public\n" +
- "FragmentTest.java:26: Warning: This fragment should provide a default constructor (a public constructor with no arguments) (test.pkg.FragmentTest.Fragment4)\n" +
- "FragmentTest.java:27: Warning: Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead\n" +
- "FragmentTest.java:36: Warning: Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead",
+ "src/test/pkg/FragmentTest.java:10: Warning: This fragment class should be public (test.pkg.FragmentTest.Fragment1) [ValidFragment]\n" +
+ " private static class Fragment1 extends Fragment {\n" +
+ " ^\n" +
+ "src/test/pkg/FragmentTest.java:15: Warning: This fragment inner class should be static (test.pkg.FragmentTest.Fragment2) [ValidFragment]\n" +
+ " public class Fragment2 extends Fragment {\n" +
+ " ^\n" +
+ "src/test/pkg/FragmentTest.java:21: Warning: The default constructor must be public [ValidFragment]\n" +
+ " private Fragment3() {\n" +
+ " ~~~~~~~~~\n" +
+ "src/test/pkg/FragmentTest.java:26: Warning: This fragment should provide a default constructor (a public constructor with no arguments) (test.pkg.FragmentTest.Fragment4) [ValidFragment]\n" +
+ " public static class Fragment4 extends Fragment {\n" +
+ " ~~~~~~~~~\n" +
+ "src/test/pkg/FragmentTest.java:27: Warning: Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead [ValidFragment]\n" +
+ " private Fragment4(int dummy) {\n" +
+ " ~~~~~~~~~\n" +
+ "src/test/pkg/FragmentTest.java:36: Warning: Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead [ValidFragment]\n" +
+ " public Fragment5(int dummy) {\n" +
+ " ~~~~~~~~~\n" +
+ "0 errors, 6 warnings\n" +
+ "",
lintProject(
"bytecode/FragmentTest$Fragment1.class.data=>bin/classes/test/pkg/FragmentTest$Fragment1.class",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/GridLayoutDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/GridLayoutDetectorTest.java
index e91d434..dee52e1 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/GridLayoutDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/GridLayoutDetectorTest.java
@@ -27,7 +27,11 @@ public class GridLayoutDetectorTest extends AbstractCheckTest {
public void testGridLayout1() throws Exception {
assertEquals(
- "gridlayout.xml:36: Error: Column attribute (3) exceeds declared grid column count (2)",
+ "res/layout/gridlayout.xml:36: Error: Column attribute (3) exceeds declared grid column count (2) [GridLayout]\n" +
+ " android:layout_column=\"3\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "1 errors, 0 warnings\n" +
+ "",
lintFiles("res/layout/gridlayout.xml"));
}
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/HandlerDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/HandlerDetectorTest.java
index e0fb840..1e9350c 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/HandlerDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/HandlerDetectorTest.java
@@ -27,8 +27,14 @@ public class HandlerDetectorTest extends AbstractCheckTest {
public void testRegistered() throws Exception {
assertEquals(
- "HandlerTest.java:12: Warning: This Handler class should be static or leaks might occur (test.pkg.HandlerTest.Inner)\n" +
- "HandlerTest.java:18: Warning: This Handler class should be static or leaks might occur (test.pkg.HandlerTest.1)",
+ "src/test/pkg/HandlerTest.java:12: Warning: This Handler class should be static or leaks might occur (test.pkg.HandlerTest.Inner) [HandlerLeak]\n" +
+ " public class Inner extends Handler { // ERROR\n" +
+ " ~~~~~\n" +
+ "src/test/pkg/HandlerTest.java:18: Warning: This Handler class should be static or leaks might occur (test.pkg.HandlerTest.1) [HandlerLeak]\n" +
+ " Handler anonymous = new Handler() { // ERROR\n" +
+ " ~~~~~~~\n" +
+ "0 errors, 2 warnings\n" +
+ "",
lintProject(
"bytecode/HandlerTest.java.txt=>src/test/pkg/HandlerTest.java",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/HardcodedDebugModeDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/HardcodedDebugModeDetectorTest.java
index 197fae7..edb6c50 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/HardcodedDebugModeDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/HardcodedDebugModeDetectorTest.java
@@ -27,9 +27,12 @@ public class HardcodedDebugModeDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "AndroidManifest.xml:10: Warning: Avoid hardcoding the debug mode; leaving " +
- "it out allows debug and release builds to automatically assign one",
- lintProject("debuggable.xml=>AndroidManifest.xml"));
+ "AndroidManifest.xml:10: Warning: Avoid hardcoding the debug mode; leaving it out allows debug and release builds to automatically assign one [HardcodedDebugMode]\n" +
+ " android:debuggable=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
+ lintProject("debuggable.xml=>AndroidManifest.xml"));
}
public void testOk() throws Exception {
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/HardcodedValuesDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/HardcodedValuesDetectorTest.java
index 06ff9b6..6bef3b7 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/HardcodedValuesDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/HardcodedValuesDetectorTest.java
@@ -27,10 +27,14 @@ public class HardcodedValuesDetectorTest extends AbstractCheckTest {
public void testStrings() throws Exception {
assertEquals(
- "accessibility.xml:3: Warning: [I18N] Hardcoded string \"Button\", " +
- "should use @string resource\n" +
- "accessibility.xml:6: Warning: [I18N] Hardcoded string \"Button\", " +
- "should use @string resource",
+ "res/layout/accessibility.xml:3: Warning: [I18N] Hardcoded string \"Button\", should use @string resource [HardcodedText]\n" +
+ " <Button android:text=\"Button\" android:id=\"@+id/button1\" android:layout_width=\"wrap_content\" android:layout_height=\"wrap_content\"></Button>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/accessibility.xml:6: Warning: [I18N] Hardcoded string \"Button\", should use @string resource [HardcodedText]\n" +
+ " <Button android:text=\"Button\" android:id=\"@+id/button2\" android:layout_width=\"wrap_content\" android:layout_height=\"wrap_content\"></Button>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 2 warnings\n" +
+ "",
lintFiles("res/layout/accessibility.xml"));
}
@@ -38,8 +42,11 @@ public class HardcodedValuesDetectorTest extends AbstractCheckTest {
// All but one errors in the file contain ignore attributes - direct, inherited
// and lists
assertEquals(
- "ignores.xml:61: Warning: [I18N] Hardcoded string \"Hardcoded\", should use " +
- "@string resource",
+ "res/layout/ignores.xml:61: Warning: [I18N] Hardcoded string \"Hardcoded\", should use @string resource [HardcodedText]\n" +
+ " android:text=\"Hardcoded\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintFiles("res/layout/ignores.xml"));
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/IconDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/IconDetectorTest.java
index d33088f..f45ae08 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/IconDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/IconDetectorTest.java
@@ -27,11 +27,14 @@ public class IconDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "drawable-hdpi: Warning: Missing the following drawables in drawable-hdpi: sample_icon.gif (found in drawable-mdpi)\n" +
- "drawable/ic_launcher.png: Warning: The ic_launcher.png icon has identical contents in the following configuration folders: drawable-mdpi, drawable\n" +
- "ic_launcher.png: Warning: Found bitmap drawable res/drawable/ic_launcher.png in densityless folder\n" +
- "res: Warning: Missing density variation folders in res: drawable-xhdpi\n" +
- "sample_icon.gif: Warning: Using the .gif format for bitmaps is discouraged",
+ "res/drawable-mdpi/sample_icon.gif: Warning: Using the .gif format for bitmaps is discouraged [GifUsage]\n" +
+ "res/drawable/ic_launcher.png: Warning: The ic_launcher.png icon has identical contents in the following configuration folders: drawable-mdpi, drawable [IconDuplicatesConfig]\n" +
+ " res/drawable-mdpi/ic_launcher.png: <No location-specific message\n" +
+ "res/drawable/ic_launcher.png: Warning: Found bitmap drawable res/drawable/ic_launcher.png in densityless folder [IconLocation]\n" +
+ "res/drawable-hdpi: Warning: Missing the following drawables in drawable-hdpi: sample_icon.gif (found in drawable-mdpi) [IconDensities]\n" +
+ "res: Warning: Missing density variation folders in res: drawable-xhdpi [IconMissingDensityFolder]\n" +
+ "0 errors, 5 warnings\n" +
+ "",
lintProject(
// Use minSDK4 to ensure that we get warnings about missing drawables
@@ -57,9 +60,13 @@ public class IconDetectorTest extends AbstractCheckTest {
public void test2() throws Exception {
assertEquals(
- "drawable-hdpi/other.9.png: Warning: The following unrelated icon files have identical contents: appwidget_bg.9.png, other.9.png\n" +
- "drawable-hdpi/unrelated.png: Warning: The following unrelated icon files have identical contents: ic_launcher.png, unrelated.png\n" +
- "res: Warning: Missing density variation folders in res: drawable-mdpi, drawable-xhdpi",
+ "res/drawable-hdpi/other.9.png: Warning: The following unrelated icon files have identical contents: appwidget_bg.9.png, other.9.png [IconDuplicates]\n" +
+ " res/drawable-hdpi/appwidget_bg.9.png: <No location-specific message\n" +
+ "res/drawable-hdpi/unrelated.png: Warning: The following unrelated icon files have identical contents: ic_launcher.png, unrelated.png [IconDuplicates]\n" +
+ " res/drawable-hdpi/ic_launcher.png: <No location-specific message\n" +
+ "res: Warning: Missing density variation folders in res: drawable-mdpi, drawable-xhdpi [IconMissingDensityFolder]\n" +
+ "0 errors, 3 warnings\n" +
+ "",
lintProject(
"res/drawable-hdpi/unrelated.png",
@@ -72,9 +79,13 @@ public class IconDetectorTest extends AbstractCheckTest {
public void testNoDpi() throws Exception {
assertEquals(
- "drawable-xlarge-nodpi-v11/frame.png: Warning: The frame.png icon has identical contents in the following configuration folders: drawable-mdpi, drawable-nodpi, drawable-xlarge-nodpi-v11\n" +
- "frame.png: Warning: The following images appear in both -nodpi and in a density folder: frame.png\n" +
- "res: Warning: Missing density variation folders in res: drawable-hdpi, drawable-xhdpi",
+ "res/drawable-mdpi/frame.png: Warning: The following images appear in both -nodpi and in a density folder: frame.png [IconNoDpi]\n" +
+ "res/drawable-xlarge-nodpi-v11/frame.png: Warning: The frame.png icon has identical contents in the following configuration folders: drawable-mdpi, drawable-nodpi, drawable-xlarge-nodpi-v11 [IconDuplicatesConfig]\n" +
+ " res/drawable-nodpi/frame.png: <No location-specific message\n" +
+ " res/drawable-mdpi/frame.png: <No location-specific message\n" +
+ "res: Warning: Missing density variation folders in res: drawable-hdpi, drawable-xhdpi [IconMissingDensityFolder]\n" +
+ "0 errors, 3 warnings\n" +
+ "",
lintProject(
"res/drawable-mdpi/frame.png",
@@ -85,8 +96,18 @@ public class IconDetectorTest extends AbstractCheckTest {
public void testNoDpi2() throws Exception {
// Having additional icon names in the no-dpi folder should not cause any complaints
assertEquals(
- "drawable-xhdpi/frame.png: Warning: The following unrelated icon files have identical contents: frame.png, frame.png, frame.png, file1.png, file2.png, frame.png\n" +
- "drawable-xhdpi/frame.png: Warning: The image frame.png varies significantly in its density-independent (dip) size across the various density versions: drawable-ldpi/frame.png: 629x387 dp (472x290 px), drawable-mdpi/frame.png: 472x290 dp (472x290 px), drawable-hdpi/frame.png: 315x193 dp (472x290 px), drawable-xhdpi/frame.png: 236x145 dp (472x290 px)",
+ "res/drawable-xhdpi/frame.png: Warning: The image frame.png varies significantly in its density-independent (dip) size across the various density versions: drawable-ldpi/frame.png: 629x387 dp (472x290 px), drawable-mdpi/frame.png: 472x290 dp (472x290 px), drawable-hdpi/frame.png: 315x193 dp (472x290 px), drawable-xhdpi/frame.png: 236x145 dp (472x290 px) [IconDipSize]\n" +
+ " res/drawable-hdpi/frame.png: <No location-specific message\n" +
+ " res/drawable-mdpi/frame.png: <No location-specific message\n" +
+ " res/drawable-ldpi/frame.png: <No location-specific message\n" +
+ "res/drawable-xhdpi/frame.png: Warning: The following unrelated icon files have identical contents: frame.png, frame.png, frame.png, file1.png, file2.png, frame.png [IconDuplicates]\n" +
+ " res/drawable-nodpi/file2.png: <No location-specific message\n" +
+ " res/drawable-nodpi/file1.png: <No location-specific message\n" +
+ " res/drawable-mdpi/frame.png: <No location-specific message\n" +
+ " res/drawable-ldpi/frame.png: <No location-specific message\n" +
+ " res/drawable-hdpi/frame.png: <No location-specific message\n" +
+ "0 errors, 2 warnings\n" +
+ "",
lintProject(
"res/drawable-mdpi/frame.png=>res/drawable-mdpi/frame.png",
@@ -99,8 +120,11 @@ public class IconDetectorTest extends AbstractCheckTest {
public void testNoDpiMix() throws Exception {
assertEquals(
- "drawable-mdpi/frame.xml: Warning: The following images appear in both -nodpi and in a density folder: frame.png, frame.xml\n" +
- "res: Warning: Missing density variation folders in res: drawable-hdpi, drawable-xhdpi",
+ "res/drawable-mdpi/frame.xml: Warning: The following images appear in both -nodpi and in a density folder: frame.png, frame.xml [IconNoDpi]\n" +
+ " res/drawable-mdpi/frame.png: <No location-specific message\n" +
+ "res: Warning: Missing density variation folders in res: drawable-hdpi, drawable-xhdpi [IconMissingDensityFolder]\n" +
+ "0 errors, 2 warnings\n" +
+ "",
lintProject(
"res/drawable-mdpi/frame.png",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/InefficientWeightDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/InefficientWeightDetectorTest.java
index c48658f..f7d4a44 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/InefficientWeightDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/InefficientWeightDetectorTest.java
@@ -27,20 +27,34 @@ public class InefficientWeightDetectorTest extends AbstractCheckTest {
public void testWeights() throws Exception {
assertEquals(
- "inefficient_weight.xml:10: Warning: Use a layout_width of 0dip instead of match_parent for better performance\n" +
- "inefficient_weight.xml:24: Warning: Use a layout_height of 0dip instead of wrap_content for better performance",
+ "res/layout/inefficient_weight.xml:10: Warning: Use a layout_width of 0dip instead of match_parent for better performance [InefficientWeight]\n" +
+ " android:layout_width=\"match_parent\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/inefficient_weight.xml:24: Warning: Use a layout_height of 0dip instead of wrap_content for better performance [InefficientWeight]\n" +
+ " android:layout_height=\"wrap_content\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 2 warnings\n" +
+ "",
lintFiles("res/layout/inefficient_weight.xml"));
}
public void testWeights2() throws Exception {
assertEquals(
- "nested_weights.xml:23: Warning: Nested weights are bad for performance",
+ "res/layout/nested_weights.xml:23: Warning: Nested weights are bad for performance [NestedWeights]\n" +
+ " android:layout_weight=\"1\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintFiles("res/layout/nested_weights.xml"));
}
public void testWeights3() throws Exception {
assertEquals(
- "baseline_weights.xml:2: Warning: Set android:baselineAligned=\"false\" on this element for better performance",
+ "res/layout/baseline_weights.xml:2: Warning: Set android:baselineAligned=\"false\" on this element for better performance [DisableBaselineAlignment]\n" +
+ "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
+ "^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintFiles("res/layout/baseline_weights.xml"));
}
@@ -54,7 +68,11 @@ public class InefficientWeightDetectorTest extends AbstractCheckTest {
public void testNoVerticalWeights4() throws Exception {
// Orientation not specified ==> horizontal
assertEquals(
- "baseline_weights3.xml:2: Warning: Set android:baselineAligned=\"false\" on this element for better performance",
+ "res/layout/baseline_weights3.xml:2: Warning: Set android:baselineAligned=\"false\" on this element for better performance [DisableBaselineAlignment]\n" +
+ "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
+ "^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintFiles("res/layout/baseline_weights3.xml"));
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/JavaPerformanceDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/JavaPerformanceDetectorTest.java
index 98c664e..1d2974c 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/JavaPerformanceDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/JavaPerformanceDetectorTest.java
@@ -27,25 +27,65 @@ public class JavaPerformanceDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "JavaPerformanceTest.java:103: Warning: Avoid object allocations during draw/layout operations (preallocate and reuse instead)\n" +
- "JavaPerformanceTest.java:109: Warning: Avoid object allocations during draw/layout operations (preallocate and reuse instead)\n" +
- "JavaPerformanceTest.java:112: Warning: Avoid object allocations during draw/layout operations (preallocate and reuse instead)\n" +
- "JavaPerformanceTest.java:113: Warning: Avoid object allocations during draw/layout operations (preallocate and reuse instead)\n" +
- "JavaPerformanceTest.java:114: Warning: Avoid object allocations during draw/layout operations (preallocate and reuse instead)\n" +
- "JavaPerformanceTest.java:116: Warning: Avoid object allocations during draw operations: Use Canvas.getClipBounds(Rect) instead of Canvas.getClipBounds() which allocates a temporary Rect\n" +
- "JavaPerformanceTest.java:140: Warning: Avoid object allocations during draw/layout operations (preallocate and reuse instead)\n" +
- "JavaPerformanceTest.java:145: Warning: Use Integer.valueOf(42) instead\n" +
- "JavaPerformanceTest.java:146: Warning: Use Long.valueOf(42L) instead\n" +
- "JavaPerformanceTest.java:147: Warning: Use Boolean.valueOf(true) instead\n" +
- "JavaPerformanceTest.java:148: Warning: Use Character.valueOf('c') instead\n" +
- "JavaPerformanceTest.java:149: Warning: Use Float.valueOf(1.0f) instead\n" +
- "JavaPerformanceTest.java:150: Warning: Use Double.valueOf(1.0) instead\n" +
- "JavaPerformanceTest.java:28: Warning: Avoid object allocations during draw/layout operations (preallocate and reuse instead)\n" +
- "JavaPerformanceTest.java:29: Warning: Avoid object allocations during draw/layout operations (preallocate and reuse instead)\n" +
- "JavaPerformanceTest.java:33: Warning: Use Integer.valueOf(5) instead\n" +
- "JavaPerformanceTest.java:70: Warning: Use new SparseArray<String>(...) instead for better performance\n" +
- "JavaPerformanceTest.java:72: Warning: Use new SparseBooleanArray(...) instead for better performance\n" +
- "JavaPerformanceTest.java:74: Warning: Use new SparseIntArray(...) instead for better performance",
+ "src/test/pkg/JavaPerformanceTest.java:28: Warning: Avoid object allocations during draw/layout operations (preallocate and reuse instead) [DrawAllocation]\n" +
+ " new String(\"foo\");\n" +
+ " ~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:29: Warning: Avoid object allocations during draw/layout operations (preallocate and reuse instead) [DrawAllocation]\n" +
+ " String s = new String(\"bar\");\n" +
+ " ~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:103: Warning: Avoid object allocations during draw/layout operations (preallocate and reuse instead) [DrawAllocation]\n" +
+ " new String(\"flag me\");\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:109: Warning: Avoid object allocations during draw/layout operations (preallocate and reuse instead) [DrawAllocation]\n" +
+ " new String(\"flag me\");\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:112: Warning: Avoid object allocations during draw/layout operations (preallocate and reuse instead) [DrawAllocation]\n" +
+ " Bitmap.createBitmap(100, 100, null);\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:113: Warning: Avoid object allocations during draw/layout operations (preallocate and reuse instead) [DrawAllocation]\n" +
+ " android.graphics.Bitmap.createScaledBitmap(null, 100, 100, false);\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:114: Warning: Avoid object allocations during draw/layout operations (preallocate and reuse instead) [DrawAllocation]\n" +
+ " BitmapFactory.decodeFile(null);\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:116: Warning: Avoid object allocations during draw operations: Use Canvas.getClipBounds(Rect) instead of Canvas.getClipBounds() which allocates a temporary Rect [DrawAllocation]\n" +
+ " canvas.getClipBounds(); // allocates on your behalf\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:140: Warning: Avoid object allocations during draw/layout operations (preallocate and reuse instead) [DrawAllocation]\n" +
+ " new String(\"foo\");\n" +
+ " ~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:70: Warning: Use new SparseArray<String>(...) instead for better performance [UseSparseArrays]\n" +
+ " Map<Integer, String> myMap = new HashMap<Integer, String>();\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:72: Warning: Use new SparseBooleanArray(...) instead for better performance [UseSparseArrays]\n" +
+ " Map<Integer, Boolean> myBoolMap = new HashMap<Integer, Boolean>();\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:74: Warning: Use new SparseIntArray(...) instead for better performance [UseSparseArrays]\n" +
+ " Map<Integer, Integer> myIntMap = new java.util.HashMap<Integer, Integer>();\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:33: Warning: Use Integer.valueOf(5) instead [UseValueOf]\n" +
+ " Integer i = new Integer(5);\n" +
+ " ~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:145: Warning: Use Integer.valueOf(42) instead [UseValueOf]\n" +
+ " Integer i1 = new Integer(42);\n" +
+ " ~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:146: Warning: Use Long.valueOf(42L) instead [UseValueOf]\n" +
+ " Long l1 = new Long(42L);\n" +
+ " ~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:147: Warning: Use Boolean.valueOf(true) instead [UseValueOf]\n" +
+ " Boolean b1 = new Boolean(true);\n" +
+ " ~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:148: Warning: Use Character.valueOf('c') instead [UseValueOf]\n" +
+ " Character c1 = new Character('c');\n" +
+ " ~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:149: Warning: Use Float.valueOf(1.0f) instead [UseValueOf]\n" +
+ " Float f1 = new Float(1.0f);\n" +
+ " ~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/JavaPerformanceTest.java:150: Warning: Use Double.valueOf(1.0) instead [UseValueOf]\n" +
+ " Double d1 = new Double(1.0);\n" +
+ " ~~~~~~~~~~~~~~~\n" +
+ "0 errors, 19 warnings\n" +
+ "",
lintProject("src/test/pkg/JavaPerformanceTest.java.txt=>" +
"src/test/pkg/JavaPerformanceTest.java"));
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ManifestOrderDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ManifestOrderDetectorTest.java
index 54bb1f3..ad5274c 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ManifestOrderDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ManifestOrderDetectorTest.java
@@ -35,78 +35,129 @@ public class ManifestOrderDetectorTest extends AbstractCheckTest {
public void testBrokenOrder() throws Exception {
assertEquals(
- "AndroidManifest.xml:16: Warning: <uses-sdk> tag appears after <application> " +
- "tag\n" +
- "AndroidManifest.xml:16: Warning: <uses-sdk> tag should specify a target API " +
- "level (the highest verified version; when running on later versions, " +
- "compatibility behaviors may be enabled) with android:targetSdkVersion=\"?\"",
+ "AndroidManifest.xml:16: Warning: <uses-sdk> tag appears after <application> tag [ManifestOrder]\n" +
+ " <uses-sdk android:minSdkVersion=\"Froyo\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "AndroidManifest.xml:16: Warning: <uses-sdk> tag should specify a target API level (the highest verified version; when running on later versions, compatibility behaviors may be enabled) with android:targetSdkVersion=\"?\" [UsesMinSdkAttributes]\n" +
+ " <uses-sdk android:minSdkVersion=\"Froyo\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 2 warnings\n" +
+ "",
- lintProject(
- "broken-manifest.xml=>AndroidManifest.xml",
- "res/values/strings.xml"));
+ lintProject(
+ "broken-manifest.xml=>AndroidManifest.xml",
+ "res/values/strings.xml"));
}
public void testMissingUsesSdk() throws Exception {
assertEquals(
- "AndroidManifest.xml: Warning: Manifest should specify a minimum API level " +
- "with <uses-sdk android:minSdkVersion=\"?\" />; if it really supports all " +
- "versions of Android set it to 1.",
- lintProject(
- "missingusessdk.xml=>AndroidManifest.xml",
- "res/values/strings.xml"));
+ "AndroidManifest.xml: Warning: Manifest should specify a minimum API level with <uses-sdk android:minSdkVersion=\"?\" />; if it really supports all versions of Android set it to 1. [UsesMinSdkAttributes]\n" +
+ "0 errors, 1 warnings\n",
+ lintProject(
+ "missingusessdk.xml=>AndroidManifest.xml",
+ "res/values/strings.xml"));
}
public void testMissingMinSdk() throws Exception {
assertEquals(
- "AndroidManifest.xml:7: Warning: <uses-sdk> tag should specify a minimum API " +
- "level with android:minSdkVersion=\"?\"",
- lintProject(
- "missingmin.xml=>AndroidManifest.xml",
- "res/values/strings.xml"));
+ "AndroidManifest.xml:7: Warning: <uses-sdk> tag should specify a minimum API level with android:minSdkVersion=\"?\" [UsesMinSdkAttributes]\n" +
+ " <uses-sdk android:targetSdkVersion=\"10\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
+ lintProject(
+ "missingmin.xml=>AndroidManifest.xml",
+ "res/values/strings.xml"));
}
public void testMultipleSdk() throws Exception {
assertEquals(
- "AndroidManifest.xml:7: Warning: <uses-sdk> tag should specify a target API level (the highest verified version; when running on later versions, compatibility behaviors may be enabled) with android:targetSdkVersion=\"?\"\n" +
- "AndroidManifest.xml:9: Warning: <uses-sdk> tag should specify a minimum API level with android:minSdkVersion=\"?\"\n" +
- "ManifestOrderDetectorTest_testMultipleSdk/AndroidManifest.xml:8: Error: There should only be a single <uses-sdk> element in the manifest: merge these together\n" +
- "=> ManifestOrderDetectorTest_testMultipleSdk/AndroidManifest.xml:7: Also appears here\n" +
- "=> ManifestOrderDetectorTest_testMultipleSdk/AndroidManifest.xml:9: Also appears here",
+ "AndroidManifest.xml:8: Error: There should only be a single <uses-sdk> element in the manifest: merge these together [MultipleUsesSdk]\n" +
+ " <uses-sdk android:targetSdkVersion=\"14\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ " AndroidManifest.xml:7: Also appears here\n" +
+ " AndroidManifest.xml:9: Also appears here\n" +
+ "AndroidManifest.xml:7: Warning: <uses-sdk> tag should specify a target API level (the highest verified version; when running on later versions, compatibility behaviors may be enabled) with android:targetSdkVersion=\"?\" [UsesMinSdkAttributes]\n" +
+ " <uses-sdk android:minSdkVersion=\"5\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "AndroidManifest.xml:9: Warning: <uses-sdk> tag should specify a minimum API level with android:minSdkVersion=\"?\" [UsesMinSdkAttributes]\n" +
+ " <uses-sdk android:maxSdkVersion=\"15\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "1 errors, 2 warnings\n" +
+ "",
- lintProject(
- "multiplesdk.xml=>AndroidManifest.xml",
- "res/values/strings.xml"));
+ lintProject(
+ "multiplesdk.xml=>AndroidManifest.xml",
+ "res/values/strings.xml"));
}
public void testWrongLocation() throws Exception {
assertEquals(
- "AndroidManifest.xml:10: Error: The <permission> element must be a direct child of the <manifest> root element\n" +
- "AndroidManifest.xml:11: Error: The <permission-tree> element must be a direct child of the <manifest> root element\n" +
- "AndroidManifest.xml:12: Error: The <permission-group> element must be a direct child of the <manifest> root element\n" +
- "AndroidManifest.xml:14: Error: The <uses-sdk> element must be a direct child of the <manifest> root element\n" +
- "AndroidManifest.xml:15: Error: The <uses-configuration> element must be a direct child of the <manifest> root element\n" +
- "AndroidManifest.xml:16: Error: The <uses-feature> element must be a direct child of the <manifest> root element\n" +
- "AndroidManifest.xml:17: Error: The <supports-screens> element must be a direct child of the <manifest> root element\n" +
- "AndroidManifest.xml:18: Error: The <compatible-screens> element must be a direct child of the <manifest> root element\n" +
- "AndroidManifest.xml:19: Error: The <supports-gl-texture> element must be a direct child of the <manifest> root element\n" +
- "AndroidManifest.xml:24: Error: The <uses-library> element must be a direct child of the <application> element\n" +
- "AndroidManifest.xml:25: Error: The <activity> element must be a direct child of the <application> element\n" +
- "AndroidManifest.xml:8: Error: The <uses-sdk> element must be a direct child of the <manifest> root element\n" +
- "AndroidManifest.xml:8: Warning: <uses-sdk> tag appears after <application> tag\n" +
- "AndroidManifest.xml:8: Warning: <uses-sdk> tag should specify a target API level (the highest verified version; when running on later versions, compatibility behaviors may be enabled) with android:targetSdkVersion=\"?\"\n" +
- "AndroidManifest.xml:9: Error: The <uses-permission> element must be a direct child of the <manifest> root element\n" +
- "ManifestOrderDetectorTest_testWrongLocation/AndroidManifest.xml:14: Error: There should only be a single <uses-sdk> element in the manifest: merge these together\n" +
- "=> ManifestOrderDetectorTest_testWrongLocation/AndroidManifest.xml:8: Also appears here",
+ "AndroidManifest.xml:14: Error: There should only be a single <uses-sdk> element in the manifest: merge these together [MultipleUsesSdk]\n" +
+ " <uses-sdk />\n" +
+ " ~~~~~~~~~~~~\n" +
+ " AndroidManifest.xml:8: Also appears here\n" +
+ "AndroidManifest.xml:8: Error: The <uses-sdk> element must be a direct child of the <manifest> root element [WrongManifestParent]\n" +
+ " <uses-sdk android:minSdkVersion=\"Froyo\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "AndroidManifest.xml:9: Error: The <uses-permission> element must be a direct child of the <manifest> root element [WrongManifestParent]\n" +
+ " <uses-permission />\n" +
+ " ~~~~~~~~~~~~~~~~~~~\n" +
+ "AndroidManifest.xml:10: Error: The <permission> element must be a direct child of the <manifest> root element [WrongManifestParent]\n" +
+ " <permission />\n" +
+ " ~~~~~~~~~~~~~~\n" +
+ "AndroidManifest.xml:11: Error: The <permission-tree> element must be a direct child of the <manifest> root element [WrongManifestParent]\n" +
+ " <permission-tree />\n" +
+ " ~~~~~~~~~~~~~~~~~~~\n" +
+ "AndroidManifest.xml:12: Error: The <permission-group> element must be a direct child of the <manifest> root element [WrongManifestParent]\n" +
+ " <permission-group />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~\n" +
+ "AndroidManifest.xml:14: Error: The <uses-sdk> element must be a direct child of the <manifest> root element [WrongManifestParent]\n" +
+ " <uses-sdk />\n" +
+ " ~~~~~~~~~~~~\n" +
+ "AndroidManifest.xml:15: Error: The <uses-configuration> element must be a direct child of the <manifest> root element [WrongManifestParent]\n" +
+ " <uses-configuration />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "AndroidManifest.xml:16: Error: The <uses-feature> element must be a direct child of the <manifest> root element [WrongManifestParent]\n" +
+ " <uses-feature />\n" +
+ " ~~~~~~~~~~~~~~~~\n" +
+ "AndroidManifest.xml:17: Error: The <supports-screens> element must be a direct child of the <manifest> root element [WrongManifestParent]\n" +
+ " <supports-screens />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~\n" +
+ "AndroidManifest.xml:18: Error: The <compatible-screens> element must be a direct child of the <manifest> root element [WrongManifestParent]\n" +
+ " <compatible-screens />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "AndroidManifest.xml:19: Error: The <supports-gl-texture> element must be a direct child of the <manifest> root element [WrongManifestParent]\n" +
+ " <supports-gl-texture />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "AndroidManifest.xml:24: Error: The <uses-library> element must be a direct child of the <application> element [WrongManifestParent]\n" +
+ " <uses-library />\n" +
+ " ~~~~~~~~~~~~~~~~\n" +
+ "AndroidManifest.xml:25: Error: The <activity> element must be a direct child of the <application> element [WrongManifestParent]\n" +
+ " <activity android:name=\".HelloWorld\"\n" +
+ " ^\n" +
+ "AndroidManifest.xml:8: Warning: <uses-sdk> tag appears after <application> tag [ManifestOrder]\n" +
+ " <uses-sdk android:minSdkVersion=\"Froyo\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "AndroidManifest.xml:8: Warning: <uses-sdk> tag should specify a target API level (the highest verified version; when running on later versions, compatibility behaviors may be enabled) with android:targetSdkVersion=\"?\" [UsesMinSdkAttributes]\n" +
+ " <uses-sdk android:minSdkVersion=\"Froyo\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "14 errors, 2 warnings\n" +
+ "",
- lintProject("broken-manifest2.xml=>AndroidManifest.xml"));
+ lintProject("broken-manifest2.xml=>AndroidManifest.xml"));
}
public void testDuplicateActivity() throws Exception {
assertEquals(
- "AndroidManifest.xml:16: Error: Duplicate registration for activity com.example.helloworld.HelloWorld",
+ "AndroidManifest.xml:16: Error: Duplicate registration for activity com.example.helloworld.HelloWorld [DuplicateActivity]\n" +
+ " <activity android:name=\"com.example.helloworld.HelloWorld\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "1 errors, 0 warnings\n" +
+ "",
- lintProject(
- "duplicate-manifest.xml=>AndroidManifest.xml",
- "res/values/strings.xml"));
+ lintProject(
+ "duplicate-manifest.xml=>AndroidManifest.xml",
+ "res/values/strings.xml"));
}
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/MathDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/MathDetectorTest.java
index 4c5580d..8ec64ec 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/MathDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/MathDetectorTest.java
@@ -27,15 +27,23 @@ public class MathDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "MathTest.java:12: Warning: Use android.util.FloatMath#sqrt() instead of java.lang.Math#sqrt to avoid argument float to double conversion\n" +
- "MathTest.java:18: Warning: Use android.util.FloatMath#sqrt() instead of java.lang.Math#sqrt to avoid double to float return value conversion\n" +
- "MathTest.java:23: Warning: Use android.util.FloatMath#sqrt() instead of java.lang.Math#sqrt to avoid argument float to double conversion",
+ "src/test/bytecode/MathTest.java:12: Warning: Use android.util.FloatMath#sqrt() instead of java.lang.Math#sqrt to avoid argument float to double conversion [FloatMath]\n" +
+ " floatResult = (float) Math.sqrt(x);\n" +
+ " ~~~~\n" +
+ "src/test/bytecode/MathTest.java:18: Warning: Use android.util.FloatMath#sqrt() instead of java.lang.Math#sqrt to avoid double to float return value conversion [FloatMath]\n" +
+ " floatResult = (float) Math.sqrt(x);\n" +
+ " ~~~~\n" +
+ "src/test/bytecode/MathTest.java:23: Warning: Use android.util.FloatMath#sqrt() instead of java.lang.Math#sqrt to avoid argument float to double conversion [FloatMath]\n" +
+ " doubleResult = Math.sqrt(x);\n" +
+ " ~~~~\n" +
+ "0 errors, 3 warnings\n" +
+ "",
- lintProject(
- "bytecode/.classpath=>.classpath",
- "bytecode/AndroidManifest.xml=>AndroidManifest.xml",
- "bytecode/MathTest.java.txt=>src/test/bytecode/MathTest.java",
- "bytecode/MathTest.class.data=>bin/classes/test/bytecode/MathTest.class"
- ));
+ lintProject(
+ "bytecode/.classpath=>.classpath",
+ "bytecode/AndroidManifest.xml=>AndroidManifest.xml",
+ "bytecode/MathTest.java.txt=>src/test/bytecode/MathTest.java",
+ "bytecode/MathTest.class.data=>bin/classes/test/bytecode/MathTest.class"
+ ));
}
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/MergeRootFrameLayoutDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/MergeRootFrameLayoutDetectorTest.java
index 14dda8f..22a001f 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/MergeRootFrameLayoutDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/MergeRootFrameLayoutDetectorTest.java
@@ -28,20 +28,28 @@ public class MergeRootFrameLayoutDetectorTest extends AbstractCheckTest {
public void testMergeRefFromJava() throws Exception {
assertEquals(
- "simple.xml:3: Warning: This <FrameLayout> can be replaced with a <merge> tag",
- lintProject(
- "res/layout/simple.xml",
- "src/test/pkg/ImportFrameActivity.java.txt=>src/test/pkg/ImportFrameActivity.java"
- ));
+ "res/layout/simple.xml:3: Warning: This <FrameLayout> can be replaced with a <merge> tag [MergeRootFrame]\n" +
+ "<FrameLayout\n" +
+ "^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
+ lintProject(
+ "res/layout/simple.xml",
+ "src/test/pkg/ImportFrameActivity.java.txt=>src/test/pkg/ImportFrameActivity.java"
+ ));
}
public void testMergeRefFromInclude() throws Exception {
assertEquals(
- "simple.xml:3: Warning: This <FrameLayout> can be replaced with a <merge> tag",
- lintProject(
- "res/layout/simple.xml",
- "res/layout/simpleinclude.xml"
- ));
+ "res/layout/simple.xml:3: Warning: This <FrameLayout> can be replaced with a <merge> tag [MergeRootFrame]\n" +
+ "<FrameLayout\n" +
+ "^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
+ lintProject(
+ "res/layout/simple.xml",
+ "res/layout/simpleinclude.xml"
+ ));
}
public void testMergeRefFromIncludeSuppressed() throws Exception {
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/NamespaceDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/NamespaceDetectorTest.java
index 560db91..0912733 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/NamespaceDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/NamespaceDetectorTest.java
@@ -27,8 +27,11 @@ public class NamespaceDetectorTest extends AbstractCheckTest {
public void testCustom() throws Exception {
assertEquals(
- "customview.xml:16: Error: When using a custom namespace attribute in a library " +
- "project, use the namespace \"http://schemas.android.com/apk/res-auto\" instead.",
+ "res/layout/customview.xml:16: Error: When using a custom namespace attribute in a library project, use the namespace \"http://schemas.android.com/apk/res-auto\" instead. [LibraryCustomView]\n" +
+ " foo:misc=\"Custom attribute\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "1 errors, 0 warnings\n" +
+ "",
lintProject(
"multiproject/library-manifest.xml=>AndroidManifest.xml",
@@ -66,29 +69,35 @@ public class NamespaceDetectorTest extends AbstractCheckTest {
public void testTypo() throws Exception {
assertEquals(
- "wrong_namespace.xml:2: Warning: Unexpected namespace URI bound to the " +
- "\"android\" prefix, was http://schemas.android.com/apk/res/andriod, " +
- "expected http://schemas.android.com/apk/res/android",
+ "res/layout/wrong_namespace.xml:2: Warning: Unexpected namespace URI bound to the \"android\" prefix, was http://schemas.android.com/apk/res/andriod, expected http://schemas.android.com/apk/res/android [NamespaceTypo]\n" +
+ "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/andriod\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
- lintProject("res/layout/wrong_namespace.xml"));
+ lintProject("res/layout/wrong_namespace.xml"));
}
public void testTypo2() throws Exception {
assertEquals(
- "wrong_namespace2.xml:2: Warning: URI is case sensitive: was " +
- "\"http://schemas.android.com/apk/res/Android\", expected " +
- "\"http://schemas.android.com/apk/res/android\"",
+ "res/layout/wrong_namespace2.xml:2: Warning: URI is case sensitive: was \"http://schemas.android.com/apk/res/Android\", expected \"http://schemas.android.com/apk/res/android\" [NamespaceTypo]\n" +
+ "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/Android\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
- lintProject("res/layout/wrong_namespace2.xml"));
+ lintProject("res/layout/wrong_namespace2.xml"));
}
public void testTypo3() throws Exception {
assertEquals(
- "wrong_namespace3.xml:2: Warning: Unexpected namespace URI bound to the " +
- "\"android\" prefix, was http://schemas.android.com/apk/res/androi, " +
- "expected http://schemas.android.com/apk/res/android",
+ "res/layout/wrong_namespace3.xml:2: Warning: Unexpected namespace URI bound to the \"android\" prefix, was http://schemas.android.com/apk/res/androi, expected http://schemas.android.com/apk/res/android [NamespaceTypo]\n" +
+ "<LinearLayout xmlns:a=\"http://schemas.android.com/apk/res/androi\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
- lintProject("res/layout/wrong_namespace3.xml"));
+ lintProject("res/layout/wrong_namespace3.xml"));
}
public void testTypoOk() throws Exception {
@@ -100,10 +109,16 @@ public class NamespaceDetectorTest extends AbstractCheckTest {
public void testUnused() throws Exception {
assertEquals(
- "unused_namespace.xml:3: Warning: Unused namespace unused1\n" +
- "unused_namespace.xml:4: Warning: Unused namespace unused2",
-
- lintProject("res/layout/unused_namespace.xml"));
+ "res/layout/unused_namespace.xml:3: Warning: Unused namespace unused1 [UnusedNamespace]\n" +
+ " xmlns:unused1=\"http://schemas.android.com/apk/res/unused1\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/unused_namespace.xml:4: Warning: Unused namespace unused2 [UnusedNamespace]\n" +
+ " xmlns:unused2=\"http://schemas.android.com/apk/res/unused1\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 2 warnings\n" +
+ "",
+
+ lintProject("res/layout/unused_namespace.xml"));
}
public void testUnusedOk() throws Exception {
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/NestedScrollingWidgetDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/NestedScrollingWidgetDetectorTest.java
index dfcd131..55da17e 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/NestedScrollingWidgetDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/NestedScrollingWidgetDetectorTest.java
@@ -27,8 +27,11 @@ public class NestedScrollingWidgetDetectorTest extends AbstractCheckTest {
public void testNested() throws Exception {
assertEquals(
- "scrolling.xml:13: Warning: The vertically scrolling ScrollView should not " +
- "contain another vertically scrolling widget (ListView)",
- lintFiles("res/layout/scrolling.xml"));
+ "res/layout/scrolling.xml:13: Warning: The vertically scrolling ScrollView should not contain another vertically scrolling widget (ListView) [NestedScrolling]\n" +
+ " <ListView\n" +
+ " ^\n" +
+ "0 errors, 1 warnings\n",
+
+ lintFiles("res/layout/scrolling.xml"));
}
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/NonInternationalizedSmsDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/NonInternationalizedSmsDetectorTest.java
index d51acb2..46e494e 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/NonInternationalizedSmsDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/NonInternationalizedSmsDetectorTest.java
@@ -27,7 +27,11 @@ public class NonInternationalizedSmsDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "NonInternationalizedSmsDetectorTest.java:18: Warning: To make sure the SMS can be sent by all users, please start the SMS numberwith a + and a country code or restrict the code invocation to people in the country you are targeting.",
+ "src/test/pkg/NonInternationalizedSmsDetectorTest.java:18: Warning: To make sure the SMS can be sent by all users, please start the SMS numberwith a + and a country code or restrict the code invocation to people in the country you are targeting. [UnlocalizedSms]\n" +
+ " sms.sendMultipartTextMessage(\"001234567890\", null, null, null, null);\n" +
+ " ~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject("src/test/pkg/NonInternationalizedSmsDetectorTest.java.txt=>src/test/pkg/NonInternationalizedSmsDetectorTest.java"));
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ObsoleteLayoutParamsDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ObsoleteLayoutParamsDetectorTest.java
index 86af3ac..87211a2 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ObsoleteLayoutParamsDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ObsoleteLayoutParamsDetectorTest.java
@@ -27,13 +27,29 @@ public class ObsoleteLayoutParamsDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "wrongparams.xml:11: Warning: Invalid layout param in a FrameLayout: layout_weight\n" +
- "wrongparams.xml:23: Warning: Invalid layout param in a LinearLayout: layout_alignParentLeft\n" +
- "wrongparams.xml:24: Warning: Invalid layout param in a LinearLayout: layout_alignParentTop\n" +
- "wrongparams.xml:33: Warning: Invalid layout param in a LinearLayout: layout_alignBottom\n" +
- "wrongparams.xml:34: Warning: Invalid layout param in a LinearLayout: layout_toRightOf\n" +
- "wrongparams.xml:42: Warning: Invalid layout param in a LinearLayout: layout_alignLeft\n" +
- "wrongparams.xml:43: Warning: Invalid layout param in a LinearLayout: layout_below",
+ "res/layout/wrongparams.xml:11: Warning: Invalid layout param in a FrameLayout: layout_weight [ObsoleteLayoutParam]\n" +
+ " android:layout_weight=\"1\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/wrongparams.xml:23: Warning: Invalid layout param in a LinearLayout: layout_alignParentLeft [ObsoleteLayoutParam]\n" +
+ " android:layout_alignParentLeft=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/wrongparams.xml:24: Warning: Invalid layout param in a LinearLayout: layout_alignParentTop [ObsoleteLayoutParam]\n" +
+ " android:layout_alignParentTop=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/wrongparams.xml:33: Warning: Invalid layout param in a LinearLayout: layout_alignBottom [ObsoleteLayoutParam]\n" +
+ " android:layout_alignBottom=\"@+id/button1\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/wrongparams.xml:34: Warning: Invalid layout param in a LinearLayout: layout_toRightOf [ObsoleteLayoutParam]\n" +
+ " android:layout_toRightOf=\"@+id/button1\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/wrongparams.xml:42: Warning: Invalid layout param in a LinearLayout: layout_alignLeft [ObsoleteLayoutParam]\n" +
+ " android:layout_alignLeft=\"@+id/button1\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/wrongparams.xml:43: Warning: Invalid layout param in a LinearLayout: layout_below [ObsoleteLayoutParam]\n" +
+ " android:layout_below=\"@+id/button1\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 7 warnings\n" +
+ "",
lintProject("res/layout/wrongparams.xml"));
}
@@ -50,7 +66,11 @@ public class ObsoleteLayoutParamsDetectorTest extends AbstractCheckTest {
public void test3() throws Exception {
// Test includes across files (wrong layout param on root element)
assertEquals(
- "wrongparams3.xml:5: Warning: Invalid layout param 'layout_alignParentTop' (included from within a LinearLayout in layout/wrongparams4.xml)",
+ "res/layout/wrongparams3.xml:5: Warning: Invalid layout param 'layout_alignParentTop' (included from within a LinearLayout in layout/wrongparams4.xml) [ObsoleteLayoutParam]\n" +
+ " android:layout_alignParentTop=\"true\" >\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject("res/layout/wrongparams4.xml", "res/layout/wrongparams3.xml"));
}
@@ -58,8 +78,14 @@ public class ObsoleteLayoutParamsDetectorTest extends AbstractCheckTest {
public void test4() throws Exception {
// Test includes with a <merge> (wrong layout param on child of root merge element)
assertEquals(
- "wrongparams5.xml:15: Warning: Invalid layout param 'layout_alignParentLeft' (included from within a LinearLayout in layout/wrongparams6.xml)\n" +
- "wrongparams5.xml:8: Warning: Invalid layout param 'layout_alignParentTop' (included from within a LinearLayout in layout/wrongparams6.xml)",
+ "res/layout/wrongparams5.xml:8: Warning: Invalid layout param 'layout_alignParentTop' (included from within a LinearLayout in layout/wrongparams6.xml) [ObsoleteLayoutParam]\n" +
+ " android:layout_alignParentTop=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/wrongparams5.xml:15: Warning: Invalid layout param 'layout_alignParentLeft' (included from within a LinearLayout in layout/wrongparams6.xml) [ObsoleteLayoutParam]\n" +
+ " android:layout_alignParentLeft=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 2 warnings\n" +
+ "",
lintProject("res/layout/wrongparams5.xml", "res/layout/wrongparams6.xml"));
}
@@ -67,7 +93,11 @@ public class ObsoleteLayoutParamsDetectorTest extends AbstractCheckTest {
public void testIgnore() throws Exception {
assertEquals(
// Ignoring all but one of the warnings
- "wrongparams.xml:12: Warning: Invalid layout param in a FrameLayout: layout_weight",
+ "res/layout/wrongparams.xml:12: Warning: Invalid layout param in a FrameLayout: layout_weight [ObsoleteLayoutParam]\n" +
+ " android:layout_weight=\"1\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject("res/layout/wrongparams_ignore.xml=>res/layout/wrongparams.xml"));
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/OnClickDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/OnClickDetectorTest.java
index 53362ea..e9f70d4 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/OnClickDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/OnClickDetectorTest.java
@@ -27,15 +27,35 @@ public class OnClickDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "OnClickActivity.java:27: Error: On click handler wrong5(View) must be public\n" +
- "OnClickActivity.java:31: Error: On click handler wrong6(View) should not be static\n" +
- "OnClickActivity.java:45: Error: On click handler wrong7(View) must be public\n" +
- "onclick.xml:10: Error: Corresponding method handler 'public void nonexistent(android.view.View)' not found\n" +
- "onclick.xml:16: Error: Corresponding method handler 'public void wrong1(android.view.View)' not found\n" +
- "onclick.xml:22: Error: Corresponding method handler 'public void wrong2(android.view.View)' not found\n" +
- "onclick.xml:28: Error: Corresponding method handler 'public void wrong3(android.view.View)' not found\n" +
- "onclick.xml:34: Error: Corresponding method handler 'public void wrong4(android.view.View)' not found\n" +
- "onclick.xml:58: Error: Corresponding method handler 'public void simple_typo(android.view.View)' not found (did you mean void test.pkg.OnClickActivity#simple_tyop(android.view.View) ?)",
+ "src/test/pkg/OnClickActivity.java:27: Error: On click handler wrong5(View) must be public [OnClick]\n" +
+ " void wrong5(View view) {\n" +
+ " ~~~~~~\n" +
+ "src/test/pkg/OnClickActivity.java:31: Error: On click handler wrong6(View) should not be static [OnClick]\n" +
+ " public static void wrong6(View view) {\n" +
+ " ~~~~~~\n" +
+ "src/test/pkg/OnClickActivity.java:45: Error: On click handler wrong7(View) must be public [OnClick]\n" +
+ " void wrong7(View view) {\n" +
+ " ~~~~~~\n" +
+ "res/layout/onclick.xml:10: Error: Corresponding method handler 'public void nonexistent(android.view.View)' not found [OnClick]\n" +
+ " android:onClick=\"nonexistent\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/onclick.xml:16: Error: Corresponding method handler 'public void wrong1(android.view.View)' not found [OnClick]\n" +
+ " android:onClick=\"wrong1\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/onclick.xml:22: Error: Corresponding method handler 'public void wrong2(android.view.View)' not found [OnClick]\n" +
+ " android:onClick=\"wrong2\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/onclick.xml:28: Error: Corresponding method handler 'public void wrong3(android.view.View)' not found [OnClick]\n" +
+ " android:onClick=\"wrong3\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/onclick.xml:34: Error: Corresponding method handler 'public void wrong4(android.view.View)' not found [OnClick]\n" +
+ " android:onClick=\"wrong4\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/onclick.xml:58: Error: Corresponding method handler 'public void simple_typo(android.view.View)' not found (did you mean void test.pkg.OnClickActivity#simple_tyop(android.view.View) ?) [OnClick]\n" +
+ " android:onClick=\"simple_typo\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "9 errors, 0 warnings\n" +
+ "",
lintProject(
"bytecode/.classpath=>.classpath",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/OverdrawDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/OverdrawDetectorTest.java
index bd8eb4d..7da4004 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/OverdrawDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/OverdrawDetectorTest.java
@@ -27,10 +27,20 @@ public class OverdrawDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "main.xml:5: Warning: Possible overdraw: Root element paints background @drawable/ic_launcher with a theme that also paints a background (inferred theme is @style/MyTheme_First)\n" +
- "second.xml:5: Warning: Possible overdraw: Root element paints background @drawable/ic_launcher with a theme that also paints a background (inferred theme is @style/MyTheme)\n" +
- "sixth.xml:4: Warning: Possible overdraw: Root element paints background @drawable/custombg with a theme that also paints a background (inferred theme is @style/MyTheme)\n" +
- "third.xml:5: Warning: Possible overdraw: Root element paints background @drawable/ic_launcher with a theme that also paints a background (inferred theme is @style/MyTheme_Third)",
+ "res/layout/main.xml:5: Warning: Possible overdraw: Root element paints background @drawable/ic_launcher with a theme that also paints a background (inferred theme is @style/MyTheme_First) [Overdraw]\n" +
+ " android:background=\"@drawable/ic_launcher\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/second.xml:5: Warning: Possible overdraw: Root element paints background @drawable/ic_launcher with a theme that also paints a background (inferred theme is @style/MyTheme) [Overdraw]\n" +
+ " android:background=\"@drawable/ic_launcher\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/sixth.xml:4: Warning: Possible overdraw: Root element paints background @drawable/custombg with a theme that also paints a background (inferred theme is @style/MyTheme) [Overdraw]\n" +
+ " android:background=\"@drawable/custombg\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/third.xml:5: Warning: Possible overdraw: Root element paints background @drawable/ic_launcher with a theme that also paints a background (inferred theme is @style/MyTheme_Third) [Overdraw]\n" +
+ " android:background=\"@drawable/ic_launcher\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 4 warnings\n" +
+ "",
lintProject(
"overdraw/.classpath=>.classpath",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/PrivateKeyDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/PrivateKeyDetectorTest.java
index 7e338a9..ff72dcb 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/PrivateKeyDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/PrivateKeyDetectorTest.java
@@ -32,8 +32,8 @@ public class PrivateKeyDetectorTest extends AbstractCheckTest {
public void testPrivateKey() throws Exception {
assertEquals(
- "res/private_key.pem: Warning: The res/private_key.pem file seems to be a " +
- "private key file. Please make sure not to embed this in your APK file.",
+ "res/private_key.pem: Warning: The res/private_key.pem file seems to be a private key file. Please make sure not to embed this in your APK file. [PackagedPrivateKey]\n" +
+ "0 errors, 1 warnings\n",
lintProject(
// Not a private key file
"res/values/strings.xml=>res/values/strings/xml",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/PrivateResourceDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/PrivateResourceDetectorTest.java
index 26e8a2b..ce1b717 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/PrivateResourceDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/PrivateResourceDetectorTest.java
@@ -27,8 +27,11 @@ public class PrivateResourceDetectorTest extends AbstractCheckTest {
public void testPrivate() throws Exception {
assertEquals(
- "private.xml:3: Error: Illegal resource reference: @*android resources are " +
- "private and not always present",
- lintProject("res/layout/private.xml"));
+ "res/layout/private.xml:3: Error: Illegal resource reference: @*android resources are private and not always present [PrivateResource]\n" +
+ " <ImageView android:id=\"@+id/android_logo\" android:layout_width=\"wrap_content\" android:layout_height=\"wrap_content\" android:src=\"@*android:drawable/android_button\" android:focusable=\"false\" android:clickable=\"false\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "1 errors, 0 warnings\n" +
+ "",
+ lintProject("res/layout/private.xml"));
}
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ProguardDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ProguardDetectorTest.java
index f3d872b..c493b8c 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ProguardDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ProguardDetectorTest.java
@@ -27,30 +27,37 @@ public class ProguardDetectorTest extends AbstractCheckTest {
public void testProguard() throws Exception {
assertEquals(
- "proguard.cfg:21: Error: Obsolete ProGuard file; use -keepclasseswithmembers " +
- "instead of -keepclasseswithmembernames",
- lintFiles("proguard.cfg"));
+ "proguard.cfg:21: Error: Obsolete ProGuard file; use -keepclasseswithmembers instead of -keepclasseswithmembernames [Proguard]\n" +
+ "-keepclasseswithmembernames class * {\n" +
+ "^\n" +
+ "1 errors, 0 warnings\n" +
+ "",
+ lintFiles("proguard.cfg"));
}
public void testProguardNewPath() throws Exception {
assertEquals(
- "proguard-project.txt:21: Error: Obsolete ProGuard file; use " +
- "-keepclasseswithmembers instead of -keepclasseswithmembernames",
- lintFiles("proguard.cfg=>proguard-project.txt"));
+ "proguard-project.txt:21: Error: Obsolete ProGuard file; use -keepclasseswithmembers instead of -keepclasseswithmembernames [Proguard]\n" +
+ "-keepclasseswithmembernames class * {\n" +
+ "^\n" +
+ "1 errors, 0 warnings\n" +
+ "",
+ lintFiles("proguard.cfg=>proguard-project.txt"));
}
public void testProguardRandomName() throws Exception {
assertEquals(
- "myfile.txt:21: Error: Obsolete ProGuard file; use -keepclasseswithmembers " +
- "instead of -keepclasseswithmembernames\n" +
- "myfile.txt:8: Warning: Local ProGuard configuration contains general " +
- "Android configuration: Inherit these settings instead? Modify " +
- "project.properties to define proguard.config=${sdk.dir}/tools/proguard/" +
- "proguard-android.txt:myfile.txt and then keep only project-specific " +
- "configuration here",
- lintProject(
- "proguard.cfg=>myfile.txt",
- "proguard.properties=>project.properties"));
+ "myfile.txt:21: Error: Obsolete ProGuard file; use -keepclasseswithmembers instead of -keepclasseswithmembernames [Proguard]\n" +
+ "-keepclasseswithmembernames class * {\n" +
+ "^\n" +
+ "myfile.txt:8: Warning: Local ProGuard configuration contains general Android configuration: Inherit these settings instead? Modify project.properties to define proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:myfile.txt and then keep only project-specific configuration here [ProguardSplit]\n" +
+ "-keep public class * extends android.app.Activity\n" +
+ "^\n" +
+ "1 errors, 1 warnings\n" +
+ "",
+ lintProject(
+ "proguard.cfg=>myfile.txt",
+ "proguard.properties=>project.properties"));
}
public void testSilent() throws Exception {
@@ -73,14 +80,14 @@ public class ProguardDetectorTest extends AbstractCheckTest {
public void testSplit() throws Exception {
assertEquals(
- "proguard.cfg:14: Warning: Local ProGuard configuration contains general " +
- "Android configuration: Inherit these settings instead? Modify " +
- "project.properties to define " +
- "proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard.cfg " +
- "and then keep only project-specific configuration here",
+ "proguard.cfg:14: Warning: Local ProGuard configuration contains general Android configuration: Inherit these settings instead? Modify project.properties to define proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard.cfg and then keep only project-specific configuration here [ProguardSplit]\n" +
+ "-keep public class * extends android.app.Activity\n" +
+ "^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
- lintFiles(
- "proguard.pro=>proguard.cfg",
- "project.properties2=>project.properties"));
+ lintFiles(
+ "proguard.pro=>proguard.cfg",
+ "project.properties2=>project.properties"));
}
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/PxUsageDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/PxUsageDetectorTest.java
index 76282e2..77ebd70 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/PxUsageDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/PxUsageDetectorTest.java
@@ -27,24 +27,46 @@ public class PxUsageDetectorTest extends AbstractCheckTest {
public void testPx() throws Exception {
assertEquals(
- "now_playing_after.xml:41: Warning: Avoid using \"px\" as units; use \"dp\" instead",
+ "res/layout/now_playing_after.xml:41: Warning: Avoid using \"px\" as units; use \"dp\" instead [PxUsage]\n" +
+ " android:layout_width=\"1px\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintFiles("res/layout/now_playing_after.xml"));
}
public void testSp() throws Exception {
assertEquals(
- "textsize.xml:11: Warning: Should use \"sp\" instead of \"dp\" for text sizes\n" +
- "textsize.xml:16: Warning: Should use \"sp\" instead of \"dp\" for text sizes",
+ "res/layout/textsize.xml:11: Warning: Should use \"sp\" instead of \"dp\" for text sizes [SpUsage]\n" +
+ " android:textSize=\"14dp\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/textsize.xml:16: Warning: Should use \"sp\" instead of \"dp\" for text sizes [SpUsage]\n" +
+ " android:textSize=\"14dip\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 2 warnings\n" +
+ "",
lintFiles("res/layout/textsize.xml"));
}
public void testStyles() throws Exception {
assertEquals(
- "pxsp.xml:12: Warning: Should use \"sp\" instead of \"dp\" for text sizes\n" +
- "pxsp.xml:17: Warning: Avoid using \"px\" as units; use \"dp\" instead\n" +
- "pxsp.xml:18: Warning: Avoid using \"px\" as units; use \"dp\" instead\n" +
- "pxsp.xml:6: Warning: Should use \"sp\" instead of \"dp\" for text sizes\n" +
- "pxsp.xml:9: Warning: Avoid using \"px\" as units; use \"dp\" instead",
+ "res/values/pxsp.xml:9: Warning: Avoid using \"px\" as units; use \"dp\" instead [PxUsage]\n" +
+ " <item name=\"android:textSize\">50px</item>\n" +
+ " ^\n" +
+ "res/values/pxsp.xml:17: Warning: Avoid using \"px\" as units; use \"dp\" instead [PxUsage]\n" +
+ " <item name=\"android:paddingRight\"> 50px </item>\n" +
+ " ^\n" +
+ "res/values/pxsp.xml:18: Warning: Avoid using \"px\" as units; use \"dp\" instead [PxUsage]\n" +
+ " <item name=\"android:paddingTop\">50px</item>\n" +
+ " ^\n" +
+ "res/values/pxsp.xml:6: Warning: Should use \"sp\" instead of \"dp\" for text sizes [SpUsage]\n" +
+ " <item name=\"android:textSize\">50dp</item>\n" +
+ " ^\n" +
+ "res/values/pxsp.xml:12: Warning: Should use \"sp\" instead of \"dp\" for text sizes [SpUsage]\n" +
+ " <item name=\"android:textSize\"> 50dip </item>\n" +
+ " ^\n" +
+ "0 errors, 5 warnings\n" +
+ "",
lintFiles("res/values/pxsp.xml"));
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/RegistrationDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/RegistrationDetectorTest.java
index 2369fad..23a5ac3 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/RegistrationDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/RegistrationDetectorTest.java
@@ -27,10 +27,20 @@ public class RegistrationDetectorTest extends AbstractCheckTest {
public void testRegistered() throws Exception {
assertEquals(
- "OnClickActivity.java:8: Warning: The <activity> test.pkg.OnClickActivity is not registered in the manifest\n" +
- "TestProvider.java:8: Warning: The <provider> test.pkg.TestProvider is not registered in the manifest\n" +
- "TestProvider2.java:3: Warning: The <provider> test.pkg.TestProvider2 is not registered in the manifest\n" +
- "TestService.java:7: Warning: The <service> test.pkg.TestService is not registered in the manifest",
+ "src/test/pkg/OnClickActivity.java:8: Warning: The <activity> test.pkg.OnClickActivity is not registered in the manifest [Registered]\n" +
+ "public class OnClickActivity extends Activity {\n" +
+ " ~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/TestProvider.java:8: Warning: The <provider> test.pkg.TestProvider is not registered in the manifest [Registered]\n" +
+ "public class TestProvider extends ContentProvider {\n" +
+ " ~~~~~~~~~~~~\n" +
+ "src/test/pkg/TestProvider2.java:3: Warning: The <provider> test.pkg.TestProvider2 is not registered in the manifest [Registered]\n" +
+ "public class TestProvider2 extends TestProvider {\n" +
+ "^\n" +
+ "src/test/pkg/TestService.java:7: Warning: The <service> test.pkg.TestService is not registered in the manifest [Registered]\n" +
+ "public class TestService extends Service {\n" +
+ " ~~~~~~~~~~~\n" +
+ "0 errors, 4 warnings\n" +
+ "",
lintProject(
"bytecode/.classpath=>.classpath",
@@ -61,11 +71,23 @@ public class RegistrationDetectorTest extends AbstractCheckTest {
public void testWrongRegistrations() throws Exception {
assertEquals(
- "OnClickActivity.java:8: Warning: test.pkg.OnClickActivity is a <activity> but is registered in the manifest as a <receiver>\n" +
- "TestProvider.java:8: Warning: test.pkg.TestProvider is a <provider> but is registered in the manifest as a <activity>\n" +
- "TestProvider2.java:3: Warning: test.pkg.TestProvider2 is a <provider> but is registered in the manifest as a <service>\n" +
- "TestReceiver.java:7: Warning: test.pkg.TestReceiver is a <receiver> but is registered in the manifest as a <service>\n" +
- "TestService.java:7: Warning: test.pkg.TestService is a <service> but is registered in the manifest as a <provider>",
+ "src/test/pkg/OnClickActivity.java:8: Warning: test.pkg.OnClickActivity is a <activity> but is registered in the manifest as a <receiver> [Registered]\n" +
+ "public class OnClickActivity extends Activity {\n" +
+ " ~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/TestProvider.java:8: Warning: test.pkg.TestProvider is a <provider> but is registered in the manifest as a <activity> [Registered]\n" +
+ "public class TestProvider extends ContentProvider {\n" +
+ " ~~~~~~~~~~~~\n" +
+ "src/test/pkg/TestProvider2.java:3: Warning: test.pkg.TestProvider2 is a <provider> but is registered in the manifest as a <service> [Registered]\n" +
+ "public class TestProvider2 extends TestProvider {\n" +
+ "^\n" +
+ "src/test/pkg/TestReceiver.java:7: Warning: test.pkg.TestReceiver is a <receiver> but is registered in the manifest as a <service> [Registered]\n" +
+ "public class TestReceiver extends BroadcastReceiver {\n" +
+ " ~~~~~~~~~~~~\n" +
+ "src/test/pkg/TestService.java:7: Warning: test.pkg.TestService is a <service> but is registered in the manifest as a <provider> [Registered]\n" +
+ "public class TestService extends Service {\n" +
+ " ~~~~~~~~~~~\n" +
+ "0 errors, 5 warnings\n" +
+ "",
lintProject(
"bytecode/.classpath=>.classpath",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ScrollViewChildDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ScrollViewChildDetectorTest.java
index 678c3a8..ba79c50 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ScrollViewChildDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ScrollViewChildDetectorTest.java
@@ -27,8 +27,11 @@ public class ScrollViewChildDetectorTest extends AbstractCheckTest {
public void testScrollView() throws Exception {
assertEquals(
- "wrong_dimension.xml:10: Warning: This LinearLayout should use " +
- "android:layout_width=\"wrap_content\"",
+ "res/layout/wrong_dimension.xml:10: Warning: This LinearLayout should use android:layout_width=\"wrap_content\" [ScrollViewSize]\n" +
+ " android:layout_width=\"match_parent\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintFiles("res/layout/wrong_dimension.xml"));
}
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SdCardDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SdCardDetectorTest.java
index 58c019d..1acbb87 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SdCardDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SdCardDetectorTest.java
@@ -27,23 +27,47 @@ public class SdCardDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "SdCardTest.java:13: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead\n" +
- "SdCardTest.java:14: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead\n" +
- "SdCardTest.java:15: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead\n" +
- "SdCardTest.java:16: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead\n" +
- "SdCardTest.java:20: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead\n" +
- "SdCardTest.java:22: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead\n" +
- "SdCardTest.java:24: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead\n" +
- "SdCardTest.java:30: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead\n" +
- "SdCardTest.java:31: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead",
-
- lintProject("src/test/pkg/SdCardTest.java.txt=>src/test/pkg/SdCardTest.java"));
+ "src/test/pkg/SdCardTest.java:13: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead [SdCardPath]\n" +
+ " private static final String SDCARD_TEST_HTML = \"/sdcard/test.html\";\n" +
+ " ~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/SdCardTest.java:14: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead [SdCardPath]\n" +
+ " public static final String SDCARD_ROOT = \"/sdcard\";\n" +
+ " ~~~~~~~~~\n" +
+ "src/test/pkg/SdCardTest.java:15: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead [SdCardPath]\n" +
+ " public static final String PACKAGES_PATH = \"/sdcard/o/packages/\";\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/SdCardTest.java:16: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead [SdCardPath]\n" +
+ " File deviceDir = new File(\"/sdcard/vr\");\n" +
+ " ~~~~~~~~~~~~\n" +
+ "src/test/pkg/SdCardTest.java:20: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead [SdCardPath]\n" +
+ " android.os.Debug.startMethodTracing(\"/sdcard/launcher\");\n" +
+ " ~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/SdCardTest.java:22: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead [SdCardPath]\n" +
+ " if (new File(\"/sdcard\").exists()) {\n" +
+ " ~~~~~~~~~\n" +
+ "src/test/pkg/SdCardTest.java:24: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead [SdCardPath]\n" +
+ " String FilePath = \"/sdcard/\" + new File(\"test\");\n" +
+ " ~~~~~~~~~~\n" +
+ "src/test/pkg/SdCardTest.java:30: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead [SdCardPath]\n" +
+ " intent.putExtra(\"path-filter\", \"/sdcard(/.+)*\");\n" +
+ " ~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/SdCardTest.java:31: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead [SdCardPath]\n" +
+ " intent.putExtra(\"start-dir\", \"/sdcard\");\n" +
+ " ~~~~~~~~~\n" +
+ "0 errors, 9 warnings\n" +
+ "",
+
+ lintProject("src/test/pkg/SdCardTest.java.txt=>src/test/pkg/SdCardTest.java"));
}
public void testSuppress() throws Exception {
assertEquals(
// The only reference in the file not covered by an annotation
- "SuppressTest5.java:40: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead",
+ "src/test/pkg/SuppressTest5.java:40: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead [SdCardPath]\n" +
+ " String notAnnotated = \"/sdcard/mypath\";\n" +
+ " ~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
// File with lots of /sdcard references, but with @SuppressLint warnings
// on fields, methods, variable declarations etc
@@ -52,7 +76,11 @@ public class SdCardDetectorTest extends AbstractCheckTest {
public void testUtf8Bom() throws Exception {
assertEquals(
- "Utf8BomTest.java:4: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead",
+ "src/test/pkg/Utf8BomTest.java:4: Warning: Do not hardcode \"/sdcard/\"; use Environment.getExternalStorageDirectory().getPath() instead [SdCardPath]\n" +
+ " String s = \"/sdcard/mydir\";\n" +
+ " ~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject("src/test/pkg/Utf8BomTest.java.data=>src/test/pkg/Utf8BomTest.java"));
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SecureRandomDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SecureRandomDetectorTest.java
index 67fc3c1..0ecbe02 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SecureRandomDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SecureRandomDetectorTest.java
@@ -27,13 +27,29 @@ public class SecureRandomDetectorTest extends AbstractCheckTest {
public void test1() throws Exception {
assertEquals(
- "SecureRandomTest.java:12: Warning: It is dangerous to seed SecureRandom with the current time because that value is more predictable to an attacker than the default seed.\n" +
- "SecureRandomTest.java:14: Warning: Do not call setSeed() on a SecureRandom with a fixed seed: it is not secure. Use getSeed().\n" +
- "SecureRandomTest.java:15: Warning: Do not call setSeed() on a SecureRandom with a fixed seed: it is not secure. Use getSeed().\n" +
- "SecureRandomTest.java:16: Warning: Do not call setSeed() on a SecureRandom with a fixed seed: it is not secure. Use getSeed().\n" +
- "SecureRandomTest.java:17: Warning: Do not call setSeed() on a SecureRandom with a fixed seed: it is not secure. Use getSeed().\n" +
- "SecureRandomTest.java:18: Warning: Do not call setSeed() on a SecureRandom with a fixed seed: it is not secure. Use getSeed().\n" +
- "SecureRandomTest.java:28: Warning: Do not call setSeed() on a SecureRandom with a fixed seed: it is not secure. Use getSeed().",
+ "src/test/pkg/SecureRandomTest.java:12: Warning: It is dangerous to seed SecureRandom with the current time because that value is more predictable to an attacker than the default seed. [SecureRandom]\n" +
+ " random1.setSeed(System.currentTimeMillis()); // OK\n" +
+ " ~~~~~~~\n" +
+ "src/test/pkg/SecureRandomTest.java:14: Warning: Do not call setSeed() on a SecureRandom with a fixed seed: it is not secure. Use getSeed(). [SecureRandom]\n" +
+ " random1.setSeed(0); // Wrong\n" +
+ " ~~~~~~~\n" +
+ "src/test/pkg/SecureRandomTest.java:15: Warning: Do not call setSeed() on a SecureRandom with a fixed seed: it is not secure. Use getSeed(). [SecureRandom]\n" +
+ " random1.setSeed(1); // Wrong\n" +
+ " ~~~~~~~\n" +
+ "src/test/pkg/SecureRandomTest.java:16: Warning: Do not call setSeed() on a SecureRandom with a fixed seed: it is not secure. Use getSeed(). [SecureRandom]\n" +
+ " random1.setSeed((int)1023); // Wrong\n" +
+ " ~~~~~~~\n" +
+ "src/test/pkg/SecureRandomTest.java:17: Warning: Do not call setSeed() on a SecureRandom with a fixed seed: it is not secure. Use getSeed(). [SecureRandom]\n" +
+ " random1.setSeed(1023L); // Wrong\n" +
+ " ~~~~~~~\n" +
+ "src/test/pkg/SecureRandomTest.java:18: Warning: Do not call setSeed() on a SecureRandom with a fixed seed: it is not secure. Use getSeed(). [SecureRandom]\n" +
+ " random1.setSeed(FIXED_SEED); // Wrong\n" +
+ " ~~~~~~~\n" +
+ "src/test/pkg/SecureRandomTest.java:28: Warning: Do not call setSeed() on a SecureRandom with a fixed seed: it is not secure. Use getSeed(). [SecureRandom]\n" +
+ " random3.setSeed(0); // Wrong: owner is java/util/Random, but applied to SecureRandom object\n" +
+ " ~~~~~~~\n" +
+ "0 errors, 7 warnings\n" +
+ "",
// Missing error on line 40, using flow analysis to determine that the seed byte
// array passed into the SecureRandom constructor is static.
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SecurityDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SecurityDetectorTest.java
index a52041d..1c293c3 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SecurityDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SecurityDetectorTest.java
@@ -27,7 +27,11 @@ public class SecurityDetectorTest extends AbstractCheckTest {
public void testBroken() throws Exception {
assertEquals(
- "AndroidManifest.xml:12: Warning: Exported service does not require permission",
+ "AndroidManifest.xml:12: Warning: Exported service does not require permission [ExportedService]\n" +
+ " <service\n" +
+ " ^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"exportservice1.xml=>AndroidManifest.xml",
"res/values/strings.xml"));
@@ -35,7 +39,11 @@ public class SecurityDetectorTest extends AbstractCheckTest {
public void testBroken2() throws Exception {
assertEquals(
- "AndroidManifest.xml:12: Warning: Exported service does not require permission",
+ "AndroidManifest.xml:12: Warning: Exported service does not require permission [ExportedService]\n" +
+ " <service\n" +
+ " ^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"exportservice2.xml=>AndroidManifest.xml",
"res/values/strings.xml"));
@@ -44,7 +52,11 @@ public class SecurityDetectorTest extends AbstractCheckTest {
public void testBroken3() throws Exception {
// Not defining exported, but have intent-filters
assertEquals(
- "AndroidManifest.xml:12: Warning: Exported service does not require permission",
+ "AndroidManifest.xml:12: Warning: Exported service does not require permission [ExportedService]\n" +
+ " <service\n" +
+ " ^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"exportservice5.xml=>AndroidManifest.xml",
"res/values/strings.xml"));
@@ -70,8 +82,14 @@ public class SecurityDetectorTest extends AbstractCheckTest {
public void testUri() throws Exception {
assertEquals(
- "AndroidManifest.xml:25: Warning: Content provider shares everything; this is potentially dangerous.\n" +
- "AndroidManifest.xml:26: Warning: Content provider shares everything; this is potentially dangerous.",
+ "AndroidManifest.xml:25: Warning: Content provider shares everything; this is potentially dangerous. [GrantAllUris]\n" +
+ " <grant-uri-permission android:path=\"/\"/>\n" +
+ " ~~~~~~~~~~~~~~~~\n" +
+ "AndroidManifest.xml:26: Warning: Content provider shares everything; this is potentially dangerous. [GrantAllUris]\n" +
+ " <grant-uri-permission android:pathPrefix=\"/\"/>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 2 warnings\n" +
+ "",
lintProject(
"grantpermission.xml=>AndroidManifest.xml",
@@ -81,11 +99,17 @@ public class SecurityDetectorTest extends AbstractCheckTest {
// exportprovider1.xml has two exported content providers with no permissions
public void testContentProvider1() throws Exception {
assertEquals(
- "AndroidManifest.xml:14: Warning: Exported content providers can provide access to potentially sensitive data\n" +
- "AndroidManifest.xml:20: Warning: Exported content providers can provide access to potentially sensitive data",
- lintProject(
- "exportprovider1.xml=>AndroidManifest.xml",
- "res/values/strings.xml"));
+ "AndroidManifest.xml:14: Warning: Exported content providers can provide access to potentially sensitive data [ExportedContentProvider]\n" +
+ " <provider\n" +
+ " ^\n" +
+ "AndroidManifest.xml:20: Warning: Exported content providers can provide access to potentially sensitive data [ExportedContentProvider]\n" +
+ " <provider\n" +
+ " ^\n" +
+ "0 errors, 2 warnings\n" +
+ "",
+ lintProject(
+ "exportprovider1.xml=>AndroidManifest.xml",
+ "res/values/strings.xml"));
}
// exportprovider2.xml has no un-permissioned exported content providers
@@ -99,10 +123,20 @@ public class SecurityDetectorTest extends AbstractCheckTest {
public void testWorldWriteable() throws Exception {
assertEquals(
- "WorldWriteableFile.java:25: Warning: Using MODE_WORLD_WRITEABLE when creating files can be risky, review carefully\n" +
- "WorldWriteableFile.java:26: Warning: Using MODE_WORLD_READABLE when creating files can be risky, review carefully\n" +
- "WorldWriteableFile.java:30: Warning: Using MODE_WORLD_WRITEABLE when creating files can be risky, review carefully\n" +
- "WorldWriteableFile.java:31: Warning: Using MODE_WORLD_READABLE when creating files can be risky, review carefully",
+ "src/test/pkg/WorldWriteableFile.java:26: Warning: Using MODE_WORLD_READABLE when creating files can be risky, review carefully [WorldReadableFiles]\n" +
+ " out = openFileOutput(mFile.getName(), MODE_WORLD_READABLE);\n" +
+ " ~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/WorldWriteableFile.java:31: Warning: Using MODE_WORLD_READABLE when creating files can be risky, review carefully [WorldReadableFiles]\n" +
+ " prefs = getSharedPreferences(mContext, MODE_WORLD_READABLE);\n" +
+ " ~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/WorldWriteableFile.java:25: Warning: Using MODE_WORLD_WRITEABLE when creating files can be risky, review carefully [WorldWriteableFiles]\n" +
+ " out = openFileOutput(mFile.getName(), MODE_WORLD_WRITEABLE);\n" +
+ " ~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/WorldWriteableFile.java:30: Warning: Using MODE_WORLD_WRITEABLE when creating files can be risky, review carefully [WorldWriteableFiles]\n" +
+ " prefs = getSharedPreferences(mContext, MODE_WORLD_WRITEABLE);\n" +
+ " ~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 4 warnings\n" +
+ "",
lintProject(
// Java files must be renamed in source tree
@@ -120,7 +154,11 @@ public class SecurityDetectorTest extends AbstractCheckTest {
public void testActivity1() throws Exception {
assertEquals(
- "AndroidManifest.xml:12: Warning: Exported activity does not require permission",
+ "AndroidManifest.xml:12: Warning: Exported activity does not require permission [ExportedActivity]\n" +
+ " <activity\n" +
+ " ^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"exportactivity1.xml=>AndroidManifest.xml",
"res/values/strings.xml"));
@@ -147,7 +185,11 @@ public class SecurityDetectorTest extends AbstractCheckTest {
public void testActivity4() throws Exception {
// Not defining exported, but have intent-filters
assertEquals(
- "AndroidManifest.xml:12: Warning: Exported activity does not require permission",
+ "AndroidManifest.xml:12: Warning: Exported activity does not require permission [ExportedActivity]\n" +
+ " <activity\n" +
+ " ^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"exportactivity4.xml=>AndroidManifest.xml",
"res/values/strings.xml"));
@@ -164,7 +206,11 @@ public class SecurityDetectorTest extends AbstractCheckTest {
public void testReceiver1() throws Exception {
assertEquals(
- "AndroidManifest.xml:12: Warning: Exported receiver does not require permission",
+ "AndroidManifest.xml:12: Warning: Exported receiver does not require permission [ExportedReceiver]\n" +
+ " <receiver\n" +
+ " ^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"exportreceiver1.xml=>AndroidManifest.xml",
"res/values/strings.xml"));
@@ -191,7 +237,11 @@ public class SecurityDetectorTest extends AbstractCheckTest {
public void testReceiver4() throws Exception {
// Not defining exported, but have intent-filters
assertEquals(
- "AndroidManifest.xml:12: Warning: Exported receiver does not require permission",
+ "AndroidManifest.xml:12: Warning: Exported receiver does not require permission [ExportedReceiver]\n" +
+ " <receiver\n" +
+ " ^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"exportreceiver4.xml=>AndroidManifest.xml",
"res/values/strings.xml"));
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SetJavaScriptEnabledDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SetJavaScriptEnabledDetectorTest.java
index f5d2b60..4979e6a 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SetJavaScriptEnabledDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SetJavaScriptEnabledDetectorTest.java
@@ -25,12 +25,14 @@ public class SetJavaScriptEnabledDetectorTest extends AbstractCheckTest {
return new SetJavaScriptEnabledDetector();
}
- public void testAccessibility() throws Exception {
+ public void test() throws Exception {
assertEquals(
- "SetJavaScriptEnabled.java:14: Warning: Using setJavaScriptEnabled " +
- "can introduce XSS vulnerabilities into you application, review " +
- "carefully.",
- lintProject(
- "src/test/pkg/SetJavaScriptEnabled.java.txt=>src/test/pkg/SetJavaScriptEnabled.java"));
+ "src/test/pkg/SetJavaScriptEnabled.java:14: Warning: Using setJavaScriptEnabled can introduce XSS vulnerabilities into you application, review carefully. [SetJavaScriptEnabled]\n" +
+ " webView.getSettings().setJavaScriptEnabled(true); // bad\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
+ lintProject(
+ "src/test/pkg/SetJavaScriptEnabled.java.txt=>src/test/pkg/SetJavaScriptEnabled.java"));
}
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SharedPrefsDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SharedPrefsDetectorTest.java
index 574b23a..b77f3bd 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SharedPrefsDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/SharedPrefsDetectorTest.java
@@ -27,8 +27,14 @@ public class SharedPrefsDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "SharedPrefsTest.java:54: Warning: SharedPreferences.edit() without a corresponding commit() or apply() call\n" +
- "SharedPrefsTest.java:62: Warning: SharedPreferences.edit() without a corresponding commit() or apply() call",
+ "src/test/pkg/SharedPrefsTest.java:54: Warning: SharedPreferences.edit() without a corresponding commit() or apply() call [CommitPrefEdits]\n" +
+ " SharedPreferences.Editor editor = preferences.edit();\n" +
+ " ~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/SharedPrefsTest.java:62: Warning: SharedPreferences.edit() without a corresponding commit() or apply() call [CommitPrefEdits]\n" +
+ " SharedPreferences.Editor editor = preferences.edit();\n" +
+ " ~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 2 warnings\n" +
+ "",
lintProject("src/test/pkg/SharedPrefsTest.java.txt=>" +
"src/test/pkg/SharedPrefsTest.java"));
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/StateListDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/StateListDetectorTest.java
index 9176773..9ff67f4 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/StateListDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/StateListDetectorTest.java
@@ -27,21 +27,29 @@ public class StateListDetectorTest extends AbstractCheckTest {
public void testStates() throws Exception {
assertEquals(
- "drawable/states.xml:3: Warning: This item is unreachable because a previous item (item #1) is a more general match than this one\n" +
- "=> drawable/states.xml:2: Earlier item which masks item",
- lintProject("res/drawable/states.xml"));
+ "res/drawable/states.xml:3: Warning: This item is unreachable because a previous item (item #1) is a more general match than this one [StateListReachable]\n" +
+ " <item android:state_pressed=\"true\"\n" +
+ " ^\n" +
+ " res/drawable/states.xml:2: Earlier item which masks item\n" +
+ "0 errors, 1 warnings\n" +
+ "",
+ lintProject("res/drawable/states.xml"));
}
public void testCustomStates() throws Exception {
assertEquals(
- "No warnings.",
- lintProject("res/drawable/states2.xml"));
+ "No warnings.",
+ lintProject("res/drawable/states2.xml"));
}
public void testStates3() throws Exception {
assertEquals(
- "drawable/states3.xml:24: Warning: This item is unreachable because a previous item (item #1) is a more general match than this one\n" +
- "=> drawable/states3.xml:18: Earlier item which masks item",
- lintProject("res/drawable/states3.xml"));
+ "res/drawable/states3.xml:24: Warning: This item is unreachable because a previous item (item #1) is a more general match than this one [StateListReachable]\n" +
+ " <item android:state_checked=\"false\" android:state_window_focused=\"false\"\n" +
+ " ^\n" +
+ " res/drawable/states3.xml:18: Earlier item which masks item\n" +
+ "0 errors, 1 warnings\n" +
+ "",
+ lintProject("res/drawable/states3.xml"));
}
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/StringFormatDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/StringFormatDetectorTest.java
index a53440e..0ffaa08 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/StringFormatDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/StringFormatDetectorTest.java
@@ -30,23 +30,43 @@ public class StringFormatDetectorTest extends AbstractCheckTest {
public void testAll() throws Exception {
assertEquals(
- "formatstrings.xml:5: Warning: Formatting string 'missing' is not referencing numbered arguments [1, 2]\n" +
- "pkg/StringFormatActivity.java:13: Error: Wrong argument type for formatting argument '#1' in hello: conversion is 'd', received String\n" +
- "=> values-es/formatstrings.xml:3: Conflicting argument declaration here\n" +
- "pkg/StringFormatActivity.java:15: Error: Wrong argument count, format string hello2 requires 3 but format call supplies 2\n" +
- "=> values-es/formatstrings.xml:4: This definition requires 3 arguments\n" +
- "pkg/StringFormatActivity.java:24: Error: Wrong argument count, format string hello2 requires 3 but format call supplies 2\n" +
- "=> values-es/formatstrings.xml:4: This definition requires 3 arguments\n" +
- "pkg/StringFormatActivity.java:25: Error: Wrong argument count, format string hello2 requires 3 but format call supplies 2\n" +
- "=> values-es/formatstrings.xml:4: This definition requires 3 arguments\n" +
- "pkg/StringFormatActivity.java:26: Error: Wrong argument count, format string hello2 requires 3 but format call supplies 2\n" +
- "=> values-es/formatstrings.xml:4: This definition requires 3 arguments\n" +
- "pkg/StringFormatActivity.java:33: Error: Wrong argument type for formatting argument '#1' in hello: conversion is 'd', received String\n" +
- "=> values-es/formatstrings.xml:3: Conflicting argument declaration here\n" +
- "values-es/formatstrings.xml:3: Error: Inconsistent formatting types for argument #1 in format string hello ('%1$d'): Found both 's' and 'd' (in values/formatstrings.xml)\n" +
- "=> values/formatstrings.xml:3: Conflicting argument type here\n" +
- "values-es/formatstrings.xml:4: Warning: Inconsistent number of arguments in formatting string hello2; found both 2 and 3\n" +
- "=> values/formatstrings.xml:4: Conflicting number of arguments here",
+ "src/test/pkg/StringFormatActivity.java:13: Error: Wrong argument type for formatting argument '#1' in hello: conversion is 'd', received String [StringFormatMatches]\n" +
+ " String output1 = String.format(hello, target);\n" +
+ " ~~~~~~\n" +
+ " res/values-es/formatstrings.xml:3: Conflicting argument declaration here\n" +
+ "src/test/pkg/StringFormatActivity.java:15: Error: Wrong argument count, format string hello2 requires 3 but format call supplies 2 [StringFormatMatches]\n" +
+ " String output2 = String.format(hello2, target, \"How are you\");\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ " res/values-es/formatstrings.xml:4: This definition requires 3 arguments\n" +
+ "src/test/pkg/StringFormatActivity.java:24: Error: Wrong argument count, format string hello2 requires 3 but format call supplies 2 [StringFormatMatches]\n" +
+ " String.format(getResources().getString(R.string.hello2), target, \"How are you\");\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ " res/values-es/formatstrings.xml:4: This definition requires 3 arguments\n" +
+ "src/test/pkg/StringFormatActivity.java:25: Error: Wrong argument count, format string hello2 requires 3 but format call supplies 2 [StringFormatMatches]\n" +
+ " getResources().getString(hello2, target, \"How are you\");\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ " res/values-es/formatstrings.xml:4: This definition requires 3 arguments\n" +
+ "src/test/pkg/StringFormatActivity.java:26: Error: Wrong argument count, format string hello2 requires 3 but format call supplies 2 [StringFormatMatches]\n" +
+ " getResources().getString(R.string.hello2, target, \"How are you\");\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ " res/values-es/formatstrings.xml:4: This definition requires 3 arguments\n" +
+ "src/test/pkg/StringFormatActivity.java:33: Error: Wrong argument type for formatting argument '#1' in hello: conversion is 'd', received String [StringFormatMatches]\n" +
+ " String output1 = String.format(hello, target);\n" +
+ " ~~~~~~\n" +
+ " res/values-es/formatstrings.xml:3: Conflicting argument declaration here\n" +
+ "res/values-es/formatstrings.xml:3: Error: Inconsistent formatting types for argument #1 in format string hello ('%1$d'): Found both 's' and 'd' (in values/formatstrings.xml) [StringFormatMatches]\n" +
+ " <string name=\"hello\">%1$d</string>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ " res/values/formatstrings.xml:3: Conflicting argument type here\n" +
+ "res/values-es/formatstrings.xml:4: Warning: Inconsistent number of arguments in formatting string hello2; found both 2 and 3 [StringFormatCount]\n" +
+ " <string name=\"hello2\">%3$d: %1$s, %2$s?</string>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ " res/values/formatstrings.xml:4: Conflicting number of arguments here\n" +
+ "res/values/formatstrings.xml:5: Warning: Formatting string 'missing' is not referencing numbered arguments [1, 2] [StringFormatCount]\n" +
+ " <string name=\"missing\">Hello %3$s World</string>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "7 errors, 2 warnings\n" +
+ "",
lintProject(
"res/values/formatstrings.xml",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/StyleCycleDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/StyleCycleDetectorTest.java
index f31a26b..d4823d7 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/StyleCycleDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/StyleCycleDetectorTest.java
@@ -27,15 +27,22 @@ public class StyleCycleDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "styles.xml:9: Error: Style DetailsPage_EditorialBuyButton should not extend itself",
+ "res/values/styles.xml:9: Error: Style DetailsPage_EditorialBuyButton should not extend itself [StyleCycle]\n" +
+ "<style name=\"DetailsPage_EditorialBuyButton\" parent=\"@style/DetailsPage_EditorialBuyButton\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "1 errors, 0 warnings\n" +
+ "",
lintProject("res/values/styles.xml"));
}
public void test2() throws Exception {
assertEquals(
- "stylecycle.xml:3: Error: Potential cycle: PropertyToggle is the implied parent " +
- "of PropertyToggle.Base and this defines the opposite",
+ "res/values/stylecycle.xml:3: Error: Potential cycle: PropertyToggle is the implied parent of PropertyToggle.Base and this defines the opposite [StyleCycle]\n" +
+ " <style name=\"PropertyToggle\" parent=\"@style/PropertyToggle.Base\"></style>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "1 errors, 0 warnings\n" +
+ "",
lintProject("res/values/stylecycle.xml"));
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TextFieldDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TextFieldDetectorTest.java
index 58cdde8..85e4b8d 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TextFieldDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TextFieldDetectorTest.java
@@ -27,7 +27,11 @@ public class TextFieldDetectorTest extends AbstractCheckTest {
public void testField() throws Exception {
assertEquals(
- "note_edit.xml:50: Warning: This text field does not specify an inputType or a hint",
+ "res/layout/note_edit.xml:50: Warning: This text field does not specify an inputType or a hint [TextFields]\n" +
+ " <EditText\n" +
+ " ^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintFiles("res/layout/note_edit.xml"));
}
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TextViewDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TextViewDetectorTest.java
index a0bbb50..8c63bd8 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TextViewDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TextViewDetectorTest.java
@@ -27,27 +27,71 @@ public class TextViewDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "edit_textview.xml:13: Warning: Attribute android:autoText should not be used with <TextView>: Change element type to <EditText> ?\n" +
- "edit_textview.xml:14: Warning: Attribute android:bufferType should not be used with <TextView>: Change element type to <EditText> ?\n" +
- "edit_textview.xml:15: Warning: Attribute android:capitalize should not be used with <TextView>: Change element type to <EditText> ?\n" +
- "edit_textview.xml:16: Warning: Attribute android:cursorVisible should not be used with <TextView>: Change element type to <EditText> ?\n" +
- "edit_textview.xml:17: Warning: Attribute android:digits should not be used with <TextView>: Change element type to <EditText> ?\n" +
- "edit_textview.xml:18: Warning: Attribute android:editable should not be used with <TextView>: Change element type to <EditText> ?\n" +
- "edit_textview.xml:19: Warning: Attribute android:editorExtras should not be used with <TextView>: Change element type to <EditText> ?\n" +
- "edit_textview.xml:22: Warning: Attribute android:imeActionId should not be used with <TextView>: Change element type to <EditText> ?\n" +
- "edit_textview.xml:23: Warning: Attribute android:imeActionLabel should not be used with <TextView>: Change element type to <EditText> ?\n" +
- "edit_textview.xml:24: Warning: Attribute android:imeOptions should not be used with <TextView>: Change element type to <EditText> ?\n" +
- "edit_textview.xml:25: Warning: Attribute android:inputMethod should not be used with <TextView>: Change element type to <EditText> ?\n" +
- "edit_textview.xml:26: Warning: Attribute android:inputType should not be used with <TextView>: Change element type to <EditText> ?\n" +
- "edit_textview.xml:27: Warning: Attribute android:numeric should not be used with <TextView>: Change element type to <EditText> ?\n" +
- "edit_textview.xml:28: Warning: Attribute android:password should not be used with <TextView>: Change element type to <EditText> ?\n" +
- "edit_textview.xml:29: Warning: Attribute android:phoneNumber should not be used with <TextView>: Change element type to <EditText> ?\n" +
- "edit_textview.xml:30: Warning: Attribute android:privateImeOptions should not be used with <TextView>: Change element type to <EditText> ?\n" +
- "edit_textview.xml:38: Warning: Attribute android:cursorVisible should not be used with <Button>: intended for editable text widgets\n" +
- "edit_textview.xml:44: Warning: Attribute android:cursorVisible should not be used with <CheckedTextView>: intended for editable text widgets\n" +
- "edit_textview.xml:50: Warning: Attribute android:cursorVisible should not be used with <CheckBox>: intended for editable text widgets\n" +
- "edit_textview.xml:56: Warning: Attribute android:cursorVisible should not be used with <RadioButton>: intended for editable text widgets\n" +
- "edit_textview.xml:62: Warning: Attribute android:cursorVisible should not be used with <ToggleButton>: intended for editable text widgets",
+ "res/layout/edit_textview.xml:13: Warning: Attribute android:autoText should not be used with <TextView>: Change element type to <EditText> ? [TextViewEdits]\n" +
+ " android:autoText=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:14: Warning: Attribute android:bufferType should not be used with <TextView>: Change element type to <EditText> ? [TextViewEdits]\n" +
+ " android:bufferType=\"editable\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:15: Warning: Attribute android:capitalize should not be used with <TextView>: Change element type to <EditText> ? [TextViewEdits]\n" +
+ " android:capitalize=\"words\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:16: Warning: Attribute android:cursorVisible should not be used with <TextView>: Change element type to <EditText> ? [TextViewEdits]\n" +
+ " android:cursorVisible=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:17: Warning: Attribute android:digits should not be used with <TextView>: Change element type to <EditText> ? [TextViewEdits]\n" +
+ " android:digits=\"\"\n" +
+ " ~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:18: Warning: Attribute android:editable should not be used with <TextView>: Change element type to <EditText> ? [TextViewEdits]\n" +
+ " android:editable=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:19: Warning: Attribute android:editorExtras should not be used with <TextView>: Change element type to <EditText> ? [TextViewEdits]\n" +
+ " android:editorExtras=\"@+id/foobar\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:22: Warning: Attribute android:imeActionId should not be used with <TextView>: Change element type to <EditText> ? [TextViewEdits]\n" +
+ " android:imeActionId=\"@+id/foo\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:23: Warning: Attribute android:imeActionLabel should not be used with <TextView>: Change element type to <EditText> ? [TextViewEdits]\n" +
+ " android:imeActionLabel=\"\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:24: Warning: Attribute android:imeOptions should not be used with <TextView>: Change element type to <EditText> ? [TextViewEdits]\n" +
+ " android:imeOptions=\"\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:25: Warning: Attribute android:inputMethod should not be used with <TextView>: Change element type to <EditText> ? [TextViewEdits]\n" +
+ " android:inputMethod=\"\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:26: Warning: Attribute android:inputType should not be used with <TextView>: Change element type to <EditText> ? [TextViewEdits]\n" +
+ " android:inputType=\"text\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:27: Warning: Attribute android:numeric should not be used with <TextView>: Change element type to <EditText> ? [TextViewEdits]\n" +
+ " android:numeric=\"\"\n" +
+ " ~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:28: Warning: Attribute android:password should not be used with <TextView>: Change element type to <EditText> ? [TextViewEdits]\n" +
+ " android:password=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:29: Warning: Attribute android:phoneNumber should not be used with <TextView>: Change element type to <EditText> ? [TextViewEdits]\n" +
+ " android:phoneNumber=\"true\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:30: Warning: Attribute android:privateImeOptions should not be used with <TextView>: Change element type to <EditText> ? [TextViewEdits]\n" +
+ " android:privateImeOptions=\"\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:38: Warning: Attribute android:cursorVisible should not be used with <Button>: intended for editable text widgets [TextViewEdits]\n" +
+ " android:cursorVisible=\"true\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:44: Warning: Attribute android:cursorVisible should not be used with <CheckedTextView>: intended for editable text widgets [TextViewEdits]\n" +
+ " android:cursorVisible=\"true\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:50: Warning: Attribute android:cursorVisible should not be used with <CheckBox>: intended for editable text widgets [TextViewEdits]\n" +
+ " android:cursorVisible=\"true\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:56: Warning: Attribute android:cursorVisible should not be used with <RadioButton>: intended for editable text widgets [TextViewEdits]\n" +
+ " android:cursorVisible=\"true\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/edit_textview.xml:62: Warning: Attribute android:cursorVisible should not be used with <ToggleButton>: intended for editable text widgets [TextViewEdits]\n" +
+ " android:cursorVisible=\"true\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 21 warnings\n" +
+ "",
lintFiles("res/layout/edit_textview.xml"));
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ToastDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ToastDetectorTest.java
index 0b8c984..07941b7 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ToastDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ToastDetectorTest.java
@@ -27,10 +27,20 @@ public class ToastDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "ToastTest.java:31: Warning: Toast created but not shown: did you forget to call show() ?\n" +
- "ToastTest.java:32: Warning: Expected duration Toast.LENGTH_SHORT or Toast.LENGTH_LONG, a custom duration value is not supported\n" +
- "ToastTest.java:32: Warning: Toast created but not shown: did you forget to call show() ?\n" +
- "ToastTest.java:38: Warning: Toast created but not shown: did you forget to call show() ?",
+ "src/test/pkg/ToastTest.java:31: Warning: Toast created but not shown: did you forget to call show() ? [ShowToast]\n" +
+ " Toast.makeText(context, \"foo\", Toast.LENGTH_LONG);\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/ToastTest.java:32: Warning: Expected duration Toast.LENGTH_SHORT or Toast.LENGTH_LONG, a custom duration value is not supported [ShowToast]\n" +
+ " Toast toast = Toast.makeText(context, R.string.app_name, 5000);\n" +
+ " ~~~~\n" +
+ "src/test/pkg/ToastTest.java:32: Warning: Toast created but not shown: did you forget to call show() ? [ShowToast]\n" +
+ " Toast toast = Toast.makeText(context, R.string.app_name, 5000);\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "src/test/pkg/ToastTest.java:38: Warning: Toast created but not shown: did you forget to call show() ? [ShowToast]\n" +
+ " Toast.makeText(context, \"foo\", Toast.LENGTH_LONG);\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 4 warnings\n" +
+ "",
lintProject("src/test/pkg/ToastTest.java.txt=>src/test/pkg/ToastTest.java"));
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TooManyViewsDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TooManyViewsDetectorTest.java
index a184b7e..51b977d 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TooManyViewsDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TooManyViewsDetectorTest.java
@@ -27,15 +27,21 @@ public class TooManyViewsDetectorTest extends AbstractCheckTest {
public void testTooMany() throws Exception {
assertEquals(
- "too_many.xml:399: Warning: too_many.xml has more than 80 views, bad for " +
- "performance",
- lintFiles("res/layout/too_many.xml"));
+ "res/layout/too_many.xml:399: Warning: too_many.xml has more than 80 views, bad for performance [TooManyViews]\n" +
+ " <Button\n" +
+ " ^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
+ lintFiles("res/layout/too_many.xml"));
}
public void testTooDeep() throws Exception {
assertEquals(
- "too_deep.xml:46: Warning: too_deep.xml has more than 10 levels, bad for " +
- "performance",
- lintFiles("res/layout/too_deep.xml"));
+ "res/layout/too_deep.xml:46: Warning: too_deep.xml has more than 10 levels, bad for performance [TooDeepLayout]\n" +
+ " <LinearLayout\n" +
+ " ^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
+ lintFiles("res/layout/too_deep.xml"));
}
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TranslationDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TranslationDetectorTest.java
index 39231dd..f0284fd 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TranslationDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TranslationDetectorTest.java
@@ -34,12 +34,24 @@ public class TranslationDetectorTest extends AbstractCheckTest {
TranslationDetector.COMPLETE_REGIONS = false;
assertEquals(
// Sample files from the Home app
- "values-cs/arrays.xml:3: Error: \"security_questions\" is translated here but not found in default locale\n" +
- "=> values-es/strings.xml:12: Also translated here\n" +
- "values-de-rDE/strings.xml:11: Error: \"continue_skip_label\" is translated here but not found in default locale\n" +
- "values/strings.xml:20: Error: \"show_all_apps\" is not translated in nl-rNL\n" +
- "values/strings.xml:23: Error: \"menu_wallpaper\" is not translated in nl-rNL\n" +
- "values/strings.xml:25: Error: \"menu_settings\" is not translated in cs, de-rDE, es, es-rUS, nl-rNL",
+ "res/values/strings.xml:20: Error: \"show_all_apps\" is not translated in nl-rNL [MissingTranslation]\n" +
+ " <string name=\"show_all_apps\">All</string>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/values/strings.xml:23: Error: \"menu_wallpaper\" is not translated in nl-rNL [MissingTranslation]\n" +
+ " <string name=\"menu_wallpaper\">Wallpaper</string>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/values/strings.xml:25: Error: \"menu_settings\" is not translated in cs, de-rDE, es, es-rUS, nl-rNL [MissingTranslation]\n" +
+ " <string name=\"menu_settings\">Settings</string>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/values-cs/arrays.xml:3: Error: \"security_questions\" is translated here but not found in default locale [ExtraTranslation]\n" +
+ " <string-array name=\"security_questions\">\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ " res/values-es/strings.xml:12: Also translated here\n" +
+ "res/values-de-rDE/strings.xml:11: Error: \"continue_skip_label\" is translated here but not found in default locale [ExtraTranslation]\n" +
+ " <string name=\"continue_skip_label\">\"Weiter\"</string>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "5 errors, 0 warnings\n" +
+ "",
lintProject(
"res/values/strings.xml",
@@ -57,12 +69,27 @@ public class TranslationDetectorTest extends AbstractCheckTest {
TranslationDetector.COMPLETE_REGIONS = true;
assertEquals(
// Sample files from the Home app
- "values-de-rDE/strings.xml:11: Error: \"continue_skip_label\" is translated here but not found in default locale\n" +
- "values/strings.xml:19: Error: \"home_title\" is not translated in es-rUS\n" +
- "values/strings.xml:20: Error: \"show_all_apps\" is not translated in es-rUS, nl-rNL\n" +
- "values/strings.xml:23: Error: \"menu_wallpaper\" is not translated in es-rUS, nl-rNL\n" +
- "values/strings.xml:25: Error: \"menu_settings\" is not translated in cs, de-rDE, es-rUS, nl-rNL\n" +
- "values/strings.xml:29: Error: \"wallpaper_instructions\" is not translated in es-rUS",
+ "res/values/strings.xml:19: Error: \"home_title\" is not translated in es-rUS [MissingTranslation]\n" +
+ " <string name=\"home_title\">Home Sample</string>\n" +
+ " ~~~~~~~~~~~~~~~~~\n" +
+ "res/values/strings.xml:20: Error: \"show_all_apps\" is not translated in es-rUS, nl-rNL [MissingTranslation]\n" +
+ " <string name=\"show_all_apps\">All</string>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/values/strings.xml:23: Error: \"menu_wallpaper\" is not translated in es-rUS, nl-rNL [MissingTranslation]\n" +
+ " <string name=\"menu_wallpaper\">Wallpaper</string>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/values/strings.xml:25: Error: \"menu_settings\" is not translated in cs, de-rDE, es-rUS, nl-rNL [MissingTranslation]\n" +
+ " <string name=\"menu_settings\">Settings</string>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/values/strings.xml:29: Error: \"wallpaper_instructions\" is not translated in es-rUS [MissingTranslation]\n" +
+ " <string name=\"wallpaper_instructions\">Tap picture to set portrait wallpaper</string>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ " res/values-land/strings.xml:19: <No location-specific message\n" +
+ "res/values-de-rDE/strings.xml:11: Error: \"continue_skip_label\" is translated here but not found in default locale [ExtraTranslation]\n" +
+ " <string name=\"continue_skip_label\">\"Weiter\"</string>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "6 errors, 0 warnings\n" +
+ "",
lintProject(
"res/values/strings.xml",
@@ -141,9 +168,11 @@ public class TranslationDetectorTest extends AbstractCheckTest {
public void testNonTranslatable1() throws Exception {
TranslationDetector.COMPLETE_REGIONS = true;
assertEquals(
- // Sample files from the Home app
- "values-nb/nontranslatable.xml:3: Error: The resource string \"dummy\" has been " +
- "marked as translatable=\"false\"",
+ "res/values-nb/nontranslatable.xml:3: Error: The resource string \"dummy\" has been marked as translatable=\"false\" [ExtraTranslation]\n" +
+ " <string name=\"dummy\">Ignore Me</string>\n" +
+ " ~~~~~~~~~~~~\n" +
+ "1 errors, 0 warnings\n" +
+ "",
lintProject("res/values/nontranslatable.xml",
"res/values/nontranslatable2.xml=>res/values-nb/nontranslatable.xml"));
@@ -152,9 +181,11 @@ public class TranslationDetectorTest extends AbstractCheckTest {
public void testNonTranslatable2() throws Exception {
TranslationDetector.COMPLETE_REGIONS = true;
assertEquals(
- // Sample files from the Home app
- "values-nb/nontranslatable.xml:3: Error: Non-translatable resources should only " +
- "be defined in the base values/ folder",
+ "res/values-nb/nontranslatable.xml:3: Error: Non-translatable resources should only be defined in the base values/ folder [ExtraTranslation]\n" +
+ " <string name=\"dummy\" translatable=\"false\">Ignore Me</string>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~\n" +
+ "1 errors, 0 warnings\n" +
+ "",
lintProject("res/values/nontranslatable.xml=>res/values-nb/nontranslatable.xml"));
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TypoDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TypoDetectorTest.java
index 864c065..51d8a75 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TypoDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TypoDetectorTest.java
@@ -29,46 +29,100 @@ public class TypoDetectorTest extends AbstractCheckTest {
public void testPlainValues() throws Exception {
assertEquals(
- "strings.xml:10: Warning: \"throught\" is a common misspelling; did you mean \"thought\" or \"through\" or \"throughout\" ?\n" +
- "strings.xml:12: Warning: \"Seach\" is a common misspelling; did you mean \"Search\" ?\n" +
- "strings.xml:16: Warning: \"Tuscon\" is a common misspelling; did you mean \"Tucson\" ?\n" +
- "strings.xml:20: Warning: \"Ok\" is usually capitalized as \"OK\"\n" +
- "strings.xml:6: Warning: \"Andriod\" is a common misspelling; did you mean \"Android\" ?\n" +
- "strings.xml:6: Warning: \"activites\" is a common misspelling; did you mean \"activities\" ?\n" +
- "strings.xml:8: Warning: \"Cmoputer\" is a common misspelling; did you mean \"Computer\" ?",
+ "res/values/strings.xml:6: Warning: \"Andriod\" is a common misspelling; did you mean \"Android\" ? [Typos]\n" +
+ " <string name=\"s2\">Andriod activites!</string>\n" +
+ " ^\n" +
+ "res/values/strings.xml:6: Warning: \"activites\" is a common misspelling; did you mean \"activities\" ? [Typos]\n" +
+ " <string name=\"s2\">Andriod activites!</string>\n" +
+ " ^\n" +
+ "res/values/strings.xml:8: Warning: \"Cmoputer\" is a common misspelling; did you mean \"Computer\" ? [Typos]\n" +
+ " <string name=\"s3\"> (Cmoputer </string>\n" +
+ " ^\n" +
+ "res/values/strings.xml:10: Warning: \"throught\" is a common misspelling; did you mean \"thought\" or \"through\" or \"throughout\" ? [Typos]\n" +
+ " <string name=\"s4\"><b>throught</b></string>\n" +
+ " ^\n" +
+ "res/values/strings.xml:12: Warning: \"Seach\" is a common misspelling; did you mean \"Search\" ? [Typos]\n" +
+ " <string name=\"s5\">Seach</string>\n" +
+ " ^\n" +
+ "res/values/strings.xml:16: Warning: \"Tuscon\" is a common misspelling; did you mean \"Tucson\" ? [Typos]\n" +
+ " <string name=\"s7\">Tuscon tuscon</string>\n" +
+ " ^\n" +
+ "res/values/strings.xml:20: Warning: \"Ok\" is usually capitalized as \"OK\" [Typos]\n" +
+ " <string name=\"dlg_button_ok\">Ok</string>\n" +
+ " ^\n" +
+ "0 errors, 7 warnings\n" +
+ "",
lintProject("res/values/typos.xml=>res/values/strings.xml"));
}
public void testEnLanguage() throws Exception {
assertEquals(
- "strings-en.xml:10: Warning: \"throught\" is a common misspelling; did you mean \"thought\" or \"through\" or \"throughout\" ?\n" +
- "strings-en.xml:12: Warning: \"Seach\" is a common misspelling; did you mean \"Search\" ?\n" +
- "strings-en.xml:16: Warning: \"Tuscon\" is a common misspelling; did you mean \"Tucson\" ?\n" +
- "strings-en.xml:20: Warning: \"Ok\" is usually capitalized as \"OK\"\n" +
- "strings-en.xml:6: Warning: \"Andriod\" is a common misspelling; did you mean \"Android\" ?\n" +
- "strings-en.xml:6: Warning: \"activites\" is a common misspelling; did you mean \"activities\" ?\n" +
- "strings-en.xml:8: Warning: \"Cmoputer\" is a common misspelling; did you mean \"Computer\" ?",
+ "res/values-en-rUS/strings-en.xml:6: Warning: \"Andriod\" is a common misspelling; did you mean \"Android\" ? [Typos]\n" +
+ " <string name=\"s2\">Andriod activites!</string>\n" +
+ " ^\n" +
+ "res/values-en-rUS/strings-en.xml:6: Warning: \"activites\" is a common misspelling; did you mean \"activities\" ? [Typos]\n" +
+ " <string name=\"s2\">Andriod activites!</string>\n" +
+ " ^\n" +
+ "res/values-en-rUS/strings-en.xml:8: Warning: \"Cmoputer\" is a common misspelling; did you mean \"Computer\" ? [Typos]\n" +
+ " <string name=\"s3\"> (Cmoputer </string>\n" +
+ " ^\n" +
+ "res/values-en-rUS/strings-en.xml:10: Warning: \"throught\" is a common misspelling; did you mean \"thought\" or \"through\" or \"throughout\" ? [Typos]\n" +
+ " <string name=\"s4\"><b>throught</b></string>\n" +
+ " ^\n" +
+ "res/values-en-rUS/strings-en.xml:12: Warning: \"Seach\" is a common misspelling; did you mean \"Search\" ? [Typos]\n" +
+ " <string name=\"s5\">Seach</string>\n" +
+ " ^\n" +
+ "res/values-en-rUS/strings-en.xml:16: Warning: \"Tuscon\" is a common misspelling; did you mean \"Tucson\" ? [Typos]\n" +
+ " <string name=\"s7\">Tuscon tuscon</string>\n" +
+ " ^\n" +
+ "res/values-en-rUS/strings-en.xml:20: Warning: \"Ok\" is usually capitalized as \"OK\" [Typos]\n" +
+ " <string name=\"dlg_button_ok\">Ok</string>\n" +
+ " ^\n" +
+ "0 errors, 7 warnings\n" +
+ "",
lintProject("res/values/typos.xml=>res/values-en-rUS/strings-en.xml"));
}
public void testNorwegian() throws Exception {
// UTF-8 handling
assertEquals(
- "typos.xml:10: Warning: \"altid\" is a common misspelling; did you mean \"alltid\" ?\n" +
- "typos.xml:12: Warning: \"Altid\" is a common misspelling; did you mean \"Alltid\" ?\n" +
- "typos.xml:18: Warning: \"karri¾re\" is a common misspelling; did you mean \"karrire\" ?\n" +
- "typos.xml:6: Warning: \"Andriod\" is a common misspelling; did you mean \"Android\" ?\n" +
- "typos.xml:6: Warning: \"morro\" is a common misspelling; did you mean \"moro\" ?\n" +
- "typos.xml:8: Warning: \"Parallel\" is a common misspelling; did you mean \"Parallell\" ?",
+ "res/values-nb/typos.xml:6: Warning: \"Andriod\" is a common misspelling; did you mean \"Android\" ? [Typos]\n" +
+ " <string name=\"s2\">Mer morro med Andriod</string>\n" +
+ " ^\n" +
+ "res/values-nb/typos.xml:6: Warning: \"morro\" is a common misspelling; did you mean \"moro\" ? [Typos]\n" +
+ " <string name=\"s2\">Mer morro med Andriod</string>\n" +
+ " ^\n" +
+ "res/values-nb/typos.xml:8: Warning: \"Parallel\" is a common misspelling; did you mean \"Parallell\" ? [Typos]\n" +
+ " <string name=\"s3\"> Parallel </string>\n" +
+ " ^\n" +
+ "res/values-nb/typos.xml:10: Warning: \"altid\" is a common misspelling; did you mean \"alltid\" ? [Typos]\n" +
+ " <string name=\"s4\"><b>altid</b></string>\n" +
+ " ^\n" +
+ "res/values-nb/typos.xml:12: Warning: \"Altid\" is a common misspelling; did you mean \"Alltid\" ? [Typos]\n" +
+ " <string name=\"s5\">Altid</string>\n" +
+ " ^\n" +
+ "res/values-nb/typos.xml:18: Warning: \"karri¾re\" is a common misspelling; did you mean \"karrire\" ? [Typos]\n" +
+ " <string name=\"s7\">Koding er en spennende karri¾re</string>\n" +
+ " ^\n" +
+ "0 errors, 6 warnings\n" +
+ "",
lintProject("res/values-nb/typos.xml"));
}
public void testGerman() throws Exception {
// Test globbing and multiple word matching
assertEquals(
- "typos.xml:10: Warning: \"zurŸck gefoobaren\" is a common misspelling; did you mean \"zurŸckgefoobaren\" ?\n" +
- "typos.xml:6: Warning: \"befindet eine\" is a common misspelling; did you mean \"befindet sich eine\" ?\n" +
- "typos.xml:9: Warning: \"Authorisierungscode\" is a common misspelling; did you mean \"Autorisierungscode\" ?",
+ "res/values-de/typos.xml:6: Warning: \"befindet eine\" is a common misspelling; did you mean \"befindet sich eine\" ? [Typos]\n" +
+ " wo befindet eine ip\n" +
+ " ^\n" +
+ "res/values-de/typos.xml:9: Warning: \"Authorisierungscode\" is a common misspelling; did you mean \"Autorisierungscode\" ? [Typos]\n" +
+ " <string name=\"s2\">(Authorisierungscode!)</string>\n" +
+ " ^\n" +
+ "res/values-de/typos.xml:10: Warning: \"zurŸck gefoobaren\" is a common misspelling; did you mean \"zurŸckgefoobaren\" ? [Typos]\n" +
+ " <string name=\"s3\"> zurŸck gefoobaren!</string>\n" +
+ " ^\n" +
+ "0 errors, 3 warnings\n" +
+ "",
lintProject("res/values-de/typos.xml"));
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TypographyDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TypographyDetectorTest.java
index 7ea2eb8..16d0107 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TypographyDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/TypographyDetectorTest.java
@@ -32,22 +32,56 @@ public class TypographyDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "typography.xml:10: Warning: Avoid quoting with grave accents; use apostrophes or better yet directional quotes instead\n" +
- "typography.xml:11: Warning: Replace straight quotes ('') with directional quotes (‘’, &#8216; and &#8217;) ?\n" +
- "typography.xml:12: Warning: Use fraction character ½ (&#189;) instead of 1/2 ?\n" +
- "typography.xml:13: Warning: Use fraction character ¼ (&#188;) instead of 1/4 ?\n" +
- "typography.xml:15: Warning: Replace \"...\" with ellipsis character (…, &#8230;) ?\n" +
- "typography.xml:17: Warning: Replace \"-\" with an \"en dash\" character (–, &#8211;) ?\n" +
- "typography.xml:18: Warning: Replace \"-\" with an \"en dash\" character (–, &#8211;) ?\n" +
- "typography.xml:20: Warning: Replace \"--\" with an \"em dash\" character (—, &#8212;) ?\n" +
- "typography.xml:24: Warning: Replace \"-\" with an \"en dash\" character (–, &#8211;) ?\n" +
- "typography.xml:25: Warning: Use fraction character ½ (&#189;) instead of 1/2 ?\n" +
- "typography.xml:3: Warning: Replace straight quotes ('') with directional quotes (‘’, &#8216; and &#8217;) ?\n" +
- "typography.xml:5: Warning: Replace straight quotes (\") with directional quotes (“â€, &#8220; and &#8221;) ?\n" +
- "typography.xml:6: Warning: Replace straight quotes (\") with directional quotes (“â€, &#8220; and &#8221;) ?\n" +
- "typography.xml:7: Warning: Replace apostrophe (') with typographic apostrophe (’, &#8217;) ?\n" +
- "typography.xml:8: Warning: Replace (c) with copyright symbol © (&#169;) ?\n" +
- "typography.xml:9: Warning: Replace apostrophe (') with typographic apostrophe (’, &#8217;) ?",
+ "res/values/typography.xml:17: Warning: Replace \"-\" with an \"en dash\" character (–, &#8211;) ? [TypographyDashes]\n" +
+ " <string name=\"ndash\">For ages 3-5</string>\n" +
+ " ^\n" +
+ "res/values/typography.xml:18: Warning: Replace \"-\" with an \"en dash\" character (–, &#8211;) ? [TypographyDashes]\n" +
+ " <string name=\"ndash2\">Copyright 2007 - 2011</string>\n" +
+ " ^\n" +
+ "res/values/typography.xml:20: Warning: Replace \"--\" with an \"em dash\" character (—, &#8212;) ? [TypographyDashes]\n" +
+ " <string name=\"mdash\">Not found -- please try again</string>\n" +
+ " ^\n" +
+ "res/values/typography.xml:24: Warning: Replace \"-\" with an \"en dash\" character (–, &#8211;) ? [TypographyDashes]\n" +
+ " <item>Ages 3-5</item>\n" +
+ " ^\n" +
+ "res/values/typography.xml:15: Warning: Replace \"...\" with ellipsis character (…, &#8230;) ? [TypographyEllipsis]\n" +
+ " <string name=\"ellipsis\">40 times...</string>\n" +
+ " ^\n" +
+ "res/values/typography.xml:12: Warning: Use fraction character ½ (&#189;) instead of 1/2 ? [TypographyFractions]\n" +
+ " <string name=\"fraction1\">5 1/2 times</string>\n" +
+ " ^\n" +
+ "res/values/typography.xml:13: Warning: Use fraction character ¼ (&#188;) instead of 1/4 ? [TypographyFractions]\n" +
+ " <string name=\"fraction4\">1/4 times</string>\n" +
+ " ^\n" +
+ "res/values/typography.xml:25: Warning: Use fraction character ½ (&#189;) instead of 1/2 ? [TypographyFractions]\n" +
+ " <item>Age 5 1/2</item>\n" +
+ " ^\n" +
+ "res/values/typography.xml:3: Warning: Replace straight quotes ('') with directional quotes (‘’, &#8216; and &#8217;) ? [TypographyQuotes]\n" +
+ " <string name=\"home_title\">Home 'Sample'</string>\n" +
+ " ^\n" +
+ "res/values/typography.xml:5: Warning: Replace straight quotes (\") with directional quotes (“â€, &#8220; and &#8221;) ? [TypographyQuotes]\n" +
+ " <string name=\"show_all_apps2\">Show \"All\"</string>\n" +
+ " ^\n" +
+ "res/values/typography.xml:6: Warning: Replace straight quotes (\") with directional quotes (“â€, &#8220; and &#8221;) ? [TypographyQuotes]\n" +
+ " <string name=\"escaped\">Skip \\\"All\\\"</string>\n" +
+ " ^\n" +
+ "res/values/typography.xml:7: Warning: Replace apostrophe (') with typographic apostrophe (’, &#8217;) ? [TypographyQuotes]\n" +
+ " <string name=\"single\">Android's</string>\n" +
+ " ^\n" +
+ "res/values/typography.xml:9: Warning: Replace apostrophe (') with typographic apostrophe (’, &#8217;) ? [TypographyQuotes]\n" +
+ " <string name=\"badquotes1\">`First'</string>\n" +
+ " ^\n" +
+ "res/values/typography.xml:10: Warning: Avoid quoting with grave accents; use apostrophes or better yet directional quotes instead [TypographyQuotes]\n" +
+ " <string name=\"badquotes2\">``second''</string>\n" +
+ " ^\n" +
+ "res/values/typography.xml:11: Warning: Replace straight quotes ('') with directional quotes (‘’, &#8216; and &#8217;) ? [TypographyQuotes]\n" +
+ " <string name=\"notbadquotes\">Type Option-` then 'Escape'</string>\n" +
+ " ^\n" +
+ "res/values/typography.xml:8: Warning: Replace (c) with copyright symbol © (&#169;) ? [TypographyOther]\n" +
+ " <string name=\"copyright\">(c) 2011</string>\n" +
+ " ^\n" +
+ "0 errors, 16 warnings\n" +
+ "",
lintProject("res/values/typography.xml"));
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/UnusedResourceDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/UnusedResourceDetectorTest.java
index bf32e2b..f57cf00 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/UnusedResourceDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/UnusedResourceDetectorTest.java
@@ -43,10 +43,14 @@ public class UnusedResourceDetectorTest extends AbstractCheckTest {
public void testUnused() throws Exception {
mEnableIds = false;
assertEquals(
- "accessibility.xml: Warning: The resource R.layout.accessibility appears to be unused\n" +
- "main.xml: Warning: The resource R.layout.main appears to be unused\n" +
- "other.xml: Warning: The resource R.layout.other appears to be unused\n" +
- "strings2.xml:3: Warning: The resource R.string.hello appears to be unused",
+ "res/layout/accessibility.xml: Warning: The resource R.layout.accessibility appears to be unused [UnusedResources]\n" +
+ "res/layout/main.xml: Warning: The resource R.layout.main appears to be unused [UnusedResources]\n" +
+ "res/layout/other.xml: Warning: The resource R.layout.other appears to be unused [UnusedResources]\n" +
+ "res/values/strings2.xml:3: Warning: The resource R.string.hello appears to be unused [UnusedResources]\n" +
+ " <string name=\"hello\">Hello</string>\n" +
+ " ~~~~~~~~~~~~\n" +
+ "0 errors, 4 warnings\n" +
+ "",
lintProject(
"res/values/strings2.xml",
@@ -64,17 +68,27 @@ public class UnusedResourceDetectorTest extends AbstractCheckTest {
mEnableIds = true;
assertEquals(
- "Warning: The resource R.id.imageView1 appears to be unused\n" +
- "Warning: The resource R.id.include1 appears to be unused\n" +
- "Warning: The resource R.id.linearLayout2 appears to be unused\n" +
- "Warning: The resource R.layout.main appears to be unused\n" +
- "Warning: The resource R.layout.other appears to be unused\n" +
- "Warning: The resource R.string.hello appears to be unused\n" +
- "accessibility.xml: Warning: The resource R.layout.accessibility appears to be unused\n" +
- "accessibility.xml:2: Warning: The resource R.id.newlinear appears to be unused\n" +
- "accessibility.xml:3: Warning: The resource R.id.button1 appears to be unused\n" +
- "accessibility.xml:4: Warning: The resource R.id.android_logo appears to be unused\n" +
- "accessibility.xml:5: Warning: The resource R.id.android_logo2 appears to be unused",
+ "res/layout/accessibility.xml: Warning: The resource R.layout.accessibility appears to be unused [UnusedResources]\n" +
+ "Warning: The resource R.layout.main appears to be unused [UnusedResources]\n" +
+ "Warning: The resource R.layout.other appears to be unused [UnusedResources]\n" +
+ "Warning: The resource R.string.hello appears to be unused [UnusedResources]\n" +
+ "Warning: The resource R.id.imageView1 appears to be unused [UnusedIds]\n" +
+ "Warning: The resource R.id.include1 appears to be unused [UnusedIds]\n" +
+ "Warning: The resource R.id.linearLayout2 appears to be unused [UnusedIds]\n" +
+ "res/layout/accessibility.xml:2: Warning: The resource R.id.newlinear appears to be unused [UnusedIds]\n" +
+ "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:id=\"@+id/newlinear\" android:orientation=\"vertical\" android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/accessibility.xml:3: Warning: The resource R.id.button1 appears to be unused [UnusedIds]\n" +
+ " <Button android:text=\"Button\" android:id=\"@+id/button1\" android:layout_width=\"wrap_content\" android:layout_height=\"wrap_content\"></Button>\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/accessibility.xml:4: Warning: The resource R.id.android_logo appears to be unused [UnusedIds]\n" +
+ " <ImageView android:id=\"@+id/android_logo\" android:layout_width=\"wrap_content\" android:layout_height=\"wrap_content\" android:src=\"@drawable/android_button\" android:focusable=\"false\" android:clickable=\"false\" android:layout_weight=\"1.0\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/accessibility.xml:5: Warning: The resource R.id.android_logo2 appears to be unused [UnusedIds]\n" +
+ " <ImageButton android:importantForAccessibility=\"yes\" android:id=\"@+id/android_logo2\" android:layout_width=\"wrap_content\" android:layout_height=\"wrap_content\" android:src=\"@drawable/android_button\" android:focusable=\"false\" android:clickable=\"false\" android:layout_weight=\"1.0\" />\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 11 warnings\n" +
+ "",
lintProject(
// Rename .txt files to .java
@@ -86,7 +100,11 @@ public class UnusedResourceDetectorTest extends AbstractCheckTest {
public void testArrayReference() throws Exception {
assertEquals(
- "arrayusage.xml:3: Warning: The resource R.array.my_array appears to be unused",
+ "res/values/arrayusage.xml:3: Warning: The resource R.array.my_array appears to be unused [UnusedResources]\n" +
+ "<string-array name=\"my_array\">\n" +
+ " ~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"AndroidManifest.xml",
@@ -95,7 +113,9 @@ public class UnusedResourceDetectorTest extends AbstractCheckTest {
public void testAttrs() throws Exception {
assertEquals(
- "customattrlayout.xml: Warning: The resource R.layout.customattrlayout appears to be unused",
+ "res/layout/customattrlayout.xml: Warning: The resource R.layout.customattrlayout appears to be unused [UnusedResources]\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"res/values/customattr.xml",
@@ -140,7 +160,11 @@ public class UnusedResourceDetectorTest extends AbstractCheckTest {
// string1 is defined and used in the library project
// string2 is defined in the library project and used in the master project
// string3 is defined in the library project and not used anywhere
- "strings.xml:7: Warning: The resource R.string.string3 appears to be unused",
+ "/TESTROOT/UnusedResourceDetectorTest_testMultiProject/LibraryProject/res/values/strings.xml:7: Warning: The resource R.string.string3 appears to be unused [UnusedResources]\n" +
+ " <string name=\"string3\">String 3</string>\n" +
+ " ~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
checkLint(Arrays.asList(master, library)));
}
@@ -167,7 +191,11 @@ public class UnusedResourceDetectorTest extends AbstractCheckTest {
public void testPlurals() throws Exception {
assertEquals(
- "plurals.xml:3: Warning: The resource R.plurals.my_plural appears to be unused",
+ "res/values/plurals.xml:3: Warning: The resource R.plurals.my_plural appears to be unused [UnusedResources]\n" +
+ " <plurals name=\"my_plural\">\n" +
+ " ~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"res/values/strings4.xml",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/UseCompoundDrawableDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/UseCompoundDrawableDetectorTest.java
index 6b29043..146ff6f 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/UseCompoundDrawableDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/UseCompoundDrawableDetectorTest.java
@@ -27,9 +27,12 @@ public class UseCompoundDrawableDetectorTest extends AbstractCheckTest {
public void testCompound() throws Exception {
assertEquals(
- "compound.xml:3: Warning: This tag and its children can be replaced by one " +
- "<TextView/> and a compound drawable",
- lintFiles("res/layout/compound.xml"));
+ "res/layout/compound.xml:3: Warning: This tag and its children can be replaced by one <TextView/> and a compound drawable [UseCompoundDrawables]\n" +
+ "<LinearLayout\n" +
+ "^\n" +
+ "0 errors, 1 warnings\n" +
+ "",
+ lintFiles("res/layout/compound.xml"));
}
public void testCompound2() throws Exception {
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/UselessViewDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/UselessViewDetectorTest.java
index 735b1c2..c34b987 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/UselessViewDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/UselessViewDetectorTest.java
@@ -27,14 +27,20 @@ public class UselessViewDetectorTest extends AbstractCheckTest {
public void testUseless() throws Exception {
assertEquals(
- "useless.xml:13: Warning: This LinearLayout layout or its FrameLayout parent " +
- "is useless\n" +
- "useless.xml:47: Warning: This LinearLayout layout or its FrameLayout parent " +
- "is useless; transfer the background attribute to the other view\n" +
- "useless.xml:65: Warning: This LinearLayout layout or its FrameLayout parent " +
- "is useless; transfer the background attribute to the other view\n" +
- "useless.xml:85: Warning: This FrameLayout view is useless (no children, " +
- "no background, no id, no style)",
+ "res/layout/useless.xml:85: Warning: This FrameLayout view is useless (no children, no background, no id, no style) [UselessLeaf]\n" +
+ " <FrameLayout\n" +
+ " ^\n" +
+ "res/layout/useless.xml:13: Warning: This LinearLayout layout or its FrameLayout parent is useless [UselessParent]\n" +
+ " <LinearLayout\n" +
+ " ^\n" +
+ "res/layout/useless.xml:47: Warning: This LinearLayout layout or its FrameLayout parent is useless; transfer the background attribute to the other view [UselessParent]\n" +
+ " <LinearLayout\n" +
+ " ^\n" +
+ "res/layout/useless.xml:65: Warning: This LinearLayout layout or its FrameLayout parent is useless; transfer the background attribute to the other view [UselessParent]\n" +
+ " <LinearLayout\n" +
+ " ^\n" +
+ "0 errors, 4 warnings\n" +
+ "",
lintFiles("res/layout/useless.xml"));
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/Utf8DetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/Utf8DetectorTest.java
index e21ffe4..d1a118d 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/Utf8DetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/Utf8DetectorTest.java
@@ -27,15 +27,21 @@ public class Utf8DetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "encoding.xml:1: Warning: iso-latin-1: Not using UTF-8 as the file encoding. " +
- "This can lead to subtle bugs with non-ascii characters",
+ "res/layout/encoding.xml:1: Warning: iso-latin-1: Not using UTF-8 as the file encoding. This can lead to subtle bugs with non-ascii characters [EnforceUTF8]\n" +
+ "<?xml version=\"1.0\" encoding=\"iso-latin-1\"?>\n" +
+ " ~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject("res/layout/encoding.xml"));
}
public void testWithR() throws Exception {
assertEquals(
- "encoding2.xml:1: Warning: iso-latin-1: Not using UTF-8 as the file encoding. " +
- "This can lead to subtle bugs with non-ascii characters",
+ "res/layout/encoding2.xml:1: Warning: iso-latin-1: Not using UTF-8 as the file encoding. This can lead to subtle bugs with non-ascii characters [EnforceUTF8]\n" +
+ "<?xml version=\"1.0\" encoding=\"iso-latin-1\"?>\n" +
+ " ~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
// encoding2.xml = encoding.xml but with \n => \r
lintProject("res/layout/encoding2.xml"));
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ViewConstructorDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ViewConstructorDetectorTest.java
index dccb667..5517646 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ViewConstructorDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ViewConstructorDetectorTest.java
@@ -27,13 +27,10 @@ public class ViewConstructorDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "CustomView1.java: Warning: Custom view test/pkg/CustomView1 is missing" +
- " constructor used by tools: (Context) or (Context,AttributeSet) or " +
- "(Context,AttributeSet,int)\n" +
-
- "CustomView2.java: Warning: Custom view test/pkg/CustomView2 is missing " +
- "constructor used by tools: (Context) or (Context,AttributeSet) or " +
- "(Context,AttributeSet,int)",
+ "src/test/bytecode/CustomView1.java: Warning: Custom view test/pkg/CustomView1 is missing constructor used by tools: (Context) or (Context,AttributeSet) or (Context,AttributeSet,int) [ViewConstructor]\n" +
+ "src/test/bytecode/CustomView2.java: Warning: Custom view test/pkg/CustomView2 is missing constructor used by tools: (Context) or (Context,AttributeSet) or (Context,AttributeSet,int) [ViewConstructor]\n" +
+ "0 errors, 2 warnings\n" +
+ "",
lintProject(
"bytecode/.classpath=>.classpath",
@@ -49,9 +46,9 @@ public class ViewConstructorDetectorTest extends AbstractCheckTest {
public void testInheritLocal() throws Exception {
assertEquals(
- "CustomViewTest.java: Warning: Custom view test/pkg/CustomViewTest is missing " +
- "constructor used by tools: (Context) or (Context,AttributeSet) or " +
- "(Context,AttributeSet,int)",
+ "src/test/pkg/CustomViewTest.java: Warning: Custom view test/pkg/CustomViewTest is missing constructor used by tools: (Context) or (Context,AttributeSet) or (Context,AttributeSet,int) [ViewConstructor]\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"bytecode/.classpath=>.classpath",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ViewTypeDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ViewTypeDetectorTest.java
index 2ea876f..a200de0 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ViewTypeDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ViewTypeDetectorTest.java
@@ -27,7 +27,11 @@ public class ViewTypeDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "WrongCastActivity.java:13: Error: Unexpected cast to ToggleButton: layout tag was Button",
+ "src/test/pkg/WrongCastActivity.java:13: Error: Unexpected cast to ToggleButton: layout tag was Button [WrongViewCast]\n" +
+ " ToggleButton toggleButton = (ToggleButton) findViewById(R.id.button);\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "1 errors, 0 warnings\n" +
+ "",
lintProject(
"res/layout/casts.xml",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WakelockDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WakelockDetectorTest.java
index 0b39eb6..e2830e0 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WakelockDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WakelockDetectorTest.java
@@ -27,7 +27,11 @@ public class WakelockDetectorTest extends AbstractCheckTest {
public void test1() throws Exception {
assertEquals(
- "WakelockActivity1.java:15: Warning: Found a wakelock acquire() but no release() calls anywhere",
+ "src/test/pkg/WakelockActivity1.java:15: Warning: Found a wakelock acquire() but no release() calls anywhere [Wakelock]\n" +
+ " mWakeLock.acquire(); // Never released\n" +
+ " ~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"bytecode/.classpath=>.classpath",
@@ -40,7 +44,11 @@ public class WakelockDetectorTest extends AbstractCheckTest {
public void test2() throws Exception {
assertEquals(
- "WakelockActivity2.java:13: Warning: Wakelocks should be released in onPause, not onDestroy",
+ "src/test/pkg/WakelockActivity2.java:13: Warning: Wakelocks should be released in onPause, not onDestroy [Wakelock]\n" +
+ " mWakeLock.release(); // Should be done in onPause instead\n" +
+ " ~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"bytecode/.classpath=>.classpath",
@@ -53,7 +61,11 @@ public class WakelockDetectorTest extends AbstractCheckTest {
public void test3() throws Exception {
assertEquals(
- "WakelockActivity3.java:13: Warning: The release() call is not always reached",
+ "src/test/pkg/WakelockActivity3.java:13: Warning: The release() call is not always reached [Wakelock]\n" +
+ " lock.release(); // Should be in finally block\n" +
+ " ~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"bytecode/.classpath=>.classpath",
@@ -66,7 +78,11 @@ public class WakelockDetectorTest extends AbstractCheckTest {
public void test4() throws Exception {
assertEquals(
- "WakelockActivity4.java:10: Warning: The release() call is not always reached",
+ "src/test/pkg/WakelockActivity4.java:10: Warning: The release() call is not always reached [Wakelock]\n" +
+ " getLock().release(); // Should be in finally block\n" +
+ " ~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"bytecode/.classpath=>.classpath",
@@ -79,8 +95,11 @@ public class WakelockDetectorTest extends AbstractCheckTest {
public void test5() throws Exception {
assertEquals(
- // Missing 13
- "WakelockActivity5.java:13: Warning: The release() call is not always reached",
+ "src/test/pkg/WakelockActivity5.java:13: Warning: The release() call is not always reached [Wakelock]\n" +
+ " lock.release(); // Should be in finally block\n" +
+ " ~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
"bytecode/.classpath=>.classpath",
@@ -93,9 +112,17 @@ public class WakelockDetectorTest extends AbstractCheckTest {
public void test6() throws Exception {
assertEquals(
- "WakelockActivity6.java:19: Warning: The release() call is not always reached\n" +
- "WakelockActivity6.java:28: Warning: The release() call is not always reached\n" +
- "WakelockActivity6.java:65: Warning: The release() call is not always reached",
+ "src/test/pkg/WakelockActivity6.java:19: Warning: The release() call is not always reached [Wakelock]\n" +
+ " lock.release(); // Wrong\n" +
+ " ~~~~~~~\n" +
+ "src/test/pkg/WakelockActivity6.java:28: Warning: The release() call is not always reached [Wakelock]\n" +
+ " lock.release(); // Wrong\n" +
+ " ~~~~~~~\n" +
+ "src/test/pkg/WakelockActivity6.java:65: Warning: The release() call is not always reached [Wakelock]\n" +
+ " lock.release(); // Wrong\n" +
+ " ~~~~~~~\n" +
+ "0 errors, 3 warnings\n" +
+ "",
lintProject(
"bytecode/.classpath=>.classpath",
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WrongIdDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WrongIdDetectorTest.java
index 5783bd1..15675ba 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WrongIdDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WrongIdDetectorTest.java
@@ -27,10 +27,20 @@ public class WrongIdDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "layout1.xml:14: Error: The id \"button5\" is not defined anywhere. Did you mean one of {button1, button2, button3, button4} ?\n" +
- "layout1.xml:15: Warning: The id \"my_id2\" is not referring to any views in this layout\n" +
- "layout1.xml:17: Error: The id \"my_id3\" is not defined anywhere. Did you mean my_id2 ?\n" +
- "layout1.xml:18: Error: The id \"my_id1\" is defined but not assigned to any views. Did you mean my_id2 ?",
+ "res/layout/layout1.xml:14: Error: The id \"button5\" is not defined anywhere. Did you mean one of {button1, button2, button3, button4} ? [UnknownId]\n" +
+ " android:layout_alignBottom=\"@+id/button5\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/layout1.xml:17: Error: The id \"my_id3\" is not defined anywhere. Did you mean my_id2 ? [UnknownId]\n" +
+ " android:layout_alignRight=\"@+id/my_id3\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/layout1.xml:18: Error: The id \"my_id1\" is defined but not assigned to any views. Did you mean my_id2 ? [UnknownId]\n" +
+ " android:layout_alignTop=\"@+id/my_id1\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/layout1.xml:15: Warning: The id \"my_id2\" is not referring to any views in this layout [UnknownIdInLayout]\n" +
+ " android:layout_alignLeft=\"@+id/my_id2\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "3 errors, 1 warnings\n" +
+ "",
lintProject(
"wrongid/layout1.xml=>res/layout/layout1.xml",
@@ -41,10 +51,20 @@ public class WrongIdDetectorTest extends AbstractCheckTest {
public void testSingleFile() throws Exception {
assertEquals(
- "layout1.xml:14: Warning: The id \"button5\" is not referring to any views in this layout\n" +
- "layout1.xml:15: Warning: The id \"my_id2\" is not referring to any views in this layout\n" +
- "layout1.xml:17: Warning: The id \"my_id3\" is not referring to any views in this layout\n" +
- "layout1.xml:18: Warning: The id \"my_id1\" is not referring to any views in this layout",
+ "res/layout/layout1.xml:14: Warning: The id \"button5\" is not referring to any views in this layout [UnknownIdInLayout]\n" +
+ " android:layout_alignBottom=\"@+id/button5\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/layout1.xml:15: Warning: The id \"my_id2\" is not referring to any views in this layout [UnknownIdInLayout]\n" +
+ " android:layout_alignLeft=\"@+id/my_id2\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/layout1.xml:17: Warning: The id \"my_id3\" is not referring to any views in this layout [UnknownIdInLayout]\n" +
+ " android:layout_alignRight=\"@+id/my_id3\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "res/layout/layout1.xml:18: Warning: The id \"my_id1\" is not referring to any views in this layout [UnknownIdInLayout]\n" +
+ " android:layout_alignTop=\"@+id/my_id1\"\n" +
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 4 warnings\n" +
+ "",
lintFiles("wrongid/layout1.xml=>res/layout/layout1.xml"));
}
diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WrongImportDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WrongImportDetectorTest.java
index 41415df..c44f204 100644
--- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WrongImportDetectorTest.java
+++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WrongImportDetectorTest.java
@@ -27,7 +27,11 @@ public class WrongImportDetectorTest extends AbstractCheckTest {
public void test() throws Exception {
assertEquals(
- "BadImport.java:5: Warning: Don't include android.R here; use a fully qualified name for each usage instead",
+ "src/test/pkg/BadImport.java:5: Warning: Don't include android.R here; use a fully qualified name for each usage instead [SuspiciousImport]\n" +
+ "import android.R;\n" +
+ "~~~~~~~~~~~~~~~~~\n" +
+ "0 errors, 1 warnings\n" +
+ "",
lintProject(
// Java files must be renamed in source tree