package org.robobinding.attribute; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import static org.robobinding.widget.adapterview.AbstractAdaptedDataSetAttributes.ITEM_MAPPING; import java.util.Collection; import org.junit.Before; import org.junit.Test; import org.junit.experimental.theories.DataPoints; import org.junit.experimental.theories.Theories; import org.junit.experimental.theories.Theory; import org.junit.runner.RunWith; import org.mockito.Mock; import org.robobinding.PredefinedPendingAttributesForView; import org.robobinding.attribute.PredefinedMappingsAttribute.ViewMapping; import android.content.Context; import android.content.res.Resources; import com.google.common.collect.Lists; /** * * @since 1.0 * @version $Revision: 1.0 $ * @author Robert Taylor */ @RunWith(Theories.class) public class PredefinedMappingsAttributeTest { private static final String MAPPING_ATTRIBUTE_VALUE = "[text1.text:{property}]"; private static final int TEXT_1_ID = 10, TEXT_2_ID = 20; @DataPoints public static MappingExpectation[] mappingExpections = { attribute("[text1.text:{title}]").shouldMapTo(viewMapping("text1", TEXT_1_ID, "text", "{title}")), attribute("[text2.text:{artist}]").shouldMapTo(viewMapping("text2", TEXT_2_ID, "text", "{artist}")), attribute("[text1.text:{title}, text2.text:{artist}]").shouldMapTo(viewMapping("text1", TEXT_1_ID, "text", "{title}"), viewMapping("text2", TEXT_2_ID, "text", "{artist}")), attribute("[text1.visibility:{titleVisible},text2.enabled:{artistEnabled}]").shouldMapTo( viewMapping("text1", TEXT_1_ID, "visibility", "{titleVisible}"), viewMapping("text2", TEXT_2_ID, "enabled", "{artistEnabled}")) }; @DataPoints public static String[] illegalAttributeValues = { "[text1.text: {title}", "text:{title}", "[text1.text:title]", "[text1.text:{title}],text2.text:{artist}]", "[text1.text:{title},text2..text:{artist}]" }; @Mock Context context; @Mock Resources resources; @Before public void setUp() { initMocks(this); when(context.getResources()).thenReturn(resources); } @Theory @Test(expected = MalformedAttributeException.class) public void whenParsingAnIllegalAttributeValue_thenReject(String illegalAttributeValue) { new PredefinedMappingsAttribute(ITEM_MAPPING, illegalAttributeValue); } @Theory public void shouldParseLegalAttributeValuesCorrectly(MappingExpectation mappingExpectation) { PredefinedMappingsAttribute predefinedMappingsAttribute = new PredefinedMappingsAttribute(ITEM_MAPPING, mappingExpectation.attributeValue); for (ViewMappingData viewMappingData : mappingExpectation.viewMappingData) { when(resources.getIdentifier(viewMappingData.viewName, "id", "android")).thenReturn(viewMappingData.viewId); } Collection<PredefinedPendingAttributesForView> viewMappings = predefinedMappingsAttribute.getViewMappings(context); assertTrue(viewMappings.containsAll(mappingExpectation.expectedViewMappings)); } @Test(expected = MalformedAttributeException.class) public void givenALegalAttributeValue_whenViewCantBeFound_thenThrowException() { PredefinedMappingsAttribute predefinedMappingsAttribute = new PredefinedMappingsAttribute(ITEM_MAPPING, MAPPING_ATTRIBUTE_VALUE); when(resources.getIdentifier("text1", "id", "android")).thenReturn(0); predefinedMappingsAttribute.getViewMappings(context); } private static Attribute attribute(String attributeValue) { return new Attribute(attributeValue); } private static ViewMappingData viewMapping(String viewName, int viewId, String attributeName, String attributeValue) { return new ViewMappingData(viewName, viewId, attributeName, attributeValue); } private static class MappingExpectation { final String attributeValue; final Collection<PredefinedPendingAttributesForView> expectedViewMappings; final ViewMappingData[] viewMappingData; public MappingExpectation(String attributeValue, ViewMappingData[] viewMappings) { this.attributeValue = attributeValue; viewMappingData = viewMappings; this.expectedViewMappings = Lists.newArrayList(); for (ViewMappingData viewMappingData : viewMappings) { expectedViewMappings.add(new ViewMapping(viewMappingData.viewId, viewMappingData.attributeName, viewMappingData.attributeValue)); } } } private static class Attribute { private final String attributeValue; public Attribute(String attributeValue) { this.attributeValue = attributeValue; } public MappingExpectation shouldMapTo(ViewMappingData... viewMappings) { return new MappingExpectation(attributeValue, viewMappings); } } private static class ViewMappingData { private final String viewName; private final int viewId; private final String attributeName; private final String attributeValue; public ViewMappingData(String viewName, int viewId, String attributeName, String attributeValue) { this.viewName = viewName; this.viewId = viewId; this.attributeName = attributeName; this.attributeValue = attributeValue; } } }