diff options
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-x | common/src/main/java/com/android/annotations/Nullable.java (renamed from common/src/com/android/annotations/Nullable.java) | 0 | ||||
-rwxr-xr-x | common/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/.classpath | 9 | ||||
-rw-r--r-- | common/src/test/.project | 17 | ||||
-rw-r--r-- | common/src/test/java/com/android/utils/PositionXmlParserTest.java | 322 | ||||
-rw-r--r-- | common/src/test/java/com/android/utils/SdkUtilsTest.java | 133 | ||||
-rw-r--r-- | common/src/test/java/com/android/utils/XmlUtilsTest.java | 116 |
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<bar", XmlUtils.toXmlAttributeValue("foo<bar")); + assertEquals("foo>bar", XmlUtils.toXmlAttributeValue("foo>bar")); + + assertEquals(""", XmlUtils.toXmlAttributeValue("\"")); + assertEquals("'", XmlUtils.toXmlAttributeValue("'")); + assertEquals("foo"b''ar", + XmlUtils.toXmlAttributeValue("foo\"b''ar")); + assertEquals("<"'>&", XmlUtils.toXmlAttributeValue("<\"'>&")); + } + + public void testAppendXmlAttributeValue() throws Exception { + StringBuilder sb = new StringBuilder(); + XmlUtils.appendXmlAttributeValue(sb, "<\"'>&"); + assertEquals("<"'>&", sb.toString()); + } + + public void testToXmlTextValue() throws Exception { + assertEquals("<\"'>&", XmlUtils.toXmlTextValue("<\"'>&")); + } + + public void testAppendXmlTextValue() throws Exception { + StringBuilder sb = new StringBuilder(); + XmlUtils.appendXmlTextValue(sb, "<\"'>&"); + assertEquals("<\"'>&", sb.toString()); + } +} |