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
17package com.android.contacts.compat;
18
19import android.test.AndroidTestCase;
20import android.test.suitebuilder.annotation.SmallTest;
21
22@SmallTest
23public class CompatUtilsTest extends AndroidTestCase {
24
25    public void testIsClassAvailable_NullClassName() {
26        assertFalse(CompatUtils.isClassAvailable(null));
27    }
28
29    public void testIsClassAvailable_EmptyClassName() {
30        assertFalse(CompatUtils.isClassAvailable(""));
31    }
32
33    public void testIsClassAvailable_NonexistentClass() {
34        assertFalse(CompatUtils.isClassAvailable("com.android.contacts.common.NonexistentClass"));
35    }
36
37    public void testIsClassAvailable() {
38        assertTrue(CompatUtils.isClassAvailable(BaseClass.class.getName()));
39    }
40
41    public void testIsMethodAvailable_NullClassName() {
42        assertFalse(CompatUtils.isMethodAvailable(null, "methodName"));
43    }
44
45    public void testIsMethodAvailable_EmptyClassName() {
46        assertFalse(CompatUtils.isMethodAvailable("", "methodName"));
47    }
48
49    public void testIsMethodAvailable_NullMethodName() {
50        assertFalse(CompatUtils.isMethodAvailable("className", null));
51    }
52
53    public void testIsMethodAvailable_EmptyMethodName() {
54        assertFalse(CompatUtils.isMethodAvailable("className", ""));
55    }
56
57    public void testIsMethodAvailable_NonexistentClass() {
58        assertFalse(CompatUtils.isMethodAvailable("com.android.contacts.common.NonexistentClass",
59                ""));
60    }
61
62    public void testIsMethodAvailable_NonexistentMethod() {
63        assertFalse(CompatUtils.isMethodAvailable(BaseClass.class.getName(), "derivedMethod"));
64    }
65
66    public void testIsMethodAvailable() {
67        assertTrue(CompatUtils.isMethodAvailable(BaseClass.class.getName(), "baseMethod"));
68    }
69
70    public void testIsMethodAvailable_InheritedMethod() {
71        assertTrue(CompatUtils.isMethodAvailable(DerivedClass.class.getName(), "baseMethod"));
72    }
73
74    public void testIsMethodAvailable_OverloadedMethod() {
75        assertTrue(CompatUtils.isMethodAvailable(DerivedClass.class.getName(), "overloadedMethod"));
76        assertTrue(CompatUtils.isMethodAvailable(DerivedClass.class.getName(), "overloadedMethod",
77                Integer.TYPE));
78    }
79
80    public void testIsMethodAvailable_NonexistentOverload() {
81        assertFalse(CompatUtils.isMethodAvailable(DerivedClass.class.getName(), "overloadedMethod",
82                Boolean.TYPE));
83    }
84
85    public void testInvokeMethod_NullMethodName() {
86        assertNull(CompatUtils.invokeMethod(new BaseClass(), null, null, null));
87    }
88
89    public void testInvokeMethod_EmptyMethodName() {
90        assertNull(CompatUtils.invokeMethod(new BaseClass(), "", null, null));
91    }
92
93    public void testInvokeMethod_NullClassInstance() {
94        assertNull(CompatUtils.invokeMethod(null, "", null, null));
95    }
96
97    public void testInvokeMethod_NonexistentMethod() {
98        assertNull(CompatUtils.invokeMethod(new BaseClass(), "derivedMethod", null, null));
99    }
100
101    public void testInvokeMethod_MethodWithNoParameters() {
102        assertEquals(1, CompatUtils.invokeMethod(new DerivedClass(), "overloadedMethod", null, null));
103    }
104
105    public void testInvokeMethod_MethodWithNoParameters_WithParameters() {
106        assertNull(CompatUtils.invokeMethod(new DerivedClass(), "derivedMethod",
107                new Class<?>[] {Integer.TYPE}, new Object[] {1}));
108    }
109
110    public void testInvokeMethod_MethodWithParameters_WithEmptyParameterList() {
111        assertNull(CompatUtils.invokeMethod(new DerivedClass(), "overloadedMethod",
112                new Class<?>[] {Integer.TYPE}, new Object[] {}));
113    }
114
115    public void testInvokeMethod_InvokeSimpleMethod() {
116        assertEquals(2, CompatUtils.invokeMethod(new DerivedClass(), "overloadedMethod",
117                new Class<?>[] {Integer.TYPE}, new Object[] {2}));
118    }
119
120    private class BaseClass {
121        public void baseMethod() {}
122    }
123
124    private class DerivedClass extends BaseClass {
125        public int derivedMethod() {
126            // This method needs to return something to differentiate a successful invocation from
127            // an unsuccessful one.
128            return 0;
129        }
130
131        public int overloadedMethod() {
132            return 1;
133        }
134
135        public int overloadedMethod(int i) {
136            return i;
137        }
138    }
139}
140