1/*
2 * Copyright (C) 2008 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 libcore.java.lang.reflect;
18
19import java.lang.reflect.Field;
20import java.lang.reflect.Modifier;
21
22import junit.framework.TestCase;
23
24public final class FieldTest extends TestCase {
25    private static final long MY_LONG = 5073258162644648461L;
26
27    // Reflection for static long fields was broken http://b/1120750
28    public void testLongFieldReflection() throws Exception {
29        Field field = getClass().getDeclaredField("MY_LONG");
30        assertEquals(5073258162644648461L, field.getLong(null));
31    }
32
33    public void testEqualConstructorEqualsAndHashCode() throws Exception {
34        Field f1 = FieldTestHelper.class.getField("a");
35        Field f2 = FieldTestHelper.class.getField("a");
36        assertEquals(f1, f2);
37        assertEquals(f1.hashCode(), f2.hashCode());
38    }
39
40    public void testHashCodeSpec() throws Exception {
41        Field f1 = FieldTestHelper.class.getField("a");
42        assertEquals(FieldTestHelper.class.getName().hashCode() ^ "a".hashCode(), f1.hashCode());
43    }
44
45    public void testDifferentConstructorEqualsAndHashCode() throws Exception {
46        Field f1 = FieldTestHelper.class.getField("a");
47        Field f2 = FieldTestHelper.class.getField("b");
48        assertFalse(f1.equals(f2));
49    }
50
51    // Tests that the "synthetic" modifier is handled correctly.
52    // It's supposed to be present but not shown in toString.
53    public void testSyntheticModifier() throws NoSuchFieldException {
54        Field valuesField = Thread.State.class.getDeclaredField("$VALUES");
55        // Check that this test makes sense.
56        assertTrue(valuesField.isSynthetic());
57        assertEquals(Modifier.SYNTHETIC, valuesField.getModifiers() & Modifier.SYNTHETIC);
58        assertEquals("private static final java.lang.Thread$State[] java.lang.Thread$State.$VALUES",
59                valuesField.toString());
60    }
61
62    // Ensure that the "enum constant" bit is not returned in toString.
63    public void testEnumValueField() throws NoSuchFieldException {
64        Field blockedField = Thread.State.class.getDeclaredField("BLOCKED");
65        assertTrue(Thread.State.class.getDeclaredField("BLOCKED").isEnumConstant());
66        assertEquals("public static final", Modifier.toString(blockedField.getModifiers()));
67        assertEquals(
68                "public static final java.lang.Thread$State java.lang.Thread$State.BLOCKED",
69                blockedField.toString());
70    }
71
72    class ClassWithATransientField {
73        private transient Class<String> transientField = String.class;
74    }
75
76    // Tests that the "transient" modifier is handled correctly.
77    // The underlying constant value for it is the same as for the "varargs" method modifier.
78    // http://b/18488857
79    public void testTransientModifier() throws NoSuchFieldException {
80        Field transientField = ClassWithATransientField.class.getDeclaredField("transientField");
81        // Check that this test makes sense.
82        assertEquals(Modifier.TRANSIENT, transientField.getModifiers() & Modifier.TRANSIENT);
83        assertEquals(
84                "private transient java.lang.Class "
85                        + "libcore.java.lang.reflect.FieldTest$ClassWithATransientField"
86                        + ".transientField",
87                transientField.toString());
88    }
89
90    public void testToGenericString() throws NoSuchFieldException {
91        Field transientField = ClassWithATransientField.class.getDeclaredField("transientField");
92        // Check that this test makes sense.
93        assertEquals(Modifier.TRANSIENT, transientField.getModifiers() & Modifier.TRANSIENT);
94        assertEquals(
95                "private transient java.lang.Class<java.lang.String> "
96                        + "libcore.java.lang.reflect.FieldTest$ClassWithATransientField"
97                        + ".transientField",
98                transientField.toGenericString());
99    }
100
101    static class FieldTestHelper {
102        public String a;
103        public Object b;
104    }
105}
106