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()"));
   }