blob: 513ef9ee9162f50691d6a96472d7b542019bf2d5 [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.tools.lint.checks;
import com.android.tools.lint.detector.api.Detector;
@SuppressWarnings("javadoc")
public class JavaPerformanceDetectorTest extends AbstractCheckTest {
@Override
protected Detector getDetector() {
return new JavaPerformanceDetector();
}
public void test() throws Exception {
boolean isInAospEnvironment = System.getenv("ANDROID_BUILD_TOP") != null;
assertEquals(
"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:190: Warning: Use new SparseIntArray(...) instead for better performance [UseSparseArrays]\n" +
" new SparseArray<Integer>(); // Use SparseIntArray instead\n" +
" ~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
(isInAospEnvironment ?
"src/test/pkg/JavaPerformanceTest.java:191: Warning: Use new SparseLongArray(...) instead for better performance [UseSparseArrays]\n" +
" new SparseArray<Long>(); // Use SparseLongArray instead\n" +
" ~~~~~~~~~~~~~~~~~~~~~~~\n" : "") +
"src/test/pkg/JavaPerformanceTest.java:192: Warning: Use new SparseBooleanArray(...) instead for better performance [UseSparseArrays]\n" +
" new SparseArray<Boolean>(); // Use SparseBooleanArray instead\n" +
" ~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
"src/test/pkg/JavaPerformanceTest.java:201: Warning: Use new SparseArray<String>(...) instead for better performance [UseSparseArrays]\n" +
" Map<Byte, String> myByteMap = new HashMap<Byte, String>();\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" +
(isInAospEnvironment ?
"0 errors, 23 warnings\n" : "0 errors, 22 warnings\n"),
lintProject("src/test/pkg/JavaPerformanceTest.java.txt=>" +
"src/test/pkg/JavaPerformanceTest.java"));
}
public void testLongSparseArray() throws Exception {
assertEquals(""
+ "src/test/pkg/LongSparseArray.java:10: Warning: Use new LongSparseArray(...) instead for better performance [UseSparseArrays]\n"
+ " Map<Long, String> myStringMap = new HashMap<Long, String>();\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "0 errors, 1 warnings\n",
lintProject(
"apicheck/minsdk17.xml=>AndroidManifest.xml",
"src/test/pkg/LongSparseArray.java.txt=>src/test/pkg/LongSparseArray.java"));
}
public void testLongSparseSupportLibArray() throws Exception {
assertEquals(""
+ "src/test/pkg/LongSparseArray.java:10: Warning: Use new android.support.v4.util.LongSparseArray(...) instead for better performance [UseSparseArrays]\n"
+ " Map<Long, String> myStringMap = new HashMap<Long, String>();\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "0 errors, 1 warnings\n",
lintProject(
"src/test/pkg/LongSparseArray.java.txt=>src/test/pkg/LongSparseArray.java",
"bytecode/classes.jar=>libs/android-support-v4.jar"));
}
public void testNoLongSparseArray() throws Exception {
assertEquals(
"No warnings.",
lintProject(
"apicheck/minsdk1.xml=>AndroidManifest.xml",
"src/test/pkg/LongSparseArray.java.txt=>src/test/pkg/LongSparseArray.java"));
}
public void testSparseLongArray1() throws Exception {
assertEquals(""
+ "src/test/pkg/SparseLongArray.java:10: Warning: Use new SparseLongArray(...) instead for better performance [UseSparseArrays]\n"
+ " Map<Integer, Long> myStringMap = new HashMap<Integer, Long>();\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "0 errors, 1 warnings\n",
lintProject(
"apicheck/minsdk19.xml=>AndroidManifest.xml",
"src/test/pkg/SparseLongArray.java.txt=>src/test/pkg/SparseLongArray.java"));
}
public void testSparseLongArray2() throws Exception {
// Note -- it's offering a SparseArray, not a SparseLongArray!
assertEquals(""
+ "src/test/pkg/SparseLongArray.java:10: Warning: Use new SparseArray<Long>(...) instead for better performance [UseSparseArrays]\n"
+ " Map<Integer, Long> myStringMap = new HashMap<Integer, Long>();\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "0 errors, 1 warnings\n",
lintProject(
"apicheck/minsdk1.xml=>AndroidManifest.xml",
"src/test/pkg/SparseLongArray.java.txt=>src/test/pkg/SparseLongArray.java"));
}
}