1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.util; 18 19 import com.android.ide.common.rendering.api.LayoutlibCallback; 20 import com.android.ide.common.rendering.api.RenderResources; 21 import com.android.ide.common.rendering.api.ResourceNamespace; 22 import com.android.ide.common.rendering.api.ResourceNamespace.Resolver; 23 import com.android.layoutlib.bridge.BridgeConstants; 24 import com.android.layoutlib.bridge.android.BridgeContext; 25 26 import org.junit.Test; 27 import org.xmlpull.v1.XmlPullParser; 28 29 import com.google.common.collect.ImmutableMap; 30 31 import static org.junit.Assert.assertEquals; 32 import static org.junit.Assert.assertTrue; 33 import static org.mockito.Mockito.mock; 34 import static org.mockito.Mockito.when; 35 36 public class BridgeXmlPullAttributesTest { 37 38 @Test testGetAttributeIntValueForEnums()39 public void testGetAttributeIntValueForEnums() { 40 RenderResources renderResources = new RenderResources(); 41 42 XmlPullParser parser = mock(XmlPullParser.class); 43 when(parser.getAttributeValue(BridgeConstants.NS_RESOURCES, "layout_width")) 44 .thenReturn("match_parent"); 45 when(parser.getAttributeName(0)).thenReturn("layout_width"); 46 when(parser.getAttributeNamespace(0)).thenReturn(BridgeConstants.NS_RESOURCES); 47 // Return every value twice since there is one test using name and other using index 48 when(parser.getAttributeValue(BridgeConstants.NS_APP_RES_AUTO, "my_custom_attr")) 49 .thenReturn("a", "a", "b", "b", "invalid", "invalid"); 50 when(parser.getAttributeName(1)).thenReturn("my_custom_attr"); 51 when(parser.getAttributeNamespace(1)).thenReturn(BridgeConstants.NS_APP_RES_AUTO); 52 53 BridgeContext context = mock(BridgeContext.class); 54 when(context.getRenderResources()).thenReturn(renderResources); 55 56 LayoutlibCallback callback = mock(LayoutlibCallback.class); 57 when(callback.getImplicitNamespaces()).thenReturn(Resolver.EMPTY_RESOLVER); 58 when(context.getLayoutlibCallback()).thenReturn(callback); 59 60 BridgeXmlPullAttributes attributes = new BridgeXmlPullAttributes( 61 parser, 62 context, 63 ResourceNamespace.RES_AUTO, 64 attrName -> { 65 if ("layout_width".equals(attrName)) { 66 return ImmutableMap.of( 67 "match_parent", 123); 68 } 69 return ImmutableMap.of(); 70 }, 71 (ns, attrName) -> { 72 if ("my_custom_attr".equals(attrName)) { 73 return ImmutableMap.of( 74 "a", 1, 75 "b", 2 76 ); 77 } 78 return ImmutableMap.of(); 79 }); 80 81 // Test a framework defined enum attribute 82 assertEquals(123, attributes.getAttributeIntValue(BridgeConstants.NS_RESOURCES, 83 "layout_width", 500)); 84 assertEquals(123, attributes.getAttributeIntValue(0, 500)); 85 // Test non existing attribute (it should return the default value) 86 assertEquals(500, attributes.getAttributeIntValue(BridgeConstants.NS_RESOURCES, 87 "layout_height", 500)); 88 assertEquals(500, attributes.getAttributeIntValue(2, 500)); 89 90 // Test project defined enum attribute 91 assertEquals(1, attributes.getAttributeIntValue(BridgeConstants.NS_APP_RES_AUTO, 92 "my_custom_attr", 500)); 93 assertEquals(1, attributes.getAttributeIntValue(1, 500)); 94 assertEquals(2, attributes.getAttributeIntValue(BridgeConstants.NS_APP_RES_AUTO, 95 "my_custom_attr", 500)); 96 assertEquals(2, attributes.getAttributeIntValue(1, 500)); 97 // Test an invalid enum 98 boolean exception = false; 99 try { 100 attributes.getAttributeIntValue(BridgeConstants.NS_APP_RES_AUTO, "my_custom_attr", 500); 101 } catch(NumberFormatException e) { 102 exception = true; 103 } 104 assertTrue(exception); 105 exception = false; 106 try { 107 attributes.getAttributeIntValue(1, 500); 108 } catch(NumberFormatException e) { 109 exception = true; 110 } 111 assertTrue(exception); 112 113 // Test non existing project attribute 114 assertEquals(500, attributes.getAttributeIntValue(BridgeConstants.NS_APP_RES_AUTO, 115 "my_other_attr", 500)); 116 } 117 118 } 119