package org.togglz.core.metadata.enums;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Set;
import org.junit.Test;
import org.togglz.core.Feature;
import org.togglz.core.annotation.ActivationParameter;
import org.togglz.core.annotation.DefaultActivationStrategy;
import org.togglz.core.annotation.EnabledByDefault;
import org.togglz.core.annotation.Label;
import org.togglz.core.metadata.FeatureGroup;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import org.togglz.core.repository.FeatureState;
public class EnumFeatureMetaDataTest {
public static final String FIELD_LEVEL_GROUP_LABEL = "Field Level Group Label";
public static final String CLASS_LEVEL_GROUP_LABEL = "Class Level Group Label";
@org.togglz.core.annotation.FeatureGroup
@Label(FIELD_LEVEL_GROUP_LABEL)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
private @interface FieldLevelGroup {
}
@org.togglz.core.annotation.FeatureGroup
@Label(CLASS_LEVEL_GROUP_LABEL)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
private @interface ClassLevelGroup {
}
@ClassLevelGroup
private enum TestFeatures implements Feature {
@FieldLevelGroup
FEATURE,
@EnabledByDefault
@DefaultActivationStrategy(
id = "SomeActivationId",
parameters = {
@ActivationParameter(name = "SomeParameterName", value = "someValue1,someValue2"),
@ActivationParameter(name = "SomeParameterName2", value = "someValue3,someValue4")
}
)
FEATURE_WITH_DEFAULT_STATE;
}
@Test
public void constructorWillPopulateGroupsFromAnnotations() throws Exception {
// act
EnumFeatureMetaData metaData = new EnumFeatureMetaData(TestFeatures.FEATURE);
// assert
Set<FeatureGroup> groups = metaData.getGroups();
assertThat(groups, notNullValue());
assertThat(groups.size(), is(2));
// verify field level group is there
FeatureGroup group1 = Iterables.find(groups, createFeatureGroupLabelPredicate(FIELD_LEVEL_GROUP_LABEL));
assertThat(group1.contains(TestFeatures.FEATURE), is(true));
// verify class level group is there
FeatureGroup group2 = Iterables.find(groups, createFeatureGroupLabelPredicate(CLASS_LEVEL_GROUP_LABEL));
assertThat(group2.contains(TestFeatures.FEATURE), is(true));
}
@Test
public void constructorWillPopulateDefaultActivationStrategyFromAnnotations() throws Exception {
// act
EnumFeatureMetaData metaData = new EnumFeatureMetaData(TestFeatures.FEATURE_WITH_DEFAULT_STATE);
FeatureState featureState = metaData.getDefaultFeatureState();
assertThat(featureState, notNullValue());
assertThat(featureState.isEnabled(), is(true));
assertThat(featureState.getStrategyId(), is("SomeActivationId"));
assertThat(featureState.getParameter("SomeParameterName"), is("someValue1,someValue2"));
assertThat(featureState.getParameter("SomeParameterName2"), is("someValue3,someValue4"));
}
private Predicate<FeatureGroup> createFeatureGroupLabelPredicate(final String label) {
return new Predicate<FeatureGroup>() {
@Override
public boolean apply(FeatureGroup group) {
return group.getLabel().equals(label);
}
};
}
}