Escape replacement and assertion text.
Fixes b.android.com/231074
Test: com.google.gct.testrecorder.codegen.TestCodeGeneratorTest
and com.google.gct.testrecorder.codegen.TestCodeMapperTest
Change-Id: If47015463cce0d3ec73bd5ec233094e66b4e4b73
diff --git a/test-recorder/src/com/google/gct/testrecorder/codegen/TestCodeMapper.java b/test-recorder/src/com/google/gct/testrecorder/codegen/TestCodeMapper.java
index 6abae8f..be8bb3c 100644
--- a/test-recorder/src/com/google/gct/testrecorder/codegen/TestCodeMapper.java
+++ b/test-recorder/src/com/google/gct/testrecorder/codegen/TestCodeMapper.java
@@ -102,10 +102,10 @@
if (myIsUsingCustomEspresso) {
testCodeLines.add(createActionStatement(variableName, "clearText()", event.canScrollTo()));
testCodeLines.add(createActionStatement(
- variableName, "typeText(\"" + event.getReplacementText() + "\"), closeSoftKeyboard()", false));
+ variableName, "typeText(" + boxString(event.getReplacementText()) + "), closeSoftKeyboard()", false));
} else {
testCodeLines.add(createActionStatement(
- variableName, "replaceText(\"" + event.getReplacementText() + "\"), closeSoftKeyboard()", event.canScrollTo()));
+ variableName, "replaceText(" + boxString(event.getReplacementText()) + "), closeSoftKeyboard()", event.canScrollTo()));
}
} else {
throw new RuntimeException("Unsupported event type: " + event.getEventType());
@@ -145,7 +145,7 @@
testCodeLines.add(variableName + ".check(matches(isDisplayed()));");
} else if (TEXT_IS.equals(rule)) {
String text = assertion.getText();
- testCodeLines.add(variableName + ".check(matches(withText(\"" + text + "\")));");
+ testCodeLines.add(variableName + ".check(matches(withText(" + boxString(text) + ")));");
} else {
throw new RuntimeException("Unsupported assertion rule: " + rule);
}
diff --git a/test-recorder/src/com/google/gct/testrecorder/event/ElementAction.java b/test-recorder/src/com/google/gct/testrecorder/event/ElementAction.java
index dd74ce7..29deda0 100644
--- a/test-recorder/src/com/google/gct/testrecorder/event/ElementAction.java
+++ b/test-recorder/src/com/google/gct/testrecorder/event/ElementAction.java
@@ -18,6 +18,7 @@
import com.android.utils.Pair;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
+import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.annotations.NotNull;
import java.util.List;
@@ -107,7 +108,7 @@
protected String getDisplayText() {
String text = getElementText();
if (!text.isEmpty()) {
- return getIdAttributeDisplayPresentation("text", text);
+ return getIdAttributeDisplayPresentation("text", StringUtil.escapeStringCharacters(text));
}
return "";
}
diff --git a/test-recorder/src/com/google/gct/testrecorder/ui/TestRecorderListRenderer.java b/test-recorder/src/com/google/gct/testrecorder/ui/TestRecorderListRenderer.java
index 82eeb50..dc79c74 100644
--- a/test-recorder/src/com/google/gct/testrecorder/ui/TestRecorderListRenderer.java
+++ b/test-recorder/src/com/google/gct/testrecorder/ui/TestRecorderListRenderer.java
@@ -17,7 +17,7 @@
import com.google.gct.testrecorder.event.TestRecorderAssertion;
import com.google.gct.testrecorder.event.TestRecorderEvent;
-import groovy.json.StringEscapeUtils;
+import com.intellij.openapi.util.text.StringUtil;
import javax.swing.*;
import java.awt.*;
@@ -47,7 +47,7 @@
TestRecorderEvent event = (TestRecorderEvent) value;
if (event.isTextChange()) {
renderString = String.format(TEXT_CHANGE_EVENT_FORMAT, outerDivTextColor, event.getRendererString(),
- StringEscapeUtils.escapeJava(event.getReplacementText()));
+ StringUtil.escapeStringCharacters(event.getReplacementText()));
} else if (event.isPressEvent()) {
renderString = String.format(PRESS_EVENT_FORMAT, outerDivTextColor, event.getRendererString());
} else if (event.isViewLongClick()) {
@@ -68,7 +68,7 @@
renderString = String.format(ASSERTION_FORMAT_ONE_LINE, outerDivTextColor, assertion.getRendererString(), assertion.getRule());
} else {
renderString = String.format(ASSERTION_FORMAT_MULTI_LINE, outerDivTextColor, assertion.getRendererString(), assertion.getRule(),
- StringEscapeUtils.escapeJava(assertedText));
+ StringUtil.escapeStringCharacters(assertedText));
}
} else {
throw new RuntimeException("Unsupported Test Recorder entity: " + value.toString());
diff --git a/test-recorder/test-recorder.iml b/test-recorder/test-recorder.iml
index b416958..a0ac36c 100644
--- a/test-recorder/test-recorder.iml
+++ b/test-recorder/test-recorder.iml
@@ -17,7 +17,6 @@
<orderEntry type="library" name="Velocity" level="project" />
<orderEntry type="module" module-name="java-impl" />
<orderEntry type="module" module-name="openapi" />
- <orderEntry type="library" name="Groovy-Eclipse-Batch" level="project" />
<orderEntry type="module" module-name="debugger-impl" />
<orderEntry type="module" module-name="xdebugger-impl" />
<orderEntry type="library" name="commons-io-2.4" level="project" />
@@ -45,4 +44,4 @@
<orderEntry type="module" module-name="android-plugin" scope="TEST" />
<orderEntry type="module" module-name="testFramework-java" scope="TEST" />
</component>
-</module>
\ No newline at end of file
+</module>
diff --git a/test-recorder/test-resources/ExpectedTestClass.txt b/test-recorder/test-resources/ExpectedTestClass.txt
index 9a2745b..50fd36a 100644
--- a/test-recorder/test-resources/ExpectedTestClass.txt
+++ b/test-recorder/test-resources/ExpectedTestClass.txt
@@ -96,10 +96,10 @@
0)),
1),
isDisplayed()));
- elementClass6.perform(replaceText("replacement text"), closeSoftKeyboard());
+ elementClass6.perform(replaceText("replacement \n\ntext\n"), closeSoftKeyboard());
ViewInteraction elementClass7 = onView(
- allOf(withId(resourceId4), withText("replacement text"), withContentDescription("content description 3"),
+ allOf(withId(resourceId4), withText("replacement \n\ntext\n"), withContentDescription("content description 3"),
childAtPosition(
allOf(withId(parentResourceId5),
childAtPosition(
@@ -107,10 +107,10 @@
0)),
1),
isDisplayed()));
- elementClass7.check(matches(withText("replacement text")));
+ elementClass7.check(matches(withText("replacement \n\ntext\n")));
ViewInteraction elementClass8 = onView(
- allOf(withId(resourceId4), withText("replacement text"), withContentDescription("content description 3"),
+ allOf(withId(resourceId4), withText("replacement \n\ntext\n"), withContentDescription("content description 3"),
childAtPosition(
allOf(withId(parentResourceId5),
childAtPosition(
diff --git a/test-recorder/testSrc/com/google/gct/testrecorder/codegen/TestCodeGeneratorTest.java b/test-recorder/testSrc/com/google/gct/testrecorder/codegen/TestCodeGeneratorTest.java
index 996fb6c..4fe3352 100644
--- a/test-recorder/testSrc/com/google/gct/testrecorder/codegen/TestCodeGeneratorTest.java
+++ b/test-recorder/testSrc/com/google/gct/testrecorder/codegen/TestCodeGeneratorTest.java
@@ -141,18 +141,18 @@
textChangeEvent.addElementDescriptor(new ElementDescriptor("ElementClass", 1, "resourceId4", "content description 3", "original text"));
textChangeEvent.addElementDescriptor(new ElementDescriptor("ParentClass1", 0, "parentResourceId5", "", ""));
textChangeEvent.addElementDescriptor(new ElementDescriptor("ParentClass2", 2, "parentResourceId6", "parent content description 2", ""));
- textChangeEvent.setReplacementText("replacement text");
+ textChangeEvent.setReplacementText("replacement \n\ntext\n");
events.add(textChangeEvent);
TestRecorderAssertion assertion2 = new TestRecorderAssertion(TEXT_IS);
- assertion2.addElementDescriptor(new ElementDescriptor("ElementClass", 1, "resourceId4", "content description 3", "replacement text"));
+ assertion2.addElementDescriptor(new ElementDescriptor("ElementClass", 1, "resourceId4", "content description 3", "replacement \n\ntext\n"));
assertion2.addElementDescriptor(new ElementDescriptor("ParentClass1", 0, "parentResourceId5", "", ""));
assertion2.addElementDescriptor(new ElementDescriptor("ParentClass2", 2, "parentResourceId6", "parent content description 2", ""));
- assertion2.setText("replacement text");
+ assertion2.setText("replacement \n\ntext\n");
events.add(assertion2);
TestRecorderEvent pressEditorActionEvent = new TestRecorderEvent(TestRecorderEvent.PRESS_EDITOR_ACTION, System.currentTimeMillis());
- pressEditorActionEvent.addElementDescriptor(new ElementDescriptor("ElementClass", 1, "resourceId4", "content description 3", "replacement text"));
+ pressEditorActionEvent.addElementDescriptor(new ElementDescriptor("ElementClass", 1, "resourceId4", "content description 3", "replacement \n\ntext\n"));
pressEditorActionEvent.addElementDescriptor(new ElementDescriptor("ParentClass1", 0, "parentResourceId5", "", ""));
pressEditorActionEvent.addElementDescriptor(new ElementDescriptor("ParentClass2", 2, "parentResourceId6", "parent content description 2", ""));
events.add(pressEditorActionEvent);
diff --git a/test-recorder/testSrc/com/google/gct/testrecorder/codegen/TestCodeMapperTest.java b/test-recorder/testSrc/com/google/gct/testrecorder/codegen/TestCodeMapperTest.java
index 1c52d25..0694ea3 100644
--- a/test-recorder/testSrc/com/google/gct/testrecorder/codegen/TestCodeMapperTest.java
+++ b/test-recorder/testSrc/com/google/gct/testrecorder/codegen/TestCodeMapperTest.java
@@ -36,10 +36,10 @@
TestRecorderEvent textChangeEvent = new TestRecorderEvent(TestRecorderEvent.TEXT_CHANGE, System.currentTimeMillis());
textChangeEvent.addElementDescriptor(new ElementDescriptor("SomeClass", -1, "", "content description", ""));
- textChangeEvent.setReplacementText("my text");
+ textChangeEvent.setReplacementText("my text\n");
String espressoActionStatement = testCodeMapper.getTestCodeLinesForEvent(textChangeEvent).get(1);
- assertTrue(espressoActionStatement.contains("replaceText(\"my text\")"));
+ assertTrue(espressoActionStatement.contains("replaceText(\"my text\\n\")"));
assertTrue(espressoActionStatement.contains("closeSoftKeyboard()"));
}