Skip to content

Commit

Permalink
Simplifies ClassAccessor
Browse files Browse the repository at this point in the history
  • Loading branch information
jqno committed Nov 27, 2024
1 parent d6171be commit 6c836e6
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 77 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,28 +19,17 @@ public class ClassAccessor<T> {
private final VintageValueProvider valueProvider;
private final Objenesis objenesis;

/** Private constructor. Call {@link #of(Class, PrefabValues)} instead. */
ClassAccessor(Class<T> type, VintageValueProvider valueProvider, Objenesis objenesis) {
this.type = type;
this.valueProvider = valueProvider;
this.objenesis = objenesis;
}

/**
* Factory method.
* Constructor.
*
* @param <T> The class on which {@link ClassAccessor} operates.
* @param type The class on which {@link ClassAccessor} operates. Should be the same as T.
* @param valueProvider Prefabricated values with which to fill instantiated objects.
* @param objenesis To instantiate non-record classes.
* @return A {@link ClassAccessor} for T.
*/
public static <T> ClassAccessor<T> of(
Class<T> type,
VintageValueProvider valueProvider,
Objenesis objenesis
) {
return new ClassAccessor<>(type, valueProvider, objenesis);
public ClassAccessor(Class<T> type, VintageValueProvider valueProvider, Objenesis objenesis) {
this.type = type;
this.valueProvider = valueProvider;
this.objenesis = objenesis;
}

/**
Expand All @@ -53,19 +42,7 @@ public static <T> ClassAccessor<T> of(
* @return An instance of T.
*/
public T getRedObject(TypeTag enclosingType, Attributes attributes) {
return getRedAccessor(enclosingType, attributes).get();
}

/**
* Returns an {@link ObjectAccessor} for {@link #getRedObject(TypeTag, Attributes)}.
*
* @param enclosingType Describes the type that contains this object as a field, to determine
* any generic parameters it may contain.
* @param attributes Provides metadata needed to provide a value and to keep track of recursion.
* @return An {@link ObjectAccessor} for {@link #getRedObject}.
*/
public ObjectAccessor<T> getRedAccessor(TypeTag enclosingType, Attributes attributes) {
return buildObjectAccessor().scramble(valueProvider, enclosingType, attributes);
return buildObjectAccessor().scramble(valueProvider, enclosingType, attributes).get();
}

/**
Expand All @@ -78,21 +55,10 @@ public ObjectAccessor<T> getRedAccessor(TypeTag enclosingType, Attributes attrib
* @return An instance of T.
*/
public T getBlueObject(TypeTag enclosingType, Attributes attributes) {
return getBlueAccessor(enclosingType, attributes).get();
}

/**
* Returns an {@link ObjectAccessor} for {@link #getBlueObject(TypeTag, Attributes)}.
*
* @param enclosingType Describes the type that contains this object as a field, to determine
* any generic parameters it may contain.
* @param attributes Provides metadata needed to provide a value and to keep track of recursion.
* @return An {@link ObjectAccessor} for {@link #getBlueObject(TypeTag, Attributes)}.
*/
public ObjectAccessor<T> getBlueAccessor(TypeTag enclosingType, Attributes attributes) {
return buildObjectAccessor()
.scramble(valueProvider, enclosingType, attributes)
.scramble(valueProvider, enclosingType, attributes);
.scramble(valueProvider, enclosingType, attributes)
.get();
}

private ObjectAccessor<T> buildObjectAccessor() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ private Tuple<T> giveInstances(
VintageValueProvider valueProvider,
Attributes attributes
) {
ClassAccessor<T> accessor = ClassAccessor.of(tag.getType(), valueProvider, objenesis);
ClassAccessor<T> accessor = new ClassAccessor<>(tag.getType(), valueProvider, objenesis);
T red = accessor.getRedObject(tag, attributes);
T blue = accessor.getBlueObject(tag, attributes);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ public void setup() {
factoryCache = JavaApiPrefabValues.build();
valueProvider =
new VintageValueProvider(TestValueProviders.empty(), cache, factoryCache, objenesis);
pointContainerAccessor = ClassAccessor.of(PointContainer.class, valueProvider, objenesis);
pointContainerAccessor =
new ClassAccessor<>(PointContainer.class, valueProvider, objenesis);
}

@Test
Expand All @@ -48,7 +49,7 @@ public void getRedObject() {
@Test
@SuppressWarnings("rawtypes")
public void getRedObjectGeneric() {
ClassAccessor<GenericTypeVariableListContainer> accessor = ClassAccessor.of(
ClassAccessor<GenericTypeVariableListContainer> accessor = new ClassAccessor<>(
GenericTypeVariableListContainer.class,
valueProvider,
objenesis
Expand All @@ -60,16 +61,6 @@ public void getRedObjectGeneric() {
assertEquals(String.class, foo.tList.get(0).getClass());
}

@Test
public void getRedAccessor() {
PointContainer foo = pointContainerAccessor.getRedObject(TypeTag.NULL, empty);
ObjectAccessor<PointContainer> objectAccessor = pointContainerAccessor.getRedAccessor(
TypeTag.NULL,
empty
);
assertEquals(foo, objectAccessor.get());
}

@Test
public void getBlueObject() {
assertObjectHasNoNullFields(pointContainerAccessor.getBlueObject(TypeTag.NULL, empty));
Expand All @@ -78,7 +69,7 @@ public void getBlueObject() {
@Test
@SuppressWarnings("rawtypes")
public void getBlueObjectGeneric() {
ClassAccessor<GenericTypeVariableListContainer> accessor = ClassAccessor.of(
ClassAccessor<GenericTypeVariableListContainer> accessor = new ClassAccessor<>(
GenericTypeVariableListContainer.class,
valueProvider,
objenesis
Expand All @@ -90,16 +81,6 @@ public void getBlueObjectGeneric() {
assertEquals(String.class, foo.tList.get(0).getClass());
}

@Test
public void getBlueAccessor() {
PointContainer foo = pointContainerAccessor.getBlueObject(TypeTag.NULL, empty);
ObjectAccessor<PointContainer> objectAccessor = pointContainerAccessor.getBlueAccessor(
TypeTag.NULL,
empty
);
assertEquals(foo, objectAccessor.get());
}

@Test
public void redAndBlueNotEqual() {
PointContainer red = pointContainerAccessor.getRedObject(TypeTag.NULL, empty);
Expand All @@ -109,15 +90,13 @@ public void redAndBlueNotEqual() {

@Test
public void instantiateAllTypes() {
ClassAccessor
.of(AllTypesContainer.class, valueProvider, objenesis)
new ClassAccessor<>(AllTypesContainer.class, valueProvider, objenesis)
.getRedObject(TypeTag.NULL, empty);
}

@Test
public void instantiateArrayTypes() {
ClassAccessor
.of(AllArrayTypesContainer.class, valueProvider, objenesis)
new ClassAccessor<>(AllArrayTypesContainer.class, valueProvider, objenesis)
.getRedObject(TypeTag.NULL, empty);
}

Expand All @@ -129,28 +108,25 @@ public void instantiateRecursiveTypeUsingPrefabValue() {
);
valueProvider =
new VintageValueProvider(TestValueProviders.empty(), cache, factoryCache, objenesis);
ClassAccessor
.of(TwoStepNodeA.class, valueProvider, objenesis)
new ClassAccessor<>(TwoStepNodeA.class, valueProvider, objenesis)
.getRedObject(TypeTag.NULL, empty);
}

@Test
public void instantiateInterfaceField() {
ClassAccessor
.of(InterfaceContainer.class, valueProvider, objenesis)
new ClassAccessor<>(InterfaceContainer.class, valueProvider, objenesis)
.getRedObject(TypeTag.NULL, empty);
}

@Test
public void instantiateAbstractClassField() {
ClassAccessor
.of(AbstractClassContainer.class, valueProvider, objenesis)
new ClassAccessor<>(AbstractClassContainer.class, valueProvider, objenesis)
.getRedObject(TypeTag.NULL, empty);
}

@Test
public void anInvalidTypeShouldNotThrowAnExceptionUponCreation() {
ClassAccessor.of(null, valueProvider, objenesis);
new ClassAccessor<>(null, valueProvider, objenesis);
}

private void assertObjectHasNoNullFields(PointContainer foo) {
Expand Down

0 comments on commit 6c836e6

Please sign in to comment.