diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestNode.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestNode.java | 477 |
1 files changed, 0 insertions, 477 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestNode.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestNode.java deleted file mode 100644 index 30886e4fa..000000000 --- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestNode.java +++ /dev/null @@ -1,477 +0,0 @@ -/* - * Copyright (C) 2010 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.common.layout; - -import static com.android.SdkConstants.ANDROID_URI; -import static com.android.SdkConstants.ANDROID_WIDGET_PREFIX; -import static com.android.SdkConstants.ATTR_ID; -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertNotNull; -import static junit.framework.Assert.assertTrue; -import static junit.framework.Assert.fail; - -import com.android.annotations.NonNull; -import com.android.annotations.Nullable; -import com.android.ide.common.api.IAttributeInfo; -import com.android.ide.common.api.INode; -import com.android.ide.common.api.INodeHandler; -import com.android.ide.common.api.Margins; -import com.android.ide.common.api.Rect; -import com.android.ide.common.xml.XmlFormatStyle; -import com.android.ide.common.xml.XmlPrettyPrinter; -import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlFormatPreferences; -import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlPrettyPrinter; -import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities; -import com.google.common.base.Splitter; - -import org.w3c.dom.Attr; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; - -import java.io.IOException; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** Test/mock implementation of {@link INode} */ -@SuppressWarnings("javadoc") -public class TestNode implements INode { - private TestNode mParent; - - private final List<TestNode> mChildren = new ArrayList<TestNode>(); - - private final String mFqcn; - - private Rect mBounds = new Rect(); // Invalid bounds initially - - private Map<String, IAttribute> mAttributes = new HashMap<String, IAttribute>(); - - private Map<String, IAttributeInfo> mAttributeInfos = new HashMap<String, IAttributeInfo>(); - - private List<String> mAttributeSources; - - public TestNode(String fqcn) { - this.mFqcn = fqcn; - } - - public TestNode bounds(Rect bounds) { - this.mBounds = bounds; - - return this; - } - - public TestNode id(String id) { - return set(ANDROID_URI, ATTR_ID, id); - } - - public TestNode set(String uri, String name, String value) { - setAttribute(uri, name, value); - - return this; - } - - public TestNode add(TestNode child) { - mChildren.add(child); - child.mParent = this; - - return this; - } - - public TestNode add(TestNode... children) { - for (TestNode child : children) { - mChildren.add(child); - child.mParent = this; - } - - return this; - } - - public static TestNode create(String fcqn) { - return new TestNode(fcqn); - } - - public void removeChild(int index) { - TestNode removed = mChildren.remove(index); - removed.mParent = null; - } - - // ==== INODE ==== - - @Override - public @NonNull INode appendChild(@NonNull String viewFqcn) { - return insertChildAt(viewFqcn, mChildren.size()); - } - - @Override - public void editXml(@NonNull String undoName, @NonNull INodeHandler callback) { - callback.handle(this); - } - - public void putAttributeInfo(String uri, String attrName, IAttributeInfo info) { - mAttributeInfos.put(uri + attrName, info); - } - - @Override - public IAttributeInfo getAttributeInfo(@Nullable String uri, @NonNull String attrName) { - return mAttributeInfos.get(uri + attrName); - } - - @Override - public @NonNull Rect getBounds() { - return mBounds; - } - - @Override - public @NonNull INode[] getChildren() { - return mChildren.toArray(new INode[mChildren.size()]); - } - - @Override - public @NonNull IAttributeInfo[] getDeclaredAttributes() { - return mAttributeInfos.values().toArray(new IAttributeInfo[mAttributeInfos.size()]); - } - - @Override - public @NonNull String getFqcn() { - return mFqcn; - } - - @Override - public @NonNull IAttribute[] getLiveAttributes() { - return mAttributes.values().toArray(new IAttribute[mAttributes.size()]); - } - - @Override - public INode getParent() { - return mParent; - } - - @Override - public INode getRoot() { - TestNode curr = this; - while (curr.mParent != null) { - curr = curr.mParent; - } - - return curr; - } - - @Override - public String getStringAttr(@Nullable String uri, @NonNull String attrName) { - IAttribute attr = mAttributes.get(uri + attrName); - if (attr == null) { - return null; - } - - return attr.getValue(); - } - - @Override - public @NonNull INode insertChildAt(@NonNull String viewFqcn, int index) { - TestNode child = new TestNode(viewFqcn); - if (index == -1) { - mChildren.add(child); - } else { - mChildren.add(index, child); - } - child.mParent = this; - return child; - } - - @Override - public void removeChild(@NonNull INode node) { - int index = mChildren.indexOf(node); - if (index != -1) { - removeChild(index); - } - } - - @Override - public boolean setAttribute(@Nullable String uri, @NonNull String localName, - @Nullable String value) { - mAttributes.put(uri + localName, new TestAttribute(uri, localName, value)); - return true; - } - - @Override - public String toString() { - String id = getStringAttr(ANDROID_URI, ATTR_ID); - return "TestNode [id=" + (id != null ? id : "?") + ", fqn=" + mFqcn + ", infos=" - + mAttributeInfos + ", attributes=" + mAttributes + ", bounds=" + mBounds + "]"; - } - - @Override - public int getBaseline() { - return -1; - } - - @Override - public @NonNull Margins getMargins() { - return null; - } - - @Override - public @NonNull List<String> getAttributeSources() { - return mAttributeSources != null ? mAttributeSources : Collections.<String>emptyList(); - } - - public void setAttributeSources(List<String> attributeSources) { - mAttributeSources = attributeSources; - } - - /** Create a test node from the given XML */ - public static TestNode createFromXml(String xml) { - Document document = DomUtilities.parseDocument(xml, false); - assertNotNull(document); - assertNotNull(document.getDocumentElement()); - - return createFromNode(document.getDocumentElement()); - } - - public static String toXml(TestNode node) { - assertTrue("This method only works with nodes constructed from XML", - node instanceof TestXmlNode); - Document document = ((TestXmlNode) node).mElement.getOwnerDocument(); - // Insert new whitespace nodes etc - String xml = dumpDocument(document); - document = DomUtilities.parseDocument(xml, false); - - XmlPrettyPrinter printer = new EclipseXmlPrettyPrinter(EclipseXmlFormatPreferences.create(), - XmlFormatStyle.LAYOUT, "\n"); - StringBuilder sb = new StringBuilder(1000); - sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); - printer.prettyPrint(-1, document, null, null, sb, false); - return sb.toString(); - } - - @SuppressWarnings("deprecation") - private static String dumpDocument(Document document) { - // Diagnostics: print out the XML that we're about to render - org.apache.xml.serialize.OutputFormat outputFormat = - new org.apache.xml.serialize.OutputFormat( - "XML", "ISO-8859-1", true); //$NON-NLS-1$ //$NON-NLS-2$ - outputFormat.setIndent(2); - outputFormat.setLineWidth(100); - outputFormat.setIndenting(true); - outputFormat.setOmitXMLDeclaration(true); - outputFormat.setOmitDocumentType(true); - StringWriter stringWriter = new StringWriter(); - // Using FQN here to avoid having an import above, which will result - // in a deprecation warning, and there isn't a way to annotate a single - // import element with a SuppressWarnings. - org.apache.xml.serialize.XMLSerializer serializer = - new org.apache.xml.serialize.XMLSerializer(stringWriter, outputFormat); - serializer.setNamespaces(true); - try { - serializer.serialize(document.getDocumentElement()); - return stringWriter.toString(); - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - private static TestNode createFromNode(Element element) { - String fqcn = ANDROID_WIDGET_PREFIX + element.getTagName(); - TestNode node = new TestXmlNode(fqcn, element); - - for (Element child : DomUtilities.getChildren(element)) { - node.add(createFromNode(child)); - } - - return node; - } - - @Nullable - public static TestNode findById(TestNode node, String id) { - id = BaseLayoutRule.stripIdPrefix(id); - return node.findById(id); - } - - private TestNode findById(String targetId) { - String id = getStringAttr(ANDROID_URI, ATTR_ID); - if (id != null && targetId.equals(BaseLayoutRule.stripIdPrefix(id))) { - return this; - } - - for (TestNode child : mChildren) { - TestNode result = child.findById(targetId); - if (result != null) { - return result; - } - } - - return null; - } - - private static String getTagName(String fqcn) { - return fqcn.substring(fqcn.lastIndexOf('.') + 1); - } - - private static class TestXmlNode extends TestNode { - private final Element mElement; - - public TestXmlNode(String fqcn, Element element) { - super(fqcn); - mElement = element; - } - - @Override - public @NonNull IAttribute[] getLiveAttributes() { - List<IAttribute> result = new ArrayList<IAttribute>(); - - NamedNodeMap attributes = mElement.getAttributes(); - for (int i = 0, n = attributes.getLength(); i < n; i++) { - Attr attribute = (Attr) attributes.item(i); - result.add(new TestXmlAttribute(attribute)); - } - return result.toArray(new IAttribute[result.size()]); - } - - @Override - public boolean setAttribute(String uri, String localName, String value) { - if (value == null) { - mElement.removeAttributeNS(uri, localName); - } else { - mElement.setAttributeNS(uri, localName, value); - } - return super.setAttribute(uri, localName, value); - } - - @Override - public INode appendChild(String viewFqcn) { - Element child = mElement.getOwnerDocument().createElement(getTagName(viewFqcn)); - mElement.appendChild(child); - return new TestXmlNode(viewFqcn, child); - } - - @Override - public INode insertChildAt(String viewFqcn, int index) { - if (index == -1) { - return appendChild(viewFqcn); - } - Element child = mElement.getOwnerDocument().createElement(getTagName(viewFqcn)); - List<Element> children = DomUtilities.getChildren(mElement); - if (children.size() >= index) { - Element before = children.get(index); - mElement.insertBefore(child, before); - } else { - fail("Unexpected index"); - mElement.appendChild(child); - } - return new TestXmlNode(viewFqcn, child); - } - - @Override - public String getStringAttr(String uri, String name) { - String value; - if (uri == null) { - value = mElement.getAttribute(name); - } else { - value = mElement.getAttributeNS(uri, name); - } - if (value.isEmpty()) { - value = null; - } - - return value; - } - - @Override - public void removeChild(INode node) { - assert node instanceof TestXmlNode; - mElement.removeChild(((TestXmlNode) node).mElement); - } - - @Override - public void removeChild(int index) { - List<Element> children = DomUtilities.getChildren(mElement); - assertTrue(index < children.size()); - Element oldChild = children.get(index); - mElement.removeChild(oldChild); - } - } - - public static class TestXmlAttribute implements IAttribute { - private Attr mAttribute; - - public TestXmlAttribute(Attr attribute) { - this.mAttribute = attribute; - } - - @Override - public String getUri() { - return mAttribute.getNamespaceURI(); - } - - @Override - public String getName() { - String name = mAttribute.getLocalName(); - if (name == null) { - name = mAttribute.getName(); - } - return name; - } - - @Override - public String getValue() { - return mAttribute.getValue(); - } - } - - // Recursively initialize this node with the bounds specified in the given hierarchy - // dump (from ViewHierarchy's DUMP_INFO flag - public void assignBounds(String bounds) { - Iterable<String> split = Splitter.on('\n').trimResults().split(bounds); - assignBounds(split.iterator()); - } - - private void assignBounds(Iterator<String> iterator) { - assertTrue(iterator.hasNext()); - String desc = iterator.next(); - - Pattern pattern = Pattern.compile("^\\s*(.+)\\s+\\[(.+)\\]\\s*(<.+>)?\\s*(\\S+)?\\s*$"); - Matcher matcher = pattern.matcher(desc); - assertTrue(matcher.matches()); - String fqn = matcher.group(1); - assertEquals(getFqcn(), fqn); - String boundsString = matcher.group(2); - String[] bounds = boundsString.split(","); - assertEquals(boundsString, 4, bounds.length); - try { - int left = Integer.parseInt(bounds[0]); - int top = Integer.parseInt(bounds[1]); - int right = Integer.parseInt(bounds[2]); - int bottom = Integer.parseInt(bounds[3]); - mBounds = new Rect(left, top, right - left, bottom - top); - } catch (NumberFormatException nufe) { - fail(nufe.getLocalizedMessage()); - } - String tag = matcher.group(3); - - for (INode child : getChildren()) { - assertTrue(iterator.hasNext()); - ((TestNode) child).assignBounds(iterator); - } - } -} |