blob: 9c7e25d4b399d4628b9020ce826b804f59f63226 [file] [log] [blame]
/*
* Copyright (C) 2012 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.formatting;
import com.android.ide.common.xml.XmlFormatPreferences;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
import org.eclipse.text.edits.MalformedTreeException;
import org.eclipse.text.edits.ReplaceEdit;
import junit.framework.TestCase;
@SuppressWarnings("javadoc")
public class AndroidXmlFormattingStrategyTest extends TestCase {
// In the given before document, replace in the range replaceStart to replaceEnd
// the formatted string, and assert that it's identical to the given after string
private void check(String before, int replaceStart, int replaceEnd, String formatted,
String expected, XmlFormatPreferences prefs)
throws MalformedTreeException, BadLocationException {
Document document = new Document();
document.set(before);
ReplaceEdit edit = AndroidXmlFormattingStrategy.createReplaceEdit(document, replaceStart,
replaceEnd, formatted, prefs);
assertNotNull(edit);
edit.apply(document);
String contents = document.get();
// Ensure that we don't have any mangled CRLFs
char prev = 0;
boolean haveCrlf = false;
for (int i = 0, n = contents.length(); i < n; i++) {
char c = contents.charAt(i);
if (c == '\r') {
haveCrlf = true;
}
if (!(c != '\r' || prev != '\r')) {
fail("Mangled document: Found adjacent \\r's starting at " + i
+ ": " + contents.substring(i - 1, Math.min(contents.length(), i + 10))
+ "...");
}
if (haveCrlf && c == '\n' && prev != '\r') {
fail("Mangled document: In a CRLF document, found \\n without preceeding \\r");
}
prev = c;
}
assertEquals(expected, contents);
}
// In the given before document, replace the range indicated by [ and ] with the given
// formatted string, and assert that it's identical to the given after string
private void check(
String before, String insert, String expected,
XmlFormatPreferences prefs)
throws MalformedTreeException, BadLocationException {
int replaceStart = before.indexOf('[');
assertTrue(replaceStart != -1);
before = before.substring(0, replaceStart) + before.substring(replaceStart + 1);
int replaceEnd = before.indexOf(']');
assertTrue(replaceEnd != -1);
before = before.substring(0, replaceEnd) + before.substring(replaceEnd + 1);
check(before, replaceStart, replaceEnd, insert, expected, prefs);
}
public void test1() throws Exception {
check(
// Before
"<root>\n" +
"[ <element/>\n" +
" <second/>\n" +
"]\n" +
"</root>\n",
// Insert
" <element/>\n" +
" <second/>\n",
// After
"<root>\n" +
" <element/>\n" +
" <second/>\n" +
"\n" +
"</root>\n",
XmlFormatPreferences.defaults());
}
public void test2() throws Exception {
XmlFormatPreferences prefs = XmlFormatPreferences.defaults();
prefs.removeEmptyLines = true;
check(
// Before
"<root>\n" +
"\n" +
"\n" +
"[ <element/>\n" +
" <second/>\n" +
"]\n" +
"\n" +
"\n" +
"</root>\n",
// Insert
" <element/>\n" +
" <second/>\n",
// After
"<root>\n" +
" <element/>\n" +
" <second/>\n" +
"</root>\n",
prefs);
}
public void test3() throws Exception {
XmlFormatPreferences prefs = XmlFormatPreferences.defaults();
prefs.removeEmptyLines = true;
check(
// Before
"<root>\n" +
"\n" +
"\n" +
" [<element/>\n" +
" <second/>]\n" +
"\n" +
"\n" +
"\n" +
"</root>\n",
// Insert
" <element/>\n" +
" <second/>",
// After
"<root>\n" +
" <element/>\n" +
" <second/>\n" +
"</root>\n",
prefs);
}
public void test4() throws Exception {
check(
"<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
" xmlns:tools=\"http://schemas.android.com/tools\"\n" +
" android:layout_width=\"match_parent\"\n" +
" android:layout_height=\"match_parent\" >\n" +
"\n" +
" [<TextView\n" +
" android:layout_width=\"wrap_content\"\n" +
" android:layout_height=\"wrap_content\"\n" +
" android:layout_centerHorizontal=\"true\"\n" +
" android:layout_centerVertical=\"true\"\n" +
" android:text=\"foo\"\n" +
" tools:context=\".MainActivity\" />]\n" +
"\n" +
"</RelativeLayout>\n",
// Insert
"\n" +
" <TextView\n" +
" android:layout_width=\"wrap_content\"\n" +
" android:layout_height=\"wrap_content\"\n" +
" android:layout_centerHorizontal=\"true\"\n" +
" android:layout_centerVertical=\"true\"\n" +
" android:text=\"foo\"\n" +
" tools:context=\".MainActivity\" />\n",
// After
"<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
" xmlns:tools=\"http://schemas.android.com/tools\"\n" +
" android:layout_width=\"match_parent\"\n" +
" android:layout_height=\"match_parent\" >\n" +
"\n" +
" <TextView\n" +
" android:layout_width=\"wrap_content\"\n" +
" android:layout_height=\"wrap_content\"\n" +
" android:layout_centerHorizontal=\"true\"\n" +
" android:layout_centerVertical=\"true\"\n" +
" android:text=\"foo\"\n" +
" tools:context=\".MainActivity\" />\n" +
"\n" +
"</RelativeLayout>\n",
XmlFormatPreferences.defaults());
}
public void testCrLf1() throws Exception {
check(
// Before
"<root>\r\n" +
"[ <element/>\r\n" +
" <second/>\r\n" +
"]\r\n" +
"</root>\r\n",
// Insert
" <element/>\r\n" +
" <second/>\r\n",
// After
"<root>\r\n" +
" <element/>\r\n" +
" <second/>\r\n" +
"\r\n" +
"</root>\r\n",
XmlFormatPreferences.defaults());
}
public void testCrLf2() throws Exception {
XmlFormatPreferences prefs = XmlFormatPreferences.defaults();
prefs.removeEmptyLines = true;
check(
// Before
"<root>\r\n" +
"\r\n" +
"\r\n" +
"[ <element/>\r\n" +
" <second/>\r\n" +
"]\r\n" +
"\r\n" +
"\r\n" +
"</root>\r\n",
// Insert
" <element/>\r\n" +
" <second/>\r\n",
// After
"<root>\r\n" +
" <element/>\r\n" +
" <second/>\r\n" +
"</root>\r\n",
prefs);
}
public void testCrLf3() throws Exception {
XmlFormatPreferences prefs = XmlFormatPreferences.defaults();
prefs.removeEmptyLines = true;
check(
// Before
"<root>\r\n" +
"\r\n" +
"\r\n" +
" [<element/>\r\n" +
" <second/>]\r\n" +
"\r\n" +
"\r\n" +
"\r\n" +
"</root>\r\n",
// Insert
" <element/>\r\n" +
" <second/>",
// After
"<root>\r\n" +
" <element/>\r\n" +
" <second/>\r\n" +
"</root>\r\n",
prefs);
}
public void testCrlf4() throws Exception {
check(
"<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n" +
" xmlns:tools=\"http://schemas.android.com/tools\"\r\n" +
" android:layout_width=\"match_parent\"\r\n" +
" android:layout_height=\"match_parent\" >\r\n" +
"\r\n" +
" [<TextView\r\n" +
" android:layout_width=\"wrap_content\"\r\n" +
" android:layout_height=\"wrap_content\"\r\n" +
" android:layout_centerHorizontal=\"true\"\r\n" +
" android:layout_centerVertical=\"true\"\r\n" +
" android:text=\"foo\"\r\n" +
" tools:context=\".MainActivity\" />]\r\n" +
"\r\n" +
"</RelativeLayout>\r\n",
// Insert
"\r\n" +
" <TextView\r\n" +
" android:layout_width=\"wrap_content\"\r\n" +
" android:layout_height=\"wrap_content\"\r\n" +
" android:layout_centerHorizontal=\"true\"\r\n" +
" android:layout_centerVertical=\"true\"\r\n" +
" android:text=\"foo\"\r\n" +
" tools:context=\".MainActivity\" />\r\n",
// After
"<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n" +
" xmlns:tools=\"http://schemas.android.com/tools\"\r\n" +
" android:layout_width=\"match_parent\"\r\n" +
" android:layout_height=\"match_parent\" >\r\n" +
"\r\n" +
" <TextView\r\n" +
" android:layout_width=\"wrap_content\"\r\n" +
" android:layout_height=\"wrap_content\"\r\n" +
" android:layout_centerHorizontal=\"true\"\r\n" +
" android:layout_centerVertical=\"true\"\r\n" +
" android:text=\"foo\"\r\n" +
" tools:context=\".MainActivity\" />\r\n" +
"\r\n" +
"</RelativeLayout>\r\n",
XmlFormatPreferences.defaults());
}
}