1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16 
17 package com.android.contacts.compat;
18 
19 import android.test.AndroidTestCase;
20 
21 import androidx.test.filters.SmallTest;
22 
23 @SmallTest
24 public class CompatUtilsTest extends AndroidTestCase {
25 
testIsClassAvailable_NullClassName()26     public void testIsClassAvailable_NullClassName() {
27         assertFalse(CompatUtils.isClassAvailable(null));
28     }
29 
testIsClassAvailable_EmptyClassName()30     public void testIsClassAvailable_EmptyClassName() {
31         assertFalse(CompatUtils.isClassAvailable(""));
32     }
33 
testIsClassAvailable_NonexistentClass()34     public void testIsClassAvailable_NonexistentClass() {
35         assertFalse(CompatUtils.isClassAvailable("com.android.contacts.common.NonexistentClass"));
36     }
37 
testIsClassAvailable()38     public void testIsClassAvailable() {
39         assertTrue(CompatUtils.isClassAvailable(BaseClass.class.getName()));
40     }
41 
testIsMethodAvailable_NullClassName()42     public void testIsMethodAvailable_NullClassName() {
43         assertFalse(CompatUtils.isMethodAvailable(null, "methodName"));
44     }
45 
testIsMethodAvailable_EmptyClassName()46     public void testIsMethodAvailable_EmptyClassName() {
47         assertFalse(CompatUtils.isMethodAvailable("", "methodName"));
48     }
49 
testIsMethodAvailable_NullMethodName()50     public void testIsMethodAvailable_NullMethodName() {
51         assertFalse(CompatUtils.isMethodAvailable("className", null));
52     }
53 
testIsMethodAvailable_EmptyMethodName()54     public void testIsMethodAvailable_EmptyMethodName() {
55         assertFalse(CompatUtils.isMethodAvailable("className", ""));
56     }
57 
testIsMethodAvailable_NonexistentClass()58     public void testIsMethodAvailable_NonexistentClass() {
59         assertFalse(CompatUtils.isMethodAvailable("com.android.contacts.common.NonexistentClass",
60                 ""));
61     }
62 
testIsMethodAvailable_NonexistentMethod()63     public void testIsMethodAvailable_NonexistentMethod() {
64         assertFalse(CompatUtils.isMethodAvailable(BaseClass.class.getName(), "derivedMethod"));
65     }
66 
testIsMethodAvailable()67     public void testIsMethodAvailable() {
68         assertTrue(CompatUtils.isMethodAvailable(BaseClass.class.getName(), "baseMethod"));
69     }
70 
testIsMethodAvailable_InheritedMethod()71     public void testIsMethodAvailable_InheritedMethod() {
72         assertTrue(CompatUtils.isMethodAvailable(DerivedClass.class.getName(), "baseMethod"));
73     }
74 
testIsMethodAvailable_OverloadedMethod()75     public void testIsMethodAvailable_OverloadedMethod() {
76         assertTrue(CompatUtils.isMethodAvailable(DerivedClass.class.getName(), "overloadedMethod"));
77         assertTrue(CompatUtils.isMethodAvailable(DerivedClass.class.getName(), "overloadedMethod",
78                 Integer.TYPE));
79     }
80 
testIsMethodAvailable_NonexistentOverload()81     public void testIsMethodAvailable_NonexistentOverload() {
82         assertFalse(CompatUtils.isMethodAvailable(DerivedClass.class.getName(), "overloadedMethod",
83                 Boolean.TYPE));
84     }
85 
testInvokeMethod_NullMethodName()86     public void testInvokeMethod_NullMethodName() {
87         assertNull(CompatUtils.invokeMethod(new BaseClass(), null, null, null));
88     }
89 
testInvokeMethod_EmptyMethodName()90     public void testInvokeMethod_EmptyMethodName() {
91         assertNull(CompatUtils.invokeMethod(new BaseClass(), "", null, null));
92     }
93 
testInvokeMethod_NullClassInstance()94     public void testInvokeMethod_NullClassInstance() {
95         assertNull(CompatUtils.invokeMethod(null, "", null, null));
96     }
97 
testInvokeMethod_NonexistentMethod()98     public void testInvokeMethod_NonexistentMethod() {
99         assertNull(CompatUtils.invokeMethod(new BaseClass(), "derivedMethod", null, null));
100     }
101 
testInvokeMethod_MethodWithNoParameters()102     public void testInvokeMethod_MethodWithNoParameters() {
103         assertEquals(1, CompatUtils.invokeMethod(new DerivedClass(), "overloadedMethod", null, null));
104     }
105 
testInvokeMethod_MethodWithNoParameters_WithParameters()106     public void testInvokeMethod_MethodWithNoParameters_WithParameters() {
107         assertNull(CompatUtils.invokeMethod(new DerivedClass(), "derivedMethod",
108                 new Class<?>[] {Integer.TYPE}, new Object[] {1}));
109     }
110 
testInvokeMethod_MethodWithParameters_WithEmptyParameterList()111     public void testInvokeMethod_MethodWithParameters_WithEmptyParameterList() {
112         assertNull(CompatUtils.invokeMethod(new DerivedClass(), "overloadedMethod",
113                 new Class<?>[] {Integer.TYPE}, new Object[] {}));
114     }
115 
testInvokeMethod_InvokeSimpleMethod()116     public void testInvokeMethod_InvokeSimpleMethod() {
117         assertEquals(2, CompatUtils.invokeMethod(new DerivedClass(), "overloadedMethod",
118                 new Class<?>[] {Integer.TYPE}, new Object[] {2}));
119     }
120 
121     private class BaseClass {
baseMethod()122         public void baseMethod() {}
123     }
124 
125     private class DerivedClass extends BaseClass {
derivedMethod()126         public int derivedMethod() {
127             // This method needs to return something to differentiate a successful invocation from
128             // an unsuccessful one.
129             return 0;
130         }
131 
overloadedMethod()132         public int overloadedMethod() {
133             return 1;
134         }
135 
overloadedMethod(int i)136         public int overloadedMethod(int i) {
137             return i;
138         }
139     }
140 }
141