blob: 5cac663d7854cc531d9e77206e7014dacfd719d5 [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Eclipse Public License, Version 1.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.eclipse.org/org/documents/epl-v10.php
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.ide.eclipse.adt.internal.editors.layout;
import com.android.SdkConstants;
import com.android.ide.common.api.IAttributeInfo.Format;
import com.android.ide.common.resources.platform.AttributeInfo;
import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
import com.android.ide.eclipse.adt.internal.editors.mock.MockXmlNode;
import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
import com.android.resources.Density;
import org.w3c.dom.Node;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.util.HashMap;
import junit.framework.TestCase;
public class UiElementPullParserTest extends TestCase {
private UiElementNode ui;
private HashMap<String, String> button1Map;
private HashMap<String, String> button2Map;
private HashMap<String, String> textMap;
private TextAttributeDescriptor createTextAttrDesc(String xmlName) {
return new TextAttributeDescriptor(
xmlName, // xmlLocalName
SdkConstants.NS_RESOURCES,
new AttributeInfo(xmlName, Format.STRING_SET)
);
}
@Override
protected void setUp() throws Exception {
// set up some basic descriptors.
// We have button, textview, linear layout, relative layout.
// only the layouts have children (all 4 descriptors possible)
// Also add some dummy attributes.
ElementDescriptor buttonDescriptor = new ElementDescriptor("Button", "Button", "", "",
new AttributeDescriptor[] {
createTextAttrDesc("name"),
createTextAttrDesc("text"),
},
new ElementDescriptor[] {}, false);
ElementDescriptor textDescriptor = new ElementDescriptor("TextView", "TextView", "", "",
new AttributeDescriptor[] {
createTextAttrDesc("name"),
createTextAttrDesc("text"),
},
new ElementDescriptor[] {}, false);
ElementDescriptor linearDescriptor = new ElementDescriptor("LinearLayout", "Linear Layout",
"", "",
new AttributeDescriptor[] {
createTextAttrDesc("orientation"),
},
new ElementDescriptor[] { }, false);
ElementDescriptor relativeDescriptor = new ElementDescriptor("RelativeLayout",
"Relative Layout", "", "",
new AttributeDescriptor[] {
createTextAttrDesc("orientation"),
},
new ElementDescriptor[] { }, false);
ElementDescriptor[] a = new ElementDescriptor[] {
buttonDescriptor, textDescriptor, linearDescriptor, relativeDescriptor
};
linearDescriptor.setChildren(a);
relativeDescriptor.setChildren(a);
// document descriptor
ElementDescriptor rootDescriptor = new ElementDescriptor("root", "", "", "",
new AttributeDescriptor[] { }, a, false);
ui = new UiElementNode(rootDescriptor);
/* create a dummy XML file.
* <LinearLayout android:orientation="vertical">
* <Button android:name="button1" android:text="button1text"/>
* <RelativeLayout android:orientation="toto">
* <Button android:name="button2" android:text="button2text"/>
* <TextView android:name="text1" android:text="text1text"/>
* </RelativeLayout>
* </LinearLayout>
*/
MockXmlNode button1 = new MockXmlNode(null /* namespace */, "Button", Node.ELEMENT_NODE,
null);
button1.addAttributes(SdkConstants.NS_RESOURCES, "name", "button1");
button1.addAttributes(SdkConstants.NS_RESOURCES, "text", "button1text");
// create a map of the attributes we add to the multi-attribute nodes so that
// we can more easily test the values when we parse the XML.
// This is due to some attributes showing in a certain order for a node and in a different
// order in another node. Since the order doesn't matter, we just simplify the test.
button1Map = new HashMap<String, String>();
button1Map.put("name", "button1");
button1Map.put("text", "button1text");
MockXmlNode button2 = new MockXmlNode(null /* namespace */, "Button", Node.ELEMENT_NODE,
null);
button2.addAttributes(SdkConstants.NS_RESOURCES, "name", "button2");
button2.addAttributes(SdkConstants.NS_RESOURCES, "text", "button2text");
button2Map = new HashMap<String, String>();
button2Map.put("name", "button2");
button2Map.put("text", "button2text");
MockXmlNode text = new MockXmlNode(null /* namespace */, "TextView", Node.ELEMENT_NODE,
null);
text.addAttributes(SdkConstants.NS_RESOURCES, "name", "text1");
text.addAttributes(SdkConstants.NS_RESOURCES, "text", "text1text");
textMap = new HashMap<String, String>();
textMap.put("name", "text1");
textMap.put("text", "text1text");
MockXmlNode relative = new MockXmlNode(null /* namespace */, "RelativeLayout",
Node.ELEMENT_NODE, new MockXmlNode[] { button2, text });
relative.addAttributes(SdkConstants.NS_RESOURCES, "orientation", "toto");
MockXmlNode linear = new MockXmlNode(null /* namespace */, "LinearLayout",
Node.ELEMENT_NODE, new MockXmlNode[] { button1, relative });
linear.addAttributes(SdkConstants.NS_RESOURCES, "orientation", "vertical");
MockXmlNode root = new MockXmlNode(null /* namespace */, "root", Node.ELEMENT_NODE,
new MockXmlNode[] { linear });
// put the namespace/prefix in place
root.setPrefix(SdkConstants.NS_RESOURCES, "android");
// load the xml into the UiElementNode
ui.loadFromXmlNode(root);
super.setUp();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
public void testParser() {
try {
// wrap the parser around the ui element node, and start parsing
UiElementPullParser parser = new UiElementPullParser(
ui, // model
false, // explodedView
null, // explodeNodes
Density.MEDIUM, // density (default from ConfigurationComposite)
null // iProject
);
assertEquals(XmlPullParser.START_DOCUMENT, parser.getEventType());
// top level Linear layout
assertEquals(XmlPullParser.START_TAG, parser.next());
assertEquals("LinearLayout", parser.getName());
assertEquals(1, parser.getAttributeCount());
assertEquals("orientation", parser.getAttributeName(0));
assertEquals(SdkConstants.NS_RESOURCES, parser.getAttributeNamespace(0));
assertEquals("android", parser.getAttributePrefix(0));
assertEquals("vertical", parser.getAttributeValue(0));
// Button
assertEquals(XmlPullParser.START_TAG, parser.next());
assertEquals("Button", parser.getName());
assertEquals(2, parser.getAttributeCount());
check(parser, 0, button1Map);
check(parser, 1, button1Map);
// end of button
assertEquals(XmlPullParser.END_TAG, parser.next());
// Relative Layout
assertEquals(XmlPullParser.START_TAG, parser.next());
assertEquals("RelativeLayout", parser.getName());
assertEquals(1, parser.getAttributeCount());
assertEquals("orientation", parser.getAttributeName(0));
assertEquals(SdkConstants.NS_RESOURCES, parser.getAttributeNamespace(0));
assertEquals("android", parser.getAttributePrefix(0));
assertEquals("toto", parser.getAttributeValue(0));
// Button
assertEquals(XmlPullParser.START_TAG, parser.next());
assertEquals("Button", parser.getName());
assertEquals(2, parser.getAttributeCount());
check(parser, 0, button2Map);
check(parser, 1, button2Map);
// end of button
assertEquals(XmlPullParser.END_TAG, parser.next());
// TextView
assertEquals(XmlPullParser.START_TAG, parser.next());
assertEquals("TextView", parser.getName());
assertEquals(2, parser.getAttributeCount());
check(parser, 0, textMap);
check(parser, 1, textMap);
// end of TextView
assertEquals(XmlPullParser.END_TAG, parser.next());
// end of RelativeLayout
assertEquals(XmlPullParser.END_TAG, parser.next());
// end of top level linear layout
assertEquals(XmlPullParser.END_TAG, parser.next());
assertEquals(XmlPullParser.END_DOCUMENT, parser.next());
} catch (XmlPullParserException e) {
e.printStackTrace();
assertTrue(false);
}
}
/**
* Receives a {@link XmlPullParser} at the START_TAG level, and checks the i-th attribute
* to be present in the {@link HashMap} with the proper (name, value)
* @param parser
* @param i
* @param map
*/
private void check(UiElementPullParser parser, int i, HashMap<String, String> map) {
String name = parser.getAttributeName(i);
String value = parser.getAttributeValue(i);
String referenceValue = map.get(name);
assertNotNull(referenceValue);
assertEquals(referenceValue, value);
assertEquals(SdkConstants.NS_RESOURCES, parser.getAttributeNamespace(i));
assertEquals("android", parser.getAttributePrefix(i));
}
}