### Question:
AvailableValuesAspectDefinition implements LinkkiAspectDefinition { protected <T extends Enum<T>> List<?> getValuesDerivedFromDatatype(String propertyName, Class<?> valueClass) { if (valueClass.isEnum()) { @SuppressWarnings("unchecked") Class<T> enumType = (Class<T>)valueClass; return AvailableValuesProvider.enumToValues(enumType, getAvailableValuesType() == AvailableValuesType.ENUM_VALUES_INCL_NULL); } if (valueClass == Boolean.TYPE) { return AvailableValuesProvider.booleanPrimitiveToValues(); } if (valueClass == Boolean.class) { return AvailableValuesProvider.booleanWrapperToValues(); } else { throw new IllegalStateException( "Cannot retrieve list of available values for " + valueClass.getName() + "#" + propertyName); } } AvailableValuesAspectDefinition(AvailableValuesType availableValuesType,
            BiConsumer<C, ListDataProvider<Object>> dataProviderSetter); @Override Handler createUiUpdater(PropertyDispatcher propertyDispatcher, ComponentWrapper componentWrapper); Aspect<Collection<?>> createAspect(String propertyName, Class<?> valueClass); static final String NAME; }### Answer:
@Test public void testGetValuesDerivedFromDatatype_NonEnumDatatype() { Assertions.assertThrows(IllegalStateException.class, () -> { new AvailableValuesAspectDefinition<>(AvailableValuesType.DYNAMIC, NOP) .getValuesDerivedFromDatatype("foo", String.class); }); }
@Test public void testGetValuesDerivedFromDatatype() { AvailableValuesAspectDefinition<HasItems<?>> availableValuesAspectDefinition = new AvailableValuesAspectDefinition<>( AvailableValuesType.DYNAMIC, NOP); assertThat(availableValuesAspectDefinition.getValuesDerivedFromDatatype("foo", TestEnum.class), contains(TestEnum.ONE, TestEnum.TWO, TestEnum.THREE)); assertThat(availableValuesAspectDefinition.getValuesDerivedFromDatatype("foo", Boolean.class), contains(null, true, false)); assertThat(availableValuesAspectDefinition.getValuesDerivedFromDatatype("foo", boolean.class), contains(true, false)); }