blob: 01f6d19d0890e586a429f0356109ef94be04a9a5 [file] [log] [blame]
/*
* Copyright (C) 2023 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 crossvmtest.java.lang;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.junit.Assert;
import org.junit.Test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.lang.reflect.RecordComponent;
import java.math.BigInteger;
import java.util.AbstractMap;
import java.util.Arrays;
import java.util.List;
public class RecordComponentTest {
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.RECORD_COMPONENT})
public @interface CustomAnnotation {
String value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.RECORD_COMPONENT})
public @interface CustomAnnotation2 {
CustomAnnotation[] customAnnotations();
}
record RecordInteger(@CustomAnnotation2(customAnnotations = {@CustomAnnotation("a")})
@CustomAnnotation("b") int x) {}
record RecordString(String s) {}
record GenericRecord<A, B extends AbstractMap<String, BigInteger>> (
A a, B b, List<String> c) {}
@Test
public void testBasic() {
assertTrue(RecordInteger.class.isRecord());
RecordComponent[] components = RecordInteger.class.getRecordComponents();
assertEquals(Arrays.deepToString(components), 1, components.length);
}
@Test
public void testGetAccessor() throws Exception {
RecordComponent[] components = RecordInteger.class.getRecordComponents();
Method getter = components[0].getAccessor();
RecordInteger a = new RecordInteger(9);
assertEquals(9, getter.invoke(a));
}
@Test
public void testGetAnnotation() throws Exception {
RecordComponent[] components = RecordInteger.class.getRecordComponents();
assertEquals("b", RecordInteger.class.getDeclaredField("x")
.getAnnotation(CustomAnnotation.class)
.value());
assertEquals("b", components[0]
.getAnnotation(CustomAnnotation.class)
.value());
}
@Test
public void testGetRecordComponentAnnotation() throws Exception {
RecordComponent[] components = RecordInteger.class.getRecordComponents();
assertTrue(RecordInteger.class.isRecord());
assertEquals(1, components.length);
assertNull(RecordInteger.class.getDeclaredField("x")
.getAnnotation(CustomAnnotation2.class));
CustomAnnotation2 customAnnotation2 = components[0].getAnnotation(CustomAnnotation2.class);
assertNotNull(customAnnotation2);
assertEquals(1, customAnnotation2.customAnnotations().length);
assertEquals("a", customAnnotation2.customAnnotations()[0].value());
}
@Test
public void testGetAnnotations() {
RecordComponent[] components = RecordInteger.class.getRecordComponents();
assertEquals(2, components[0].getAnnotations().length);
}
@Test
public void testGetDeclaredAnnotations() {
RecordComponent[] components = RecordInteger.class.getRecordComponents();
assertEquals(2, components[0].getDeclaredAnnotations().length);
}
@Test
public void testGetDeclaringRecord() {
RecordComponent[] components = RecordInteger.class.getRecordComponents();
assertEquals(RecordInteger.class, components[0].getDeclaringRecord());
}
@Test
public void testGetName() {
RecordComponent[] components = RecordInteger.class.getRecordComponents();
assertEquals("x", components[0].getName());
}
@Test
public void testGetType() {
RecordComponent[] components = RecordInteger.class.getRecordComponents();
assertEquals(int.class, components[0].getType());
}
@Test
public void testToString() {
RecordComponent[] components = RecordInteger.class.getRecordComponents();
assertEquals("int x", components[0].toString());
}
@Test
public void testGetGenericType() {
RecordComponent[] components = RecordInteger.class.getRecordComponents();
assertEquals(int.class, components[0].getGenericType());
components = RecordString.class.getRecordComponents();
assertEquals(String.class, components[0].getGenericType());
components = GenericRecord.class.getRecordComponents();
assertEquals(3, components.length);
assertEquals("A", components[0].getGenericType().getTypeName());
assertEquals("B", components[1].getGenericType().getTypeName());
assertEquals("java.util.List<java.lang.String>", components[2].getGenericType().getTypeName());
}
@Test
public void testGetGenericSingature() {
RecordComponent[] components = RecordInteger.class.getRecordComponents();
assertNull(components[0].getGenericSignature());
components = RecordString.class.getRecordComponents();
assertNull(components[0].getGenericSignature());
components = GenericRecord.class.getRecordComponents();
assertEquals(3, components.length);
assertEquals("TA;", components[0].getGenericSignature());
assertEquals("TB;", components[1].getGenericSignature());
assertEquals("Ljava/util/List<Ljava/lang/String;>;", components[2].getGenericSignature());
}
}