aboutsummaryrefslogtreecommitdiffstats
path: root/common/src
diff options
context:
space:
mode:
Diffstat (limited to 'common/src')
-rw-r--r--common/src/main/java/com/android/SdkConstants.java (renamed from common/src/com/android/SdkConstants.java)0
-rw-r--r--common/src/main/java/com/android/annotations/NonNull.java (renamed from common/src/com/android/annotations/NonNull.java)0
-rw-r--r--common/src/main/java/com/android/annotations/NonNullByDefault.java (renamed from common/src/com/android/annotations/NonNullByDefault.java)0
-rwxr-xr-xcommon/src/main/java/com/android/annotations/Nullable.java (renamed from common/src/com/android/annotations/Nullable.java)0
-rwxr-xr-xcommon/src/main/java/com/android/annotations/VisibleForTesting.java (renamed from common/src/com/android/annotations/VisibleForTesting.java)0
-rw-r--r--common/src/main/java/com/android/io/FileWrapper.java (renamed from common/src/com/android/io/FileWrapper.java)0
-rw-r--r--common/src/main/java/com/android/io/FolderWrapper.java (renamed from common/src/com/android/io/FolderWrapper.java)0
-rw-r--r--common/src/main/java/com/android/io/IAbstractFile.java (renamed from common/src/com/android/io/IAbstractFile.java)0
-rw-r--r--common/src/main/java/com/android/io/IAbstractFolder.java (renamed from common/src/com/android/io/IAbstractFolder.java)0
-rw-r--r--common/src/main/java/com/android/io/IAbstractResource.java (renamed from common/src/com/android/io/IAbstractResource.java)0
-rw-r--r--common/src/main/java/com/android/io/StreamException.java (renamed from common/src/com/android/io/StreamException.java)0
-rw-r--r--common/src/main/java/com/android/prefs/AndroidLocation.java (renamed from common/src/com/android/prefs/AndroidLocation.java)0
-rw-r--r--common/src/main/java/com/android/utils/ILogger.java (renamed from common/src/com/android/utils/ILogger.java)0
-rw-r--r--common/src/main/java/com/android/utils/NullLogger.java (renamed from common/src/com/android/utils/NullLogger.java)0
-rw-r--r--common/src/main/java/com/android/utils/Pair.java (renamed from common/src/com/android/utils/Pair.java)0
-rw-r--r--common/src/main/java/com/android/utils/PositionXmlParser.java (renamed from common/src/com/android/utils/PositionXmlParser.java)0
-rw-r--r--common/src/main/java/com/android/utils/SdkUtils.java (renamed from common/src/com/android/utils/SdkUtils.java)0
-rw-r--r--common/src/main/java/com/android/utils/StdLogger.java (renamed from common/src/com/android/utils/StdLogger.java)0
-rw-r--r--common/src/main/java/com/android/utils/XmlUtils.java (renamed from common/src/com/android/utils/XmlUtils.java)0
-rw-r--r--common/src/main/java/com/android/xml/AndroidManifest.java (renamed from common/src/com/android/xml/AndroidManifest.java)0
-rw-r--r--common/src/main/java/com/android/xml/AndroidXPathFactory.java (renamed from common/src/com/android/xml/AndroidXPathFactory.java)0
-rw-r--r--common/src/test/.classpath9
-rw-r--r--common/src/test/.project17
-rw-r--r--common/src/test/java/com/android/utils/PositionXmlParserTest.java322
-rw-r--r--common/src/test/java/com/android/utils/SdkUtilsTest.java133
-rw-r--r--common/src/test/java/com/android/utils/XmlUtilsTest.java116
26 files changed, 597 insertions, 0 deletions
diff --git a/common/src/com/android/SdkConstants.java b/common/src/main/java/com/android/SdkConstants.java
index 48cecc1..48cecc1 100644
--- a/common/src/com/android/SdkConstants.java
+++ b/common/src/main/java/com/android/SdkConstants.java
diff --git a/common/src/com/android/annotations/NonNull.java b/common/src/main/java/com/android/annotations/NonNull.java
index 973ebb6..973ebb6 100644
--- a/common/src/com/android/annotations/NonNull.java
+++ b/common/src/main/java/com/android/annotations/NonNull.java
diff --git a/common/src/com/android/annotations/NonNullByDefault.java b/common/src/main/java/com/android/annotations/NonNullByDefault.java
index 3db891c..3db891c 100644
--- a/common/src/com/android/annotations/NonNullByDefault.java
+++ b/common/src/main/java/com/android/annotations/NonNullByDefault.java
diff --git a/common/src/com/android/annotations/Nullable.java b/common/src/main/java/com/android/annotations/Nullable.java
index d9c3861..d9c3861 100755
--- a/common/src/com/android/annotations/Nullable.java
+++ b/common/src/main/java/com/android/annotations/Nullable.java
diff --git a/common/src/com/android/annotations/VisibleForTesting.java b/common/src/main/java/com/android/annotations/VisibleForTesting.java
index 7f41d70..7f41d70 100755
--- a/common/src/com/android/annotations/VisibleForTesting.java
+++ b/common/src/main/java/com/android/annotations/VisibleForTesting.java
diff --git a/common/src/com/android/io/FileWrapper.java b/common/src/main/java/com/android/io/FileWrapper.java
index 8be7859..8be7859 100644
--- a/common/src/com/android/io/FileWrapper.java
+++ b/common/src/main/java/com/android/io/FileWrapper.java
diff --git a/common/src/com/android/io/FolderWrapper.java b/common/src/main/java/com/android/io/FolderWrapper.java
index c29c934..c29c934 100644
--- a/common/src/com/android/io/FolderWrapper.java
+++ b/common/src/main/java/com/android/io/FolderWrapper.java
diff --git a/common/src/com/android/io/IAbstractFile.java b/common/src/main/java/com/android/io/IAbstractFile.java
index 6dfc8d8..6dfc8d8 100644
--- a/common/src/com/android/io/IAbstractFile.java
+++ b/common/src/main/java/com/android/io/IAbstractFile.java
diff --git a/common/src/com/android/io/IAbstractFolder.java b/common/src/main/java/com/android/io/IAbstractFolder.java
index 8335ef9..8335ef9 100644
--- a/common/src/com/android/io/IAbstractFolder.java
+++ b/common/src/main/java/com/android/io/IAbstractFolder.java
diff --git a/common/src/com/android/io/IAbstractResource.java b/common/src/main/java/com/android/io/IAbstractResource.java
index e6358ec..e6358ec 100644
--- a/common/src/com/android/io/IAbstractResource.java
+++ b/common/src/main/java/com/android/io/IAbstractResource.java
diff --git a/common/src/com/android/io/StreamException.java b/common/src/main/java/com/android/io/StreamException.java
index 9f632f4..9f632f4 100644
--- a/common/src/com/android/io/StreamException.java
+++ b/common/src/main/java/com/android/io/StreamException.java
diff --git a/common/src/com/android/prefs/AndroidLocation.java b/common/src/main/java/com/android/prefs/AndroidLocation.java
index 6af8e9b..6af8e9b 100644
--- a/common/src/com/android/prefs/AndroidLocation.java
+++ b/common/src/main/java/com/android/prefs/AndroidLocation.java
diff --git a/common/src/com/android/utils/ILogger.java b/common/src/main/java/com/android/utils/ILogger.java
index 7df5d10..7df5d10 100644
--- a/common/src/com/android/utils/ILogger.java
+++ b/common/src/main/java/com/android/utils/ILogger.java
diff --git a/common/src/com/android/utils/NullLogger.java b/common/src/main/java/com/android/utils/NullLogger.java
index 8b1a3d9..8b1a3d9 100644
--- a/common/src/com/android/utils/NullLogger.java
+++ b/common/src/main/java/com/android/utils/NullLogger.java
diff --git a/common/src/com/android/utils/Pair.java b/common/src/main/java/com/android/utils/Pair.java
index 63694de..63694de 100644
--- a/common/src/com/android/utils/Pair.java
+++ b/common/src/main/java/com/android/utils/Pair.java
diff --git a/common/src/com/android/utils/PositionXmlParser.java b/common/src/main/java/com/android/utils/PositionXmlParser.java
index 73574d5..73574d5 100644
--- a/common/src/com/android/utils/PositionXmlParser.java
+++ b/common/src/main/java/com/android/utils/PositionXmlParser.java
diff --git a/common/src/com/android/utils/SdkUtils.java b/common/src/main/java/com/android/utils/SdkUtils.java
index 160f95d..160f95d 100644
--- a/common/src/com/android/utils/SdkUtils.java
+++ b/common/src/main/java/com/android/utils/SdkUtils.java
diff --git a/common/src/com/android/utils/StdLogger.java b/common/src/main/java/com/android/utils/StdLogger.java
index 05eb456..05eb456 100644
--- a/common/src/com/android/utils/StdLogger.java
+++ b/common/src/main/java/com/android/utils/StdLogger.java
diff --git a/common/src/com/android/utils/XmlUtils.java b/common/src/main/java/com/android/utils/XmlUtils.java
index 0969eb1..0969eb1 100644
--- a/common/src/com/android/utils/XmlUtils.java
+++ b/common/src/main/java/com/android/utils/XmlUtils.java
diff --git a/common/src/com/android/xml/AndroidManifest.java b/common/src/main/java/com/android/xml/AndroidManifest.java
index 306471e..306471e 100644
--- a/common/src/com/android/xml/AndroidManifest.java
+++ b/common/src/main/java/com/android/xml/AndroidManifest.java
diff --git a/common/src/com/android/xml/AndroidXPathFactory.java b/common/src/main/java/com/android/xml/AndroidXPathFactory.java
index ee5b87b..ee5b87b 100644
--- a/common/src/com/android/xml/AndroidXPathFactory.java
+++ b/common/src/main/java/com/android/xml/AndroidXPathFactory.java
diff --git a/common/src/test/.classpath b/common/src/test/.classpath
new file mode 100644
index 0000000..7564f2f
--- /dev/null
+++ b/common/src/test/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="java"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/common"/>
+ <classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/guava-tools/guava-13.0.1.jar" sourcepath="/ANDROID_SRC/prebuilts/tools/common/guava-tools/src.zip"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/common/src/test/.project b/common/src/test/.project
new file mode 100644
index 0000000..9f550a3
--- /dev/null
+++ b/common/src/test/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>common-tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/common/src/test/java/com/android/utils/PositionXmlParserTest.java b/common/src/test/java/com/android/utils/PositionXmlParserTest.java
new file mode 100644
index 0000000..18eda43
--- /dev/null
+++ b/common/src/test/java/com/android/utils/PositionXmlParserTest.java
@@ -0,0 +1,322 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.utils;
+
+import com.android.utils.PositionXmlParser.Position;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+import java.io.BufferedOutputStream;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+
+import junit.framework.TestCase;
+
+@SuppressWarnings("javadoc")
+public class PositionXmlParserTest extends TestCase {
+ public void test() throws Exception {
+ String xml =
+ "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
+ "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
+ " android:layout_width=\"match_parent\"\n" +
+ " android:layout_height=\"wrap_content\"\n" +
+ " android:orientation=\"vertical\" >\n" +
+ "\n" +
+ " <Button\n" +
+ " android:id=\"@+id/button1\"\n" +
+ " android:layout_width=\"wrap_content\"\n" +
+ " android:layout_height=\"wrap_content\"\n" +
+ " android:text=\"Button\" />\n" +
+ "\n" +
+ " <Button\n" +
+ " android:id=\"@+id/button2\"\n" +
+ " android:layout_width=\"wrap_content\"\n" +
+ " android:layout_height=\"wrap_content\"\n" +
+ " android:text=\"Button\" />\n" +
+ "\n" +
+ "</LinearLayout>\n";
+ PositionXmlParser parser = new PositionXmlParser();
+ File file = File.createTempFile("parsertest", ".xml");
+ Writer fw = new BufferedWriter(new FileWriter(file));
+ fw.write(xml);
+ fw.close();
+ Document document = parser.parse(new FileInputStream(file));
+ assertNotNull(document);
+
+ // Basic parsing heart beat tests
+ Element linearLayout = (Element) document.getElementsByTagName("LinearLayout").item(0);
+ assertNotNull(linearLayout);
+ NodeList buttons = document.getElementsByTagName("Button");
+ assertEquals(2, buttons.getLength());
+ final String ANDROID_URI = "http://schemas.android.com/apk/res/android";
+ assertEquals("wrap_content",
+ linearLayout.getAttributeNS(ANDROID_URI, "layout_height"));
+
+ // Check attribute positions
+ Attr attr = linearLayout.getAttributeNodeNS(ANDROID_URI, "layout_width");
+ assertNotNull(attr);
+ Position start = parser.getPosition(attr);
+ Position end = start.getEnd();
+ assertEquals(2, start.getLine());
+ assertEquals(4, start.getColumn());
+ assertEquals(xml.indexOf("android:layout_width"), start.getOffset());
+ assertEquals(2, end.getLine());
+ String target = "android:layout_width=\"match_parent\"";
+ assertEquals(xml.indexOf(target) + target.length(), end.getOffset());
+
+ // Check element positions
+ Element button = (Element) buttons.item(0);
+ start = parser.getPosition(button);
+ end = start.getEnd();
+ assertNull(end.getEnd());
+ assertEquals(6, start.getLine());
+ assertEquals(4, start.getColumn());
+ assertEquals(xml.indexOf("<Button"), start.getOffset());
+ assertEquals(xml.indexOf("/>") + 2, end.getOffset());
+ assertEquals(10, end.getLine());
+ int button1End = end.getOffset();
+
+ Element button2 = (Element) buttons.item(1);
+ start = parser.getPosition(button2);
+ end = start.getEnd();
+ assertEquals(12, start.getLine());
+ assertEquals(4, start.getColumn());
+ assertEquals(xml.indexOf("<Button", button1End), start.getOffset());
+ assertEquals(xml.indexOf("/>", start.getOffset()) + 2, end.getOffset());
+ assertEquals(16, end.getLine());
+
+ file.delete();
+ }
+
+ public void testText() throws Exception {
+ String xml =
+ "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
+ "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
+ " android:layout_width=\"match_parent\"\n" +
+ " android:layout_height=\"wrap_content\"\n" +
+ " android:orientation=\"vertical\" >\n" +
+ "\n" +
+ " <Button\n" +
+ " android:id=\"@+id/button1\"\n" +
+ " android:layout_width=\"wrap_content\"\n" +
+ " android:layout_height=\"wrap_content\"\n" +
+ " android:text=\"Button\" />\n" +
+ " some text\n" +
+ "\n" +
+ "</LinearLayout>\n";
+ PositionXmlParser parser = new PositionXmlParser();
+ File file = File.createTempFile("parsertest", ".xml");
+ file.deleteOnExit();
+ Writer fw = new BufferedWriter(new FileWriter(file));
+ fw.write(xml);
+ fw.close();
+ Document document = parser.parse(new FileInputStream(file));
+ assertNotNull(document);
+
+ // Basic parsing heart beat tests
+ Element linearLayout = (Element) document.getElementsByTagName("LinearLayout").item(0);
+ assertNotNull(linearLayout);
+ NodeList buttons = document.getElementsByTagName("Button");
+ assertEquals(1, buttons.getLength());
+ final String ANDROID_URI = "http://schemas.android.com/apk/res/android";
+ assertEquals("wrap_content",
+ linearLayout.getAttributeNS(ANDROID_URI, "layout_height"));
+
+ // Check text positions
+ Element button = (Element) buttons.item(0);
+ Text text = (Text) button.getNextSibling();
+ assertNotNull(text);
+
+ // Check attribute positions
+ Position start = parser.getPosition(text);
+ assertEquals(11, start.getLine());
+ assertEquals(10, start.getColumn());
+ assertEquals(xml.indexOf("some text"), start.getOffset());
+
+ // Check attribute positions with text node offsets
+ start = parser.getPosition(text, 13, 15);
+ assertEquals(11, start.getLine());
+ assertEquals(12, start.getColumn());
+ assertEquals(xml.indexOf("me"), start.getOffset());
+ }
+
+ public void testLineEndings() throws Exception {
+ // Test for http://code.google.com/p/android/issues/detail?id=22925
+ String xml =
+ "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" +
+ "<LinearLayout>\r\n" +
+ "\r" +
+ "<LinearLayout></LinearLayout>\r\n" +
+ "</LinearLayout>\r\n";
+ PositionXmlParser parser = new PositionXmlParser();
+ File file = File.createTempFile("parsertest2", ".xml");
+ Writer fw = new BufferedWriter(new FileWriter(file));
+ fw.write(xml);
+ fw.close();
+ Document document = parser.parse(new FileInputStream(file));
+ assertNotNull(document);
+
+ file.delete();
+ }
+
+ private static void checkEncoding(String encoding, boolean writeBom, boolean writeEncoding,
+ String lineEnding)
+ throws Exception {
+ // Norwegian extra vowel characters such as "latin small letter a with ring above"
+ String value = "\u00e6\u00d8\u00e5";
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("<?xml version=\"1.0\"");
+ if (writeEncoding) {
+ sb.append(" encoding=\"");
+ sb.append(encoding);
+ sb.append("\"");
+ }
+ sb.append("?>");
+ sb.append(lineEnding);
+ sb.append(
+ "<!-- This is a " + lineEnding +
+ " multiline comment" + lineEnding +
+ "-->" + lineEnding +
+ "<foo ");
+ int startAttrOffset = sb.length();
+ sb.append("attr=\"");
+ sb.append(value);
+ sb.append("\"");
+ sb.append(">" + lineEnding +
+ lineEnding +
+ "<bar></bar>" + lineEnding +
+ "</foo>" + lineEnding);
+ PositionXmlParser parser = new PositionXmlParser();
+ File file = File.createTempFile("parsertest" + encoding + writeBom + writeEncoding,
+ ".xml");
+ BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(file));
+ OutputStreamWriter writer = new OutputStreamWriter(stream, encoding);
+
+ if (writeBom) {
+ String normalized = encoding.toLowerCase().replace("-", "_");
+ if (normalized.equals("utf_8")) {
+ stream.write(0xef);
+ stream.write(0xbb);
+ stream.write(0xbf);
+ } else if (normalized.equals("utf_16")) {
+ stream.write(0xfe);
+ stream.write(0xff);
+ } else if (normalized.equals("utf_16le")) {
+ stream.write(0xff);
+ stream.write(0xfe);
+ } else if (normalized.equals("utf_32")) {
+ stream.write(0x0);
+ stream.write(0x0);
+ stream.write(0xfe);
+ stream.write(0xff);
+ } else if (normalized.equals("utf_32le")) {
+ stream.write(0xff);
+ stream.write(0xfe);
+ stream.write(0x0);
+ stream.write(0x0);
+ } else {
+ fail("Can't write BOM for encoding " + encoding);
+ }
+ }
+
+ writer.write(sb.toString());
+ writer.close();
+
+ Document document = parser.parse(new FileInputStream(file));
+ assertNotNull(document);
+ Element root = document.getDocumentElement();
+ assertEquals(file.getPath(), value, root.getAttribute("attr"));
+ assertEquals(4, parser.getPosition(root).getLine());
+
+ Attr attribute = root.getAttributeNode("attr");
+ assertNotNull(attribute);
+ Position position = parser.getPosition(attribute);
+ assertNotNull(position);
+ assertEquals(4, position.getLine());
+ assertEquals(startAttrOffset, position.getOffset());
+
+ file.delete();
+ }
+
+ public void testEncoding() throws Exception {
+ checkEncoding("utf-8", false /*bom*/, true /*encoding*/, "\n");
+ checkEncoding("UTF-8", false /*bom*/, true /*encoding*/, "\n");
+ checkEncoding("UTF_16", false /*bom*/, true /*encoding*/, "\n");
+ checkEncoding("UTF-16", false /*bom*/, true /*encoding*/, "\n");
+ checkEncoding("UTF_16LE", false /*bom*/, true /*encoding*/, "\n");
+ checkEncoding("UTF_32", false /*bom*/, true /*encoding*/, "\n");
+ checkEncoding("UTF_32LE", false /*bom*/, true /*encoding*/, "\n");
+ checkEncoding("windows-1252", false /*bom*/, true /*encoding*/, "\n");
+ checkEncoding("MacRoman", false /*bom*/, true /*encoding*/, "\n");
+ checkEncoding("ISO-8859-1", false /*bom*/, true /*encoding*/, "\n");
+ checkEncoding("iso-8859-1", false /*bom*/, true /*encoding*/, "\n");
+
+ // Try BOM's (with no encoding specified)
+ checkEncoding("utf-8", true /*bom*/, false /*encoding*/, "\n");
+ checkEncoding("UTF-8", true /*bom*/, false /*encoding*/, "\n");
+ checkEncoding("UTF_16", true /*bom*/, false /*encoding*/, "\n");
+ checkEncoding("UTF-16", true /*bom*/, false /*encoding*/, "\n");
+ checkEncoding("UTF_16LE", true /*bom*/, false /*encoding*/, "\n");
+ checkEncoding("UTF_32", true /*bom*/, false /*encoding*/, "\n");
+ checkEncoding("UTF_32LE", true /*bom*/, false /*encoding*/, "\n");
+
+ // Try default encodings (only defined for utf-8 and utf-16)
+ checkEncoding("utf-8", false /*bom*/, false /*encoding*/, "\n");
+ checkEncoding("UTF-8", false /*bom*/, false /*encoding*/, "\n");
+ checkEncoding("UTF_16", false /*bom*/, false /*encoding*/, "\n");
+ checkEncoding("UTF-16", false /*bom*/, false /*encoding*/, "\n");
+ checkEncoding("UTF_16LE", false /*bom*/, false /*encoding*/, "\n");
+
+ // Try BOM's (with explicit encoding specified)
+ checkEncoding("utf-8", true /*bom*/, true /*encoding*/, "\n");
+ checkEncoding("UTF-8", true /*bom*/, true /*encoding*/, "\n");
+ checkEncoding("UTF_16", true /*bom*/, true /*encoding*/, "\n");
+ checkEncoding("UTF-16", true /*bom*/, true /*encoding*/, "\n");
+ checkEncoding("UTF_16LE", true /*bom*/, true /*encoding*/, "\n");
+ checkEncoding("UTF_32", true /*bom*/, true /*encoding*/, "\n");
+ checkEncoding("UTF_32LE", true /*bom*/, true /*encoding*/, "\n");
+
+ // Make sure this works for \r and \r\n as well
+ checkEncoding("UTF-16", false /*bom*/, true /*encoding*/, "\r");
+ checkEncoding("UTF_16LE", false /*bom*/, true /*encoding*/, "\r");
+ checkEncoding("UTF_32", false /*bom*/, true /*encoding*/, "\r");
+ checkEncoding("UTF_32LE", false /*bom*/, true /*encoding*/, "\r");
+ checkEncoding("windows-1252", false /*bom*/, true /*encoding*/, "\r");
+ checkEncoding("MacRoman", false /*bom*/, true /*encoding*/, "\r");
+ checkEncoding("ISO-8859-1", false /*bom*/, true /*encoding*/, "\r");
+ checkEncoding("iso-8859-1", false /*bom*/, true /*encoding*/, "\r");
+
+ checkEncoding("UTF-16", false /*bom*/, true /*encoding*/, "\r\n");
+ checkEncoding("UTF_16LE", false /*bom*/, true /*encoding*/, "\r\n");
+ checkEncoding("UTF_32", false /*bom*/, true /*encoding*/, "\r\n");
+ checkEncoding("UTF_32LE", false /*bom*/, true /*encoding*/, "\r\n");
+ checkEncoding("windows-1252", false /*bom*/, true /*encoding*/, "\r\n");
+ checkEncoding("MacRoman", false /*bom*/, true /*encoding*/, "\r\n");
+ checkEncoding("ISO-8859-1", false /*bom*/, true /*encoding*/, "\r\n");
+ checkEncoding("iso-8859-1", false /*bom*/, true /*encoding*/, "\r\n");
+ }
+}
diff --git a/common/src/test/java/com/android/utils/SdkUtilsTest.java b/common/src/test/java/com/android/utils/SdkUtilsTest.java
new file mode 100644
index 0000000..030e1b7
--- /dev/null
+++ b/common/src/test/java/com/android/utils/SdkUtilsTest.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.utils;
+
+import junit.framework.TestCase;
+
+@SuppressWarnings("javadoc")
+public class SdkUtilsTest extends TestCase {
+ public void testEndsWithIgnoreCase() {
+ assertTrue(SdkUtils.endsWithIgnoreCase("foo", "foo"));
+ assertTrue(SdkUtils.endsWithIgnoreCase("foo", "Foo"));
+ assertTrue(SdkUtils.endsWithIgnoreCase("foo", "foo"));
+ assertTrue(SdkUtils.endsWithIgnoreCase("Barfoo", "foo"));
+ assertTrue(SdkUtils.endsWithIgnoreCase("BarFoo", "foo"));
+ assertTrue(SdkUtils.endsWithIgnoreCase("BarFoo", "foO"));
+
+ assertFalse(SdkUtils.endsWithIgnoreCase("foob", "foo"));
+ assertFalse(SdkUtils.endsWithIgnoreCase("foo", "fo"));
+ }
+
+ public void testStartsWithIgnoreCase() {
+ assertTrue(SdkUtils.startsWithIgnoreCase("foo", "foo"));
+ assertTrue(SdkUtils.startsWithIgnoreCase("foo", "Foo"));
+ assertTrue(SdkUtils.startsWithIgnoreCase("foo", "foo"));
+ assertTrue(SdkUtils.startsWithIgnoreCase("barfoo", "bar"));
+ assertTrue(SdkUtils.startsWithIgnoreCase("BarFoo", "bar"));
+ assertTrue(SdkUtils.startsWithIgnoreCase("BarFoo", "bAr"));
+
+ assertFalse(SdkUtils.startsWithIgnoreCase("bfoo", "foo"));
+ assertFalse(SdkUtils.startsWithIgnoreCase("fo", "foo"));
+ }
+
+ public void testStartsWith() {
+ assertTrue(SdkUtils.startsWith("foo", 0, "foo"));
+ assertTrue(SdkUtils.startsWith("foo", 0, "Foo"));
+ assertTrue(SdkUtils.startsWith("Foo", 0, "foo"));
+ assertTrue(SdkUtils.startsWith("aFoo", 1, "foo"));
+
+ assertFalse(SdkUtils.startsWith("aFoo", 0, "foo"));
+ assertFalse(SdkUtils.startsWith("aFoo", 2, "foo"));
+ }
+
+ public void testEndsWith() {
+ assertTrue(SdkUtils.endsWith("foo", "foo"));
+ assertTrue(SdkUtils.endsWith("foobar", "obar"));
+ assertTrue(SdkUtils.endsWith("foobar", "bar"));
+ assertTrue(SdkUtils.endsWith("foobar", "ar"));
+ assertTrue(SdkUtils.endsWith("foobar", "r"));
+ assertTrue(SdkUtils.endsWith("foobar", ""));
+
+ assertTrue(SdkUtils.endsWith(new StringBuilder("foobar"), "bar"));
+ assertTrue(SdkUtils.endsWith(new StringBuilder("foobar"), new StringBuffer("obar")));
+ assertTrue(SdkUtils.endsWith("foobar", new StringBuffer("obar")));
+
+ assertFalse(SdkUtils.endsWith("foo", "fo"));
+ assertFalse(SdkUtils.endsWith("foobar", "Bar"));
+ assertFalse(SdkUtils.endsWith("foobar", "longfoobar"));
+ }
+
+ public void testEndsWith2() {
+ assertTrue(SdkUtils.endsWith("foo", "foo".length(), "foo"));
+ assertTrue(SdkUtils.endsWith("foo", "fo".length(), "fo"));
+ assertTrue(SdkUtils.endsWith("foo", "f".length(), "f"));
+ }
+
+ public void testStripWhitespace() {
+ assertEquals("foo", SdkUtils.stripWhitespace("foo"));
+ assertEquals("foobar", SdkUtils.stripWhitespace("foo bar"));
+ assertEquals("foobar", SdkUtils.stripWhitespace(" foo bar \n\t"));
+ }
+
+ public void testWrap() {
+ String s =
+ "Hardcoding text attributes directly in layout files is bad for several reasons:\n" +
+ "\n" +
+ "* When creating configuration variations (for example for landscape or portrait)" +
+ "you have to repeat the actual text (and keep it up to date when making changes)\n" +
+ "\n" +
+ "* The application cannot be translated to other languages by just adding new " +
+ "translations for existing string resources.";
+ String wrapped = SdkUtils.wrap(s, 70, "");
+ assertEquals(
+ "Hardcoding text attributes directly in layout files is bad for several\n" +
+ "reasons:\n" +
+ "\n" +
+ "* When creating configuration variations (for example for landscape or\n" +
+ "portrait)you have to repeat the actual text (and keep it up to date\n" +
+ "when making changes)\n" +
+ "\n" +
+ "* The application cannot be translated to other languages by just\n" +
+ "adding new translations for existing string resources.\n",
+ wrapped);
+ }
+
+ public void testWrapPrefix() {
+ String s =
+ "Hardcoding text attributes directly in layout files is bad for several reasons:\n" +
+ "\n" +
+ "* When creating configuration variations (for example for landscape or portrait)" +
+ "you have to repeat the actual text (and keep it up to date when making changes)\n" +
+ "\n" +
+ "* The application cannot be translated to other languages by just adding new " +
+ "translations for existing string resources.";
+ String wrapped = SdkUtils.wrap(s, 70, " ");
+ assertEquals(
+ "Hardcoding text attributes directly in layout files is bad for several\n" +
+ " reasons:\n" +
+ " \n" +
+ " * When creating configuration variations (for example for\n" +
+ " landscape or portrait)you have to repeat the actual text (and keep\n" +
+ " it up to date when making changes)\n" +
+ " \n" +
+ " * The application cannot be translated to other languages by just\n" +
+ " adding new translations for existing string resources.\n",
+ wrapped);
+ }
+
+
+}
diff --git a/common/src/test/java/com/android/utils/XmlUtilsTest.java b/common/src/test/java/com/android/utils/XmlUtilsTest.java
new file mode 100644
index 0000000..0e9289b
--- /dev/null
+++ b/common/src/test/java/com/android/utils/XmlUtilsTest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.utils;
+
+import static com.android.SdkConstants.XMLNS;
+
+import com.android.SdkConstants;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import junit.framework.TestCase;
+
+@SuppressWarnings("javadoc")
+public class XmlUtilsTest extends TestCase {
+ public void testlookupNamespacePrefix() throws Exception {
+ // Setup
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setNamespaceAware(true);
+ factory.setValidating(false);
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ Document document = builder.newDocument();
+ Element rootElement = document.createElement("root");
+ Attr attr = document.createAttributeNS(SdkConstants.XMLNS_URI,
+ "xmlns:customPrefix");
+ attr.setValue(SdkConstants.ANDROID_URI);
+ rootElement.getAttributes().setNamedItemNS(attr);
+ document.appendChild(rootElement);
+ Element root = document.getDocumentElement();
+ root.appendChild(document.createTextNode(" "));
+ Element foo = document.createElement("foo");
+ root.appendChild(foo);
+ root.appendChild(document.createTextNode(" "));
+ Element bar = document.createElement("bar");
+ root.appendChild(bar);
+ Element baz = document.createElement("baz");
+ root.appendChild(baz);
+
+ String prefix = XmlUtils.lookupNamespacePrefix(baz, SdkConstants.ANDROID_URI);
+ assertEquals("customPrefix", prefix);
+
+ prefix = XmlUtils.lookupNamespacePrefix(baz,
+ "http://schemas.android.com/tools", "tools", false);
+ assertEquals("tools", prefix);
+
+ prefix = XmlUtils.lookupNamespacePrefix(baz,
+ "http://schemas.android.com/apk/res/my/pkg", "app", false);
+ assertEquals("app", prefix);
+ assertFalse(declaresNamespace(document, "http://schemas.android.com/apk/res/my/pkg"));
+
+ prefix = XmlUtils.lookupNamespacePrefix(baz,
+ "http://schemas.android.com/apk/res/my/pkg", "app", true /*create*/);
+ assertEquals("app", prefix);
+ assertTrue(declaresNamespace(document, "http://schemas.android.com/apk/res/my/pkg"));
+ }
+
+ private static boolean declaresNamespace(Document document, String uri) {
+ NamedNodeMap attributes = document.getDocumentElement().getAttributes();
+ for (int i = 0, n = attributes.getLength(); i < n; i++) {
+ Attr attribute = (Attr) attributes.item(i);
+ String name = attribute.getName();
+ if (name.startsWith(XMLNS) && uri.equals(attribute.getValue())) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public void testToXmlAttributeValue() throws Exception {
+ assertEquals("", XmlUtils.toXmlAttributeValue(""));
+ assertEquals("foo", XmlUtils.toXmlAttributeValue("foo"));
+ assertEquals("foo&lt;bar", XmlUtils.toXmlAttributeValue("foo<bar"));
+ assertEquals("foo>bar", XmlUtils.toXmlAttributeValue("foo>bar"));
+
+ assertEquals("&quot;", XmlUtils.toXmlAttributeValue("\""));
+ assertEquals("&apos;", XmlUtils.toXmlAttributeValue("'"));
+ assertEquals("foo&quot;b&apos;&apos;ar",
+ XmlUtils.toXmlAttributeValue("foo\"b''ar"));
+ assertEquals("&lt;&quot;&apos;>&amp;", XmlUtils.toXmlAttributeValue("<\"'>&"));
+ }
+
+ public void testAppendXmlAttributeValue() throws Exception {
+ StringBuilder sb = new StringBuilder();
+ XmlUtils.appendXmlAttributeValue(sb, "<\"'>&");
+ assertEquals("&lt;&quot;&apos;>&amp;", sb.toString());
+ }
+
+ public void testToXmlTextValue() throws Exception {
+ assertEquals("&lt;\"'>&amp;", XmlUtils.toXmlTextValue("<\"'>&"));
+ }
+
+ public void testAppendXmlTextValue() throws Exception {
+ StringBuilder sb = new StringBuilder();
+ XmlUtils.appendXmlTextValue(sb, "<\"'>&");
+ assertEquals("&lt;\"'>&amp;", sb.toString());
+ }
+}