Add additional shortcuts for hint registration

Add `MemberCategory` and `FieldMode` shortcuts for type registration.
Helper `builtWith` methods have also been extracted to the Hint types
to allow general reuse (for example with `registerTypes`).

See gh-29011
This commit is contained in:
Phillip Webb
2022-09-01 16:32:35 -07:00
parent da1005cd66
commit bc0bf1fac3
8 changed files with 199 additions and 6 deletions

View File

@@ -0,0 +1,41 @@
/*
* Copyright 2002-2022 the original author or authors.
*
* 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
*
* https://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 org.springframework.aot.hint;
import java.util.Collections;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link ExecutableHint}.
*
* @author Phillip Webb
* @since 6.0
*/
class ExecutableHintTests {
@Test
void builtWithAppliesMode() {
ExecutableHint.Builder builder = new ExecutableHint.Builder("test", Collections.emptyList());
assertThat(builder.build().getMode()).isEqualTo(ExecutableMode.INVOKE);
ExecutableHint.builtWith(ExecutableMode.INTROSPECT).accept(builder);
assertThat(builder.build().getMode()).isEqualTo(ExecutableMode.INTROSPECT);
}
}

View File

@@ -0,0 +1,38 @@
/*
* Copyright 2002-2022 the original author or authors.
*
* 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
*
* https://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 org.springframework.aot.hint;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link FieldHint}.
*
* @author Phillip Webb
*/
class FieldHintTests {
@Test
void builtWithAppliesMode() {
FieldHint.Builder builder = new FieldHint.Builder("test");
assertThat(builder.build().getMode()).isEqualTo(FieldMode.WRITE);
FieldHint.builtWith(FieldMode.READ).accept(builder);
assertThat(builder.build().getMode()).isEqualTo(FieldMode.READ);
}
}

View File

@@ -106,6 +106,14 @@ class ReflectionHintsTests {
typeWithMemberCategories(Integer.class, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS));
}
@Test
void registerClassWitCustomizer() {
this.reflectionHints.registerType(Integer.class,
typeHint -> typeHint.withMembers(MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS));
assertThat(this.reflectionHints.typeHints()).singleElement().satisfies(
typeWithMemberCategories(Integer.class, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS));
}
@Test
void registerTypesApplyTheSameHints() {
this.reflectionHints.registerTypes(TypeReference.listOf(Integer.class, String.class, Double.class),
@@ -157,6 +165,17 @@ class ReflectionHintsTests {
});
}
@Test
void registerFieldWithMode() {
Field field = ReflectionUtils.findField(TestType.class, "field");
assertThat(field).isNotNull();
this.reflectionHints.registerField(field, FieldMode.READ);
assertTestTypeFieldHint(fieldHint -> {
assertThat(fieldHint.getName()).isEqualTo("field");
assertThat(fieldHint.getMode()).isEqualTo(FieldMode.READ);
});
}
@Test // gh-29055
void registerFieldWithCustomizersCannotDowngradeWrite() {
Field field = ReflectionUtils.findField(TestType.class, "field");

View File

@@ -102,6 +102,17 @@ class TypeHintTests {
});
}
@Test
void createFieldWithFieldMode() {
Builder builder = TypeHint.of(TypeReference.of(String.class));
builder.withField("value", FieldMode.READ);
assertFieldHint(builder, fieldHint -> {
assertThat(fieldHint.getName()).isEqualTo("value");
assertThat(fieldHint.getMode()).isEqualTo(FieldMode.READ);
assertThat(fieldHint.isAllowUnsafeAccess()).isFalse();
});
}
void assertFieldHint(Builder builder, Consumer<FieldHint> fieldHint) {
TypeHint hint = builder.build();
assertThat(hint.fields()).singleElement().satisfies(fieldHint);
@@ -277,4 +288,13 @@ class TypeHintTests {
assertThat(hint).hasToString("TypeHint[type=java.lang.String]");
}
@Test
void builtWithAppliesMemberCategories() {
TypeHint.Builder builder = new TypeHint.Builder(TypeReference.of(String.class));
assertThat(builder.build().getMemberCategories()).isEmpty();
TypeHint.builtWith(MemberCategory.DECLARED_CLASSES, MemberCategory.DECLARED_FIELDS).accept(builder);
assertThat(builder.build().getMemberCategories()).containsExactlyInAnyOrder(MemberCategory.DECLARED_CLASSES,
MemberCategory.DECLARED_FIELDS);
}
}