diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt
index 8948defe23..de1dfb7011 100644
--- a/rpcs3/CMakeLists.txt
+++ b/rpcs3/CMakeLists.txt
@@ -210,4 +210,6 @@ if(UNIX AND NOT APPLE)
DESTINATION ${CMAKE_INSTALL_DATADIR}/rpcs3)
install(DIRECTORY ../bin/git
DESTINATION ${CMAKE_INSTALL_DATADIR}/rpcs3)
+ install(DIRECTORY ../bin/test
+ DESTINATION ${CMAKE_INSTALL_DATADIR}/rpcs3)
endif()
diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp
index cc41a78c5f..a32dc00168 100644
--- a/rpcs3/rpcs3qt/main_window.cpp
+++ b/rpcs3/rpcs3qt/main_window.cpp
@@ -472,6 +472,46 @@ void main_window::BootElf()
Boot(path, "", true);
}
+void main_window::BootTest()
+{
+ bool stopped = false;
+
+ if (Emu.IsRunning())
+ {
+ Emu.Pause();
+ stopped = true;
+ }
+
+#ifdef _WIN32
+ const QString path_tests = QString::fromStdString(fs::get_config_dir()) + "/test/";
+#elif defined(__linux__)
+ const QString path_tests = QCoreApplication::applicationDirPath() + "/../share/rpcs3/test/";
+#else
+ const QString path_tests = QCoreApplication::applicationDirPath() + "/../Resources/test/";
+#endif
+
+ const QString file_path = QFileDialog::getOpenFileName(this, tr("Select (S)ELF To Boot"), path_tests, tr(
+ "(S)ELF files (*.elf *.self);;"
+ "ELF files (*.elf);;"
+ "SELF files (*.self);;"
+ "All files (*.*)"),
+ Q_NULLPTR, QFileDialog::DontResolveSymlinks);
+
+ if (file_path.isEmpty())
+ {
+ if (stopped)
+ {
+ Emu.Resume();
+ }
+ return;
+ }
+
+ const std::string path = sstr(QFileInfo(file_path).absoluteFilePath());
+
+ gui_log.notice("Booting from BootTest...");
+ Boot(path, "", true);
+}
+
void main_window::BootGame()
{
bool stopped = false;
@@ -1903,6 +1943,7 @@ void main_window::CreateActions()
void main_window::CreateConnects()
{
connect(ui->bootElfAct, &QAction::triggered, this, &main_window::BootElf);
+ connect(ui->bootTestAct, &QAction::triggered, this, &main_window::BootTest);
connect(ui->bootGameAct, &QAction::triggered, this, &main_window::BootGame);
connect(ui->bootVSHAct, &QAction::triggered, this, &main_window::BootVSH);
connect(ui->actionopen_rsx_capture, &QAction::triggered, this, [this](){ BootRsxCapture(); });
diff --git a/rpcs3/rpcs3qt/main_window.h b/rpcs3/rpcs3qt/main_window.h
index cf0ee68ee6..27bda32fa7 100644
--- a/rpcs3/rpcs3qt/main_window.h
+++ b/rpcs3/rpcs3qt/main_window.h
@@ -109,6 +109,7 @@ private Q_SLOTS:
void OnPlayOrPause();
void Boot(const std::string& path, const std::string& title_id = "", bool direct = false, bool add_only = false, cfg_mode config_mode = cfg_mode::custom, const std::string& config_path = "");
void BootElf();
+ void BootTest();
void BootGame();
void BootVSH();
void BootRsxCapture(std::string path = "");
diff --git a/rpcs3/rpcs3qt/main_window.ui b/rpcs3/rpcs3qt/main_window.ui
index c1dca87256..e304759b8a 100644
--- a/rpcs3/rpcs3qt/main_window.ui
+++ b/rpcs3/rpcs3qt/main_window.ui
@@ -151,6 +151,19 @@
File
+
-
+
@@ -400,6 +413,11 @@
Boot SELF/ELF
+
+
+ Boot Test
+
+
Boot Game