[education/rkward] rkward/autotests: Add tests for output interleaving and encoding

Thomas Friedrichsmeier null at kde.org
Thu Sep 4 20:46:54 BST 2025


Git commit 1924e86cf8d9f41f2bf8cb5aeaa79904a753380a by Thomas Friedrichsmeier.
Committed on 03/09/2025 at 16:32.
Pushed by tfry into branch 'master'.

Add tests for output interleaving and encoding

M  +35   -0    rkward/autotests/core_test.cpp

https://invent.kde.org/education/rkward/-/commit/1924e86cf8d9f41f2bf8cb5aeaa79904a753380a

diff --git a/rkward/autotests/core_test.cpp b/rkward/autotests/core_test.cpp
index 2611eccca..ee74d66a4 100644
--- a/rkward/autotests/core_test.cpp
+++ b/rkward/autotests/core_test.cpp
@@ -404,6 +404,41 @@ class RKWardCoreTest : public QObject {
 		QCOMPARE(output.value(4), u"444"_s);
 	}
 
+	void outputInterleavingTest() {
+		// test interleaving between output via R itself, ourput via system, and the corresponing source lines in the console
+		RInterface::issueCommand(QStringLiteral("sysout <- function(msg) { if (.Platform$OS.type == \"unix\") system(paste0(\"echo \", msg)) else invisible(system(paste0(\"cmd /c echo \", msg))) }"), RCommand::User);
+		RKConsole::mainConsole()->pipeUserCommand(QStringLiteral("cat(\"first\\n\")\ninvisible(\"second\")\nsysout(\"third\")\ncat(\"fourth\\n\")\n"));
+		RInterface::issueCommand(QStringLiteral("rm(sysout)"), RCommand::User);
+		waitForAllFinished();
+		QStringList consoleout = RKConsole::mainConsole()->getFullContent().mid(consoleout.length() - 7);
+		QVERIFY(consoleout.value(0).contains(u"cat"_s));
+		QVERIFY(consoleout.value(0).contains(u"first"_s));
+		QVERIFY(!consoleout.value(1).contains(u"cat"_s));
+		QVERIFY(consoleout.value(1).contains(u"first"_s));
+		QVERIFY(consoleout.value(2).contains(u"second"_s));
+		QVERIFY(consoleout.value(3).contains(u"sysout"_s));
+		QVERIFY(consoleout.value(3).contains(u"third"_s));
+		QVERIFY(!consoleout.value(4).contains(u"sysout"_s));
+		QVERIFY(consoleout.value(4).contains(u"third"_s));
+		QVERIFY(consoleout.value(5).contains(u"cat"_s));
+		QVERIFY(consoleout.value(5).contains(u"fourth"_s));
+		QVERIFY(!consoleout.value(6).contains(u"cat"_s));
+		QVERIFY(consoleout.value(6).contains(u"fourth"_s));
+	}
+
+	void printUtf8Test() {
+		// some stuff we don't expect to work in native locale
+		const auto strings = QStringList() << u"¢Ä"_s << u"€🚚"_s << u"✨☀️"_s;
+		for (const auto &string : strings) {
+			runCommandAsync(new RCommand(u"print(\"%1\"); cat(paste0(\"[\", \"%1\", \"]\"))"_s.arg(string), RCommand::App), nullptr, [string](RCommand *command) {
+				QVERIFY(!command->failed());
+				QVERIFY(command->fullOutput().contains(u"\"%1\""_s.arg(string)));
+				QVERIFY(command->fullOutput().contains(u"[%1]"_s.arg(string)));
+			});
+		}
+		waitForAllFinished();
+	}
+
 	void cancelCommandStressTest() {
 		int cancelled_commands = 0;
 		int commands_out = 0;



More information about the rkward-tracker mailing list