diff --git a/python/src/META-INF/python-core-common.xml b/python/src/META-INF/python-core-common.xml
index 294eeb900d22..357a50c76c34 100644
--- a/python/src/META-INF/python-core-common.xml
+++ b/python/src/META-INF/python-core-common.xml
@@ -169,7 +169,6 @@
-
diff --git a/python/src/com/jetbrains/python/console/PydevConsoleRunnerImpl.java b/python/src/com/jetbrains/python/console/PydevConsoleRunnerImpl.java
index 011898cbea67..053a755ae90c 100644
--- a/python/src/com/jetbrains/python/console/PydevConsoleRunnerImpl.java
+++ b/python/src/com/jetbrains/python/console/PydevConsoleRunnerImpl.java
@@ -387,7 +387,7 @@ public class PydevConsoleRunnerImpl implements PydevConsoleRunner {
}
private PythonConsoleView createConsoleView() {
- PythonConsoleView consoleView = new PythonConsoleView(myProject, myTitle, mySdk);
+ PythonConsoleView consoleView = new PythonConsoleView(myProject, myTitle, mySdk, false);
myPydevConsoleCommunication.setConsoleFile(consoleView.getVirtualFile());
consoleView.addMessageFilter(new PythonTracebackFilter(myProject));
return consoleView;
diff --git a/python/src/com/jetbrains/python/console/PythonConsoleView.java b/python/src/com/jetbrains/python/console/PythonConsoleView.java
index 10c6fe539502..c2790598e495 100644
--- a/python/src/com/jetbrains/python/console/PythonConsoleView.java
+++ b/python/src/com/jetbrains/python/console/PythonConsoleView.java
@@ -72,6 +72,7 @@ import com.jetbrains.python.debugger.PyStackFrameInfo;
import com.jetbrains.python.highlighting.PyHighlighter;
import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.sdk.PythonSdkType;
+import com.jetbrains.python.testing.PyTestsSharedKt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -85,6 +86,7 @@ public class PythonConsoleView extends LanguageConsoleImpl implements Observable
private static final Logger LOG = Logger.getInstance(PythonConsoleView.class);
private final ConsolePromptDecorator myPromptView;
+ private final boolean myTestMode;
private PythonConsoleExecuteActionHandler myExecuteActionHandler;
private PyConsoleSourceHighlighter mySourceHighlighter;
@@ -97,8 +99,12 @@ public class PythonConsoleView extends LanguageConsoleImpl implements Observable
private ActionCallback myInitialized = new ActionCallback();
private boolean isShowVars = true;
- public PythonConsoleView(final Project project, final String title, final Sdk sdk) {
+ /**
+ * @param testMode this console will be used to display test output and should support TC messages
+ */
+ public PythonConsoleView(final Project project, final String title, final Sdk sdk, final boolean testMode) {
super(project, title, PythonLanguage.getInstance());
+ myTestMode = testMode;
getVirtualFile().putUserData(LanguageLevel.KEY, PythonSdkType.getLanguageLevelForSdk(sdk));
// Mark editor as console one, to prevent autopopup completion
@@ -263,6 +269,9 @@ public class PythonConsoleView extends LanguageConsoleImpl implements Observable
@Override
public void print(@NotNull String text, @NotNull final ConsoleViewContentType outputType) {
+ if (myTestMode) {
+ text = PyTestsSharedKt.processTCMessage(text);
+ }
detectIPython(text, outputType);
if (PyConsoleUtil.detectIPythonEnd(text)) {
myIsIPythonOutput = false;
diff --git a/python/src/com/jetbrains/python/console/PythonDebugLanguageConsoleView.java b/python/src/com/jetbrains/python/console/PythonDebugLanguageConsoleView.java
index 35f5f7b0678d..8eff46188572 100644
--- a/python/src/com/jetbrains/python/console/PythonDebugLanguageConsoleView.java
+++ b/python/src/com/jetbrains/python/console/PythonDebugLanguageConsoleView.java
@@ -42,8 +42,11 @@ public class PythonDebugLanguageConsoleView extends DuplexConsoleView = arrayOf(
PyNoseTestFactory,
PyTrialTestFactory)
+/**
+ * Accepts text that may be wrapped in TC message. Unwarps it and removes TC escape code.
+ * Regular text is unchanged
+ */
+fun processTCMessage(text: String): String {
+ val parsedMessage = ServiceMessage.parse(text.trim()) ?: return text // Not a TC message
+ return when (parsedMessage) {
+ is TestStdOut -> parsedMessage.stdOut // TC with stdout
+ is TestStdErr -> parsedMessage.stdErr // TC with stderr
+ else -> "" // TC with out of any output
+ }
+}
+
internal fun getAdditionalArgumentsPropertyName() = com.jetbrains.python.testing.PyAbstractTestConfiguration::additionalArguments.name
/**
@@ -789,21 +802,6 @@ object PyTestsConfigurationProducer : AbstractPythonTestConfigurationProducer>? {
- val parsedMessage = ServiceMessage.parse(text.trim()) ?: return null // Not a TC message
- return when (parsedMessage) {
- is TestStdOut -> listOf(Pair(parsedMessage.stdOut, contentType!!)) // TC with stdout
- is TestStdErr -> listOf(Pair(parsedMessage.stdErr, contentType!!)) // TC with stderr
- else -> emptyList() // TC with out of any output
- }
- }
-}
-
-object PyTestConsoleInputFilterProvider : ConsoleInputFilterProvider {
- override fun getDefaultFilters(project: Project): Array = arrayOf(PyTestInputFilter)
-}
-
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY)
/**
diff --git a/python/src/com/jetbrains/python/testing/PythonTestCommandLineStateBase.java b/python/src/com/jetbrains/python/testing/PythonTestCommandLineStateBase.java
index c1dbffcb8b51..fcea305d3e30 100644
--- a/python/src/com/jetbrains/python/testing/PythonTestCommandLineStateBase.java
+++ b/python/src/com/jetbrains/python/testing/PythonTestCommandLineStateBase.java
@@ -72,7 +72,7 @@ public abstract class PythonTestCommandLineStateBase