File: MethodValInferenceTest.java

package info (click to toggle)
checker-framework-java 3.2.0%2Bds-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 23,104 kB
  • sloc: java: 145,916; xml: 839; sh: 518; makefile: 404; perl: 26
file content (103 lines) | stat: -rw-r--r-- 6,260 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.checkerframework.common.reflection.qual.ClassBound;
import org.checkerframework.common.reflection.qual.ClassVal;
import org.checkerframework.common.reflection.qual.MethodVal;
import org.checkerframework.common.value.qual.ArrayLen;
import org.checkerframework.common.value.qual.StringVal;

class MethodValInferenceTest {
    boolean flag = true;

    public void testGetMethodParamLen(
            Class<?> @ArrayLen(2) [] classArray2, Class<?>[] classArrayUnknown) throws Exception {
        @StringVal("someMethod") String str = "someMethod";
        @ClassVal("java.lang.Object") Class<?> c = Object.class;

        @MethodVal(className = "java.lang.Object", methodName = "getA", params = 0) Method m1 = c.getMethod("getA", new Class[] {});

        @MethodVal(className = "java.lang.Object", methodName = "getA", params = 0) Method m2 = c.getMethod("getA", (Class[]) null);

        @MethodVal(className = "java.lang.Object", methodName = "someMethod", params = 1) Method m3 = c.getMethod("someMethod", new Class[] {Integer.class});

        @MethodVal(className = "java.lang.Object", methodName = "equals", params = 1) Method m4 = c.getMethod("equals", Object.class);

        @MethodVal(className = "java.lang.Object", methodName = "someMethod", params = 1) Method m5 = c.getMethod(str, int.class);

        @MethodVal(className = "java.lang.Object", methodName = "getB", params = 0) Method m6 = c.getMethod("getB", new Class[0]);

        @MethodVal(className = "java.lang.Object", methodName = "someMethod", params = 1) Method m7 = c.getMethod(str, new Class[] {int.class});

        @MethodVal(className = "java.lang.Object", methodName = "someMethod", params = 2) Method m8 = c.getMethod(str, new Class[] {Integer.class, Integer.class});

        @MethodVal(className = "java.lang.Object", methodName = "someMethod", params = 2) Method m10 = c.getMethod(str, int.class, int.class);

        @MethodVal(className = "java.lang.Object", methodName = "someMethod", params = 2) Method m11 = c.getMethod(str, classArray2);

        @MethodVal(className = "java.lang.Object", methodName = "someMethod", params = -1) Method m12 = c.getMethod(str, classArrayUnknown);
    }

    public void testGetMethodMultiClassAndMethodNames(
            @ClassVal({"java.lang.Object", "java.lang.String"}) Class<?> twoClasses,
            @ClassVal({"java.lang.Object"}) Class<?> oneClass,
            @StringVal({"method1"}) String oneName,
            @StringVal({"method1", "method2"}) String twoNames,
            Class<?> @ArrayLen(2) [] classArray2,
            Class<?>[] classArrayUnknown)
            throws Exception {

        @MethodVal(
                className = {"java.lang.Object"},
                methodName = {"method1"},
                params = -1)
        Method m1 = oneClass.getMethod(oneName, classArrayUnknown);
        @MethodVal(
                className = {"java.lang.Object", "java.lang.Object"},
                methodName = {"method1", "method2"},
                params = {-1, -1})
        Method m2 = oneClass.getMethod(twoNames, classArrayUnknown);
        @MethodVal(
                className = {"java.lang.Object", "java.lang.String"},
                methodName = {"method1", "method1"},
                params = {-1, -1})
        Method m3 = twoClasses.getMethod(oneName, classArrayUnknown);
        @MethodVal(
                className = {
                    "java.lang.Object",
                    "java.lang.String",
                    "java.lang.Object",
                    "java.lang.String"
                },
                methodName = {"method1", "method2", "method2", "method1"},
                params = {-1, -1, -1, -1})
        Method m4 = twoClasses.getMethod(twoNames, classArrayUnknown);
    }

    @ClassBound("java.lang.Object") Class<?> classBound = Object.class;

    public void testGetConstructorClassBound() throws Exception {
        @MethodVal(className = "java.lang.Object", methodName = "getA", params = 0) Method m1 = classBound.getMethod("getA", new Class[] {});
    }

    public void testGetConstructorClassBoundFail() throws Exception {
        @MethodVal(className = "java.lang.Object", methodName = "<init>", params = 0)
        // :: error: (assignment.type.incompatible)
        Constructor<?> con1 = classBound.getConstructor(new Class[] {}); // Should be @UnknownMethod
    }

    public void testGetConstructorParamLen(
            Class<?> @ArrayLen(2) [] classArray2, Class<?>[] classArrayUnknown) throws Exception {
        @ClassVal("java.lang.Object") Class<?> c = Object.class;
        @MethodVal(className = "java.lang.Object", methodName = "<init>", params = 0) Constructor<?> con1 = c.getConstructor(new Class[] {});
        @MethodVal(className = "java.lang.Object", methodName = "<init>", params = 0) Constructor<?> con2 = c.getConstructor((Class[]) null);
        @MethodVal(className = "java.lang.Object", methodName = "<init>", params = 1) Constructor<?> con3 = c.getConstructor(new Class[] {Integer.class});
        @MethodVal(className = "java.lang.Object", methodName = "<init>", params = 1) Constructor<?> con4 = c.getConstructor(Object.class);
        @MethodVal(className = "java.lang.Object", methodName = "<init>", params = 1) Constructor<?> con5 = c.getConstructor(int.class);
        @MethodVal(className = "java.lang.Object", methodName = "<init>", params = 0) Constructor<?> con6 = c.getConstructor(new Class[0]);
        @MethodVal(className = "java.lang.Object", methodName = "<init>", params = 1) Constructor<?> con7 = c.getConstructor(new Class[] {int.class});
        @MethodVal(className = "java.lang.Object", methodName = "<init>", params = 2) Constructor<?> con8 = c.getConstructor(new Class[] {Integer.class, Integer.class});
        @MethodVal(className = "java.lang.Object", methodName = "<init>", params = 2) Constructor<?> con9 = c.getConstructor(int.class, int.class);
        @MethodVal(className = "java.lang.Object", methodName = "<init>", params = 2) Constructor<?> con10 = c.getConstructor(classArray2);
        @MethodVal(className = "java.lang.Object", methodName = "<init>", params = -1) Constructor<?> con11 = c.getConstructor(classArrayUnknown);
    }
}