package org.togglz.core.util; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.junit.Test; import org.mockito.Matchers; import org.togglz.core.Feature; import org.togglz.core.manager.FeatureManager; public class FeatureMapTest { @Test public void canBootstrapViaConstructor() { FeatureManager featureManager = mock(FeatureManager.class); Set<Feature> features = new HashSet<Feature>(); String name1 = "Feature 1"; String name2 = "Feature 2"; Feature feature1 = mock(Feature.class, name1); Feature feature2 = mock(Feature.class, name2); features.add(feature1); features.add(feature2); when(featureManager.getFeatures()).thenReturn(features); when(feature1.name()).thenReturn(name1); when(feature2.name()).thenReturn(name2); when(featureManager.isActive(featureNamed(name1))).thenReturn(true); when(featureManager.isActive(featureNamed(name2))).thenReturn(false); Map<Object, Boolean> map = new FeatureMap(featureManager); assertThat(map.size(), equalTo(2)); assertThat(map.isEmpty(), is(false)); assertThat(map.get(name1), equalTo(true)); assertThat(map.get(name2), equalTo(false)); assertThat(map.get("unknown"), equalTo(false)); } @Test public void shouldReturnCorrectSize() { List<Feature> features = Arrays.<Feature>asList( new NamedFeature("f1"), new NamedFeature("f2") ); FeatureManager featureManager = mock(FeatureManager.class); when(featureManager.getFeatures()).thenReturn(new HashSet<Feature>(features)); FeatureMap map = new FeatureMap(featureManager); assertThat(map).hasSize(2); } @Test public void shouldSupportLookupByFeatureName() { FeatureManager featureManager = mock(FeatureManager.class); when(featureManager.isActive(featureNamed("test"))).thenReturn(true); FeatureMap map = new FeatureMap(featureManager); assertThat(map.get("test")).isEqualTo(true); assertThat(map.get("other")).isEqualTo(false); } @Test public void shouldSupportLookupByFeatureInstance() { FeatureManager featureManager = mock(FeatureManager.class); when(featureManager.isActive(featureNamed("test"))).thenReturn(true); FeatureMap map = new FeatureMap(featureManager); assertThat(map.get(new NamedFeature("test"))).isEqualTo(true); assertThat(map.get(new NamedFeature("other"))).isEqualTo(false); } private Feature featureNamed(final String name) { return Matchers.argThat(new BaseMatcher<Feature>() { @Override public boolean matches(Object obj) { if (obj instanceof Feature) { return ((Feature) obj).name().equals(name); } return false; } @Override public void describeTo(Description desc) { desc.appendText("Does not match: " + name); } }); } }