aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/CMakeLists.txt12
-rw-r--r--tests/DataPackParse_test.cpp79
-rw-r--r--tests/DummyResourceAPI.h47
-rw-r--r--tests/Packwiz_test.cpp4
-rw-r--r--tests/ResourceModel_test.cpp88
-rw-r--r--tests/ResourcePackParse_test.cpp9
-rw-r--r--tests/ShaderPackParse_test.cpp77
-rw-r--r--tests/Task_test.cpp60
-rw-r--r--tests/TexturePackParse_test.cpp9
-rw-r--r--tests/WorldSaveParse_test.cpp94
-rw-r--r--tests/testdata/DataPackParse/another_test_folder/data/dummy/tags/item/foo_proof/bar.json1
-rw-r--r--tests/testdata/DataPackParse/another_test_folder/pack.mcmeta6
-rw-r--r--tests/testdata/DataPackParse/test_data_pack_boogaloo.zipbin0 -> 898 bytes
-rw-r--r--tests/testdata/DataPackParse/test_folder/data/dummy/tags/item/foo_proof/bar.json1
-rw-r--r--tests/testdata/DataPackParse/test_folder/pack.mcmeta6
-rw-r--r--tests/testdata/ResourcePackParse/test_resource_pack_idk.zipbin322 -> 804 bytes
-rw-r--r--tests/testdata/ShaderPackParse/shaderpack1.zipbin0 -> 242 bytes
-rw-r--r--tests/testdata/ShaderPackParse/shaderpack2/shaders/shaders.properties0
-rw-r--r--tests/testdata/ShaderPackParse/shaderpack3.zipbin0 -> 128 bytes
-rw-r--r--tests/testdata/WorldSaveParse/minecraft_save_1.zipbin0 -> 184 bytes
-rw-r--r--tests/testdata/WorldSaveParse/minecraft_save_2.zipbin0 -> 352 bytes
-rw-r--r--tests/testdata/WorldSaveParse/minecraft_save_3/world_3/level.dat0
-rw-r--r--tests/testdata/WorldSaveParse/minecraft_save_4/saves/world_4/level.dat0
23 files changed, 485 insertions, 8 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 630f1200..3d0d2dca 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -24,9 +24,21 @@ ecm_add_test(ResourceFolderModel_test.cpp LINK_LIBRARIES Launcher_logic Qt${QT_V
ecm_add_test(ResourcePackParse_test.cpp LINK_LIBRARIES Launcher_logic Qt${QT_VERSION_MAJOR}::Test
TEST_NAME ResourcePackParse)
+ecm_add_test(ResourceModel_test.cpp LINK_LIBRARIES Launcher_logic Qt${QT_VERSION_MAJOR}::Test
+ TEST_NAME ResourceModel)
+
ecm_add_test(TexturePackParse_test.cpp LINK_LIBRARIES Launcher_logic Qt${QT_VERSION_MAJOR}::Test
TEST_NAME TexturePackParse)
+ecm_add_test(DataPackParse_test.cpp LINK_LIBRARIES Launcher_logic Qt${QT_VERSION_MAJOR}::Test
+ TEST_NAME DataPackParse)
+
+ecm_add_test(ShaderPackParse_test.cpp LINK_LIBRARIES Launcher_logic Qt${QT_VERSION_MAJOR}::Test
+ TEST_NAME ShaderPackParse)
+
+ecm_add_test(WorldSaveParse_test.cpp LINK_LIBRARIES Launcher_logic Qt${QT_VERSION_MAJOR}::Test
+ TEST_NAME WorldSaveParse)
+
ecm_add_test(ParseUtils_test.cpp LINK_LIBRARIES Launcher_logic Qt${QT_VERSION_MAJOR}::Test
TEST_NAME ParseUtils)
diff --git a/tests/DataPackParse_test.cpp b/tests/DataPackParse_test.cpp
new file mode 100644
index 00000000..61ce1e2b
--- /dev/null
+++ b/tests/DataPackParse_test.cpp
@@ -0,0 +1,79 @@
+// SPDX-FileCopyrightText: 2022 Rachel Powers <508861+Ryex@users.noreply.github.com>
+//
+// SPDX-License-Identifier: GPL-3.0-only
+
+/*
+ * Prism Launcher - Minecraft Launcher
+ * Copyright (C) 2022 Rachel Powers <508861+Ryex@users.noreply.github.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <QTest>
+#include <QTimer>
+
+#include <FileSystem.h>
+
+#include <minecraft/mod/DataPack.h>
+#include <minecraft/mod/tasks/LocalDataPackParseTask.h>
+
+class DataPackParseTest : public QObject {
+ Q_OBJECT
+
+ private slots:
+ void test_parseZIP()
+ {
+ QString source = QFINDTESTDATA("testdata/DataPackParse");
+
+ QString zip_dp = FS::PathCombine(source, "test_data_pack_boogaloo.zip");
+ DataPack pack { QFileInfo(zip_dp) };
+
+ bool valid = DataPackUtils::processZIP(pack);
+
+ QVERIFY(pack.packFormat() == 4);
+ QVERIFY(pack.description() == "Some data pack 2 boobgaloo");
+ QVERIFY(valid == true);
+ }
+
+ void test_parseFolder()
+ {
+ QString source = QFINDTESTDATA("testdata/DataPackParse");
+
+ QString folder_dp = FS::PathCombine(source, "test_folder");
+ DataPack pack { QFileInfo(folder_dp) };
+
+ bool valid = DataPackUtils::processFolder(pack);
+
+ QVERIFY(pack.packFormat() == 10);
+ QVERIFY(pack.description() == "Some data pack, maybe");
+ QVERIFY(valid == true);
+ }
+
+ void test_parseFolder2()
+ {
+ QString source = QFINDTESTDATA("testdata/DataPackParse");
+
+ QString folder_dp = FS::PathCombine(source, "another_test_folder");
+ DataPack pack { QFileInfo(folder_dp) };
+
+ bool valid = DataPackUtils::process(pack);
+
+ QVERIFY(pack.packFormat() == 6);
+ QVERIFY(pack.description() == "Some data pack three, leaves on the tree");
+ QVERIFY(valid == true);
+ }
+};
+
+QTEST_GUILESS_MAIN(DataPackParseTest)
+
+#include "DataPackParse_test.moc"
diff --git a/tests/DummyResourceAPI.h b/tests/DummyResourceAPI.h
new file mode 100644
index 00000000..e91be96c
--- /dev/null
+++ b/tests/DummyResourceAPI.h
@@ -0,0 +1,47 @@
+#pragma once
+
+#include <QJsonDocument>
+
+#include <modplatform/ResourceAPI.h>
+
+class SearchTask : public Task {
+ Q_OBJECT
+
+ public:
+ void executeTask() override { emitSucceeded(); }
+};
+
+class DummyResourceAPI : public ResourceAPI {
+ public:
+ static auto searchRequestResult()
+ {
+ static QByteArray json_response =
+ "{\"hits\":["
+ "{"
+ "\"author\":\"flowln\","
+ "\"description\":\"the bestest mod\","
+ "\"project_id\":\"something\","
+ "\"project_type\":\"mod\","
+ "\"slug\":\"bip_bop\","
+ "\"title\":\"AAAAAAAA\","
+ "\"versions\":[\"2.71\"]"
+ "}"
+ "]}";
+
+ return QJsonDocument::fromJson(json_response);
+ }
+
+ DummyResourceAPI() : ResourceAPI() {}
+ [[nodiscard]] auto getSortingMethods() const -> QList<SortingMethod> override { return {}; };
+
+ [[nodiscard]] Task::Ptr searchProjects(SearchArgs&&, SearchCallbacks&& callbacks) const override
+ {
+ auto task = new SearchTask;
+ QObject::connect(task, &Task::succeeded, [=] {
+ auto json = searchRequestResult();
+ callbacks.on_succeed(json);
+ });
+ QObject::connect(task, &Task::finished, task, &Task::deleteLater);
+ return task;
+ }
+};
diff --git a/tests/Packwiz_test.cpp b/tests/Packwiz_test.cpp
index 098e8f89..29289469 100644
--- a/tests/Packwiz_test.cpp
+++ b/tests/Packwiz_test.cpp
@@ -48,7 +48,7 @@ class PackwizTest : public QObject {
QCOMPARE(metadata.hash_format, "sha512");
QCOMPARE(metadata.hash, "c8fe6e15ddea32668822dddb26e1851e5f03834be4bcb2eff9c0da7fdc086a9b6cead78e31a44d3bc66335cba11144ee0337c6d5346f1ba63623064499b3188d");
- QCOMPARE(metadata.provider, ModPlatform::Provider::MODRINTH);
+ QCOMPARE(metadata.provider, ModPlatform::ResourceProvider::MODRINTH);
QCOMPARE(metadata.version(), "ug2qKTPR");
QCOMPARE(metadata.mod_id(), "kYq5qkSL");
}
@@ -76,7 +76,7 @@ class PackwizTest : public QObject {
QCOMPARE(metadata.hash_format, "murmur2");
QCOMPARE(metadata.hash, "1781245820");
- QCOMPARE(metadata.provider, ModPlatform::Provider::FLAME);
+ QCOMPARE(metadata.provider, ModPlatform::ResourceProvider::FLAME);
QCOMPARE(metadata.file_id, 3509043);
QCOMPARE(metadata.project_id, 327154);
}
diff --git a/tests/ResourceModel_test.cpp b/tests/ResourceModel_test.cpp
new file mode 100644
index 00000000..716bf853
--- /dev/null
+++ b/tests/ResourceModel_test.cpp
@@ -0,0 +1,88 @@
+#include <QAbstractItemModelTester>
+#include <QTest>
+#include <QTimer>
+
+#include <Json.h>
+
+#include <ui/pages/modplatform/ResourceModel.h>
+
+#include "DummyResourceAPI.h"
+
+using ResourceDownload::ResourceModel;
+
+#define EXEC_TASK(EXEC) \
+ QEventLoop loop; \
+ \
+ connect(model, &ResourceModel::dataChanged, &loop, &QEventLoop::quit); \
+ \
+ QTimer expire_timer; \
+ expire_timer.callOnTimeout(&loop, &QEventLoop::quit); \
+ expire_timer.setSingleShot(true); \
+ expire_timer.start(4000); \
+ \
+ EXEC; \
+ if (model->hasActiveSearchJob()) \
+ loop.exec(); \
+ \
+ QVERIFY2(expire_timer.isActive(), "Timer has expired. The search never finished."); \
+ expire_timer.stop(); \
+ \
+ disconnect(model, nullptr, &loop, nullptr)
+
+class ResourceModelTest;
+
+class DummyResourceModel : public ResourceModel {
+ Q_OBJECT
+
+ friend class ResourceModelTest;
+
+ public:
+ DummyResourceModel() : ResourceModel(new DummyResourceAPI) {}
+
+ [[nodiscard]] auto metaEntryBase() const -> QString override { return ""; };
+
+ ResourceAPI::SearchArgs createSearchArguments() override { return {}; };
+ ResourceAPI::VersionSearchArgs createVersionsArguments(QModelIndex&) override { return {}; };
+ ResourceAPI::ProjectInfoArgs createInfoArguments(QModelIndex&) override { return {}; };
+
+ QJsonArray documentToArray(QJsonDocument& doc) const override { return doc.object().value("hits").toArray(); }
+
+ void loadIndexedPack(ModPlatform::IndexedPack& pack, QJsonObject& obj) override
+ {
+ pack.authors.append({ Json::requireString(obj, "author") });
+ pack.description = Json::requireString(obj, "description");
+ pack.addonId = Json::requireString(obj, "project_id");
+ }
+};
+
+class ResourceModelTest : public QObject {
+ Q_OBJECT
+ private slots:
+ void test_abstract_item_model() { [[maybe_unused]] auto tester = new QAbstractItemModelTester(new DummyResourceModel); }
+
+ void test_search()
+ {
+ auto model = new DummyResourceModel;
+
+ QVERIFY(model->m_packs.isEmpty());
+
+ EXEC_TASK(model->search());
+
+ QVERIFY(model->m_packs.size() == 1);
+ QVERIFY(model->m_search_state == DummyResourceModel::SearchState::Finished);
+
+ auto processed_pack = model->m_packs.at(0);
+ auto search_json = DummyResourceAPI::searchRequestResult();
+ auto processed_response = model->documentToArray(search_json).first().toObject();
+
+ QVERIFY(processed_pack.addonId.toString() == Json::requireString(processed_response, "project_id"));
+ QVERIFY(processed_pack.description == Json::requireString(processed_response, "description"));
+ QVERIFY(processed_pack.authors.first().name == Json::requireString(processed_response, "author"));
+ }
+};
+
+QTEST_GUILESS_MAIN(ResourceModelTest)
+
+#include "ResourceModel_test.moc"
+
+#include "moc_DummyResourceAPI.cpp"
diff --git a/tests/ResourcePackParse_test.cpp b/tests/ResourcePackParse_test.cpp
index 568c3b63..7f2f86bf 100644
--- a/tests/ResourcePackParse_test.cpp
+++ b/tests/ResourcePackParse_test.cpp
@@ -35,10 +35,11 @@ class ResourcePackParseTest : public QObject {
QString zip_rp = FS::PathCombine(source, "test_resource_pack_idk.zip");
ResourcePack pack { QFileInfo(zip_rp) };
- ResourcePackUtils::processZIP(pack);
+ bool valid = ResourcePackUtils::processZIP(pack, ResourcePackUtils::ProcessingLevel::BasicInfoOnly);
QVERIFY(pack.packFormat() == 3);
QVERIFY(pack.description() == "um dois, feijão com arroz, três quatro, feijão no prato, cinco seis, café inglês, sete oito, comer biscoito, nove dez comer pastéis!!");
+ QVERIFY(valid == true);
}
void test_parseFolder()
@@ -48,10 +49,11 @@ class ResourcePackParseTest : public QObject {
QString folder_rp = FS::PathCombine(source, "test_folder");
ResourcePack pack { QFileInfo(folder_rp) };
- ResourcePackUtils::processFolder(pack);
+ bool valid = ResourcePackUtils::processFolder(pack, ResourcePackUtils::ProcessingLevel::BasicInfoOnly);
QVERIFY(pack.packFormat() == 1);
QVERIFY(pack.description() == "Some resource pack maybe");
+ QVERIFY(valid == true);
}
void test_parseFolder2()
@@ -61,10 +63,11 @@ class ResourcePackParseTest : public QObject {
QString folder_rp = FS::PathCombine(source, "another_test_folder");
ResourcePack pack { QFileInfo(folder_rp) };
- ResourcePackUtils::process(pack);
+ bool valid = ResourcePackUtils::process(pack, ResourcePackUtils::ProcessingLevel::BasicInfoOnly);
QVERIFY(pack.packFormat() == 6);
QVERIFY(pack.description() == "o quartel pegou fogo, policia deu sinal, acode acode acode a bandeira nacional");
+ QVERIFY(valid == false); // no assets dir
}
};
diff --git a/tests/ShaderPackParse_test.cpp b/tests/ShaderPackParse_test.cpp
new file mode 100644
index 00000000..7df105c6
--- /dev/null
+++ b/tests/ShaderPackParse_test.cpp
@@ -0,0 +1,77 @@
+
+// SPDX-FileCopyrightText: 2022 Rachel Powers <508861+Ryex@users.noreply.github.com>
+//
+// SPDX-License-Identifier: GPL-3.0-only
+
+/*
+ * Prism Launcher - Minecraft Launcher
+ * Copyright (C) 2022 Rachel Powers <508861+Ryex@users.noreply.github.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <QTest>
+#include <QTimer>
+
+#include <FileSystem.h>
+
+#include <minecraft/mod/ShaderPack.h>
+#include <minecraft/mod/tasks/LocalShaderPackParseTask.h>
+
+class ShaderPackParseTest : public QObject {
+ Q_OBJECT
+
+ private slots:
+ void test_parseZIP()
+ {
+ QString source = QFINDTESTDATA("testdata/ShaderPackParse");
+
+ QString zip_sp = FS::PathCombine(source, "shaderpack1.zip");
+ ShaderPack pack { QFileInfo(zip_sp) };
+
+ bool valid = ShaderPackUtils::processZIP(pack);
+
+ QVERIFY(pack.packFormat() == ShaderPackFormat::VALID);
+ QVERIFY(valid == true);
+ }
+
+ void test_parseFolder()
+ {
+ QString source = QFINDTESTDATA("testdata/ShaderPackParse");
+
+ QString folder_sp = FS::PathCombine(source, "shaderpack2");
+ ShaderPack pack { QFileInfo(folder_sp) };
+
+ bool valid = ShaderPackUtils::processFolder(pack);
+
+ QVERIFY(pack.packFormat() == ShaderPackFormat::VALID);
+ QVERIFY(valid == true);
+ }
+
+ void test_parseZIP2()
+ {
+ QString source = QFINDTESTDATA("testdata/ShaderPackParse");
+
+ QString folder_sp = FS::PathCombine(source, "shaderpack3.zip");
+ ShaderPack pack { QFileInfo(folder_sp) };
+
+ bool valid = ShaderPackUtils::process(pack);
+
+ QVERIFY(pack.packFormat() == ShaderPackFormat::INVALID);
+ QVERIFY(valid == false);
+ }
+};
+
+QTEST_GUILESS_MAIN(ShaderPackParseTest)
+
+#include "ShaderPackParse_test.moc"
diff --git a/tests/Task_test.cpp b/tests/Task_test.cpp
index 80bba02f..6649b724 100644
--- a/tests/Task_test.cpp
+++ b/tests/Task_test.cpp
@@ -1,4 +1,6 @@
#include <QTest>
+#include <QTimer>
+#include <QThread>
#include <tasks/ConcurrentTask.h>
#include <tasks/MultipleOptionsTask.h>
@@ -11,6 +13,9 @@ class BasicTask : public Task {
friend class TaskTest;
+ public:
+ BasicTask(bool show_debug_log = true) : Task(nullptr, show_debug_log) {}
+
private:
void executeTask() override
{
@@ -30,6 +35,42 @@ class BasicTask_MultiStep : public Task {
void executeTask() override {};
};
+class BigConcurrentTask : public QThread {
+ Q_OBJECT
+
+ ConcurrentTask big_task;
+
+ void run() override
+ {
+ QTimer deadline;
+ deadline.setInterval(10000);
+ connect(&deadline, &QTimer::timeout, this, [this]{ passed_the_deadline = true; });
+ deadline.start();
+
+ // NOTE: Arbitrary value that manages to trigger a problem when there is one.
+ static const unsigned s_num_tasks = 1 << 14;
+ auto sub_tasks = new BasicTask*[s_num_tasks];
+
+ for (unsigned i = 0; i < s_num_tasks; i++) {
+ sub_tasks[i] = new BasicTask(false);
+ big_task.addTask(sub_tasks[i]);
+ }
+
+ big_task.run();
+
+ while (!big_task.isFinished() && !passed_the_deadline)
+ QCoreApplication::processEvents();
+
+ emit finished();
+ }
+
+ public:
+ bool passed_the_deadline = false;
+
+ signals:
+ void finished();
+};
+
class TaskTest : public QObject {
Q_OBJECT
@@ -183,6 +224,25 @@ class TaskTest : public QObject {
return t.isFinished();
}, 1000), "Task didn't finish as it should.");
}
+
+ void test_stackOverflowInConcurrentTask()
+ {
+ QEventLoop loop;
+
+ auto thread = new BigConcurrentTask;
+ // NOTE: This is an arbitrary value, big enough to not cause problems on normal execution, but low enough
+ // so that the number of tasks that needs to get ran to potentially cause a problem isn't too big.
+ thread->setStackSize(32 * 1024);
+
+ connect(thread, &BigConcurrentTask::finished, &loop, &QEventLoop::quit);
+
+ thread->start();
+
+ loop.exec();
+
+ QVERIFY(!thread->passed_the_deadline);
+ thread->deleteLater();
+ }
};
QTEST_GUILESS_MAIN(TaskTest)
diff --git a/tests/TexturePackParse_test.cpp b/tests/TexturePackParse_test.cpp
index 0771f79f..4ddc0a3a 100644
--- a/tests/TexturePackParse_test.cpp
+++ b/tests/TexturePackParse_test.cpp
@@ -36,9 +36,10 @@ class TexturePackParseTest : public QObject {
QString zip_rp = FS::PathCombine(source, "test_texture_pack_idk.zip");
TexturePack pack { QFileInfo(zip_rp) };
- TexturePackUtils::processZIP(pack);
+ bool valid = TexturePackUtils::processZIP(pack);
QVERIFY(pack.description() == "joe biden, wake up");
+ QVERIFY(valid == true);
}
void test_parseFolder()
@@ -48,9 +49,10 @@ class TexturePackParseTest : public QObject {
QString folder_rp = FS::PathCombine(source, "test_texturefolder");
TexturePack pack { QFileInfo(folder_rp) };
- TexturePackUtils::processFolder(pack);
+ bool valid = TexturePackUtils::processFolder(pack, TexturePackUtils::ProcessingLevel::BasicInfoOnly);
QVERIFY(pack.description() == "Some texture pack surely");
+ QVERIFY(valid == true);
}
void test_parseFolder2()
@@ -60,9 +62,10 @@ class TexturePackParseTest : public QObject {
QString folder_rp = FS::PathCombine(source, "another_test_texturefolder");
TexturePack pack { QFileInfo(folder_rp) };
- TexturePackUtils::process(pack);
+ bool valid = TexturePackUtils::process(pack, TexturePackUtils::ProcessingLevel::BasicInfoOnly);
QVERIFY(pack.description() == "quieres\nfor real");
+ QVERIFY(valid == true);
}
};
diff --git a/tests/WorldSaveParse_test.cpp b/tests/WorldSaveParse_test.cpp
new file mode 100644
index 00000000..4a8c3d29
--- /dev/null
+++ b/tests/WorldSaveParse_test.cpp
@@ -0,0 +1,94 @@
+
+// SPDX-FileCopyrightText: 2022 Rachel Powers <508861+Ryex@users.noreply.github.com>
+//
+// SPDX-License-Identifier: GPL-3.0-only
+
+/*
+ * Prism Launcher - Minecraft Launcher
+ * Copyright (C) 2022 Rachel Powers <508861+Ryex@users.noreply.github.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <QTest>
+#include <QTimer>
+
+#include <FileSystem.h>
+
+#include <minecraft/mod/WorldSave.h>
+#include <minecraft/mod/tasks/LocalWorldSaveParseTask.h>
+
+class WorldSaveParseTest : public QObject {
+ Q_OBJECT
+
+ private slots:
+ void test_parseZIP()
+ {
+ QString source = QFINDTESTDATA("testdata/WorldSaveParse");
+
+ QString zip_ws = FS::PathCombine(source, "minecraft_save_1.zip") ;
+ WorldSave save { QFileInfo(zip_ws) };
+
+ bool valid = WorldSaveUtils::processZIP(save);
+
+ QVERIFY(save.saveFormat() == WorldSaveFormat::SINGLE);
+ QVERIFY(save.saveDirName() == "world_1");
+ QVERIFY(valid == true);
+ }
+
+ void test_parse_ZIP2()
+ {
+ QString source = QFINDTESTDATA("testdata/WorldSaveParse");
+
+ QString zip_ws = FS::PathCombine(source, "minecraft_save_2.zip") ;
+ WorldSave save { QFileInfo(zip_ws) };
+
+ bool valid = WorldSaveUtils::processZIP(save);
+
+ QVERIFY(save.saveFormat() == WorldSaveFormat::MULTI);
+ QVERIFY(save.saveDirName() == "world_2");
+ QVERIFY(valid == true);
+ }
+
+ void test_parseFolder()
+ {
+ QString source = QFINDTESTDATA("testdata/WorldSaveParse");
+
+ QString folder_ws = FS::PathCombine(source, "minecraft_save_3");
+ WorldSave save { QFileInfo(folder_ws) };
+
+ bool valid = WorldSaveUtils::processFolder(save);
+
+ QVERIFY(save.saveFormat() == WorldSaveFormat::SINGLE);
+ QVERIFY(save.saveDirName() == "world_3");
+ QVERIFY(valid == true);
+ }
+
+ void test_parseFolder2()
+ {
+ QString source = QFINDTESTDATA("testdata/WorldSaveParse");
+
+ QString folder_ws = FS::PathCombine(source, "minecraft_save_4");
+ WorldSave save { QFileInfo(folder_ws) };
+
+ bool valid = WorldSaveUtils::process(save);
+
+ QVERIFY(save.saveFormat() == WorldSaveFormat::MULTI);
+ QVERIFY(save.saveDirName() == "world_4");
+ QVERIFY(valid == true);
+ }
+};
+
+QTEST_GUILESS_MAIN(WorldSaveParseTest)
+
+#include "WorldSaveParse_test.moc"
diff --git a/tests/testdata/DataPackParse/another_test_folder/data/dummy/tags/item/foo_proof/bar.json b/tests/testdata/DataPackParse/another_test_folder/data/dummy/tags/item/foo_proof/bar.json
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/tests/testdata/DataPackParse/another_test_folder/data/dummy/tags/item/foo_proof/bar.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/tests/testdata/DataPackParse/another_test_folder/pack.mcmeta b/tests/testdata/DataPackParse/another_test_folder/pack.mcmeta
new file mode 100644
index 00000000..5509d007
--- /dev/null
+++ b/tests/testdata/DataPackParse/another_test_folder/pack.mcmeta
@@ -0,0 +1,6 @@
+{
+ "pack": {
+ "pack_format": 6,
+ "description": "Some data pack three, leaves on the tree"
+ }
+}
diff --git a/tests/testdata/DataPackParse/test_data_pack_boogaloo.zip b/tests/testdata/DataPackParse/test_data_pack_boogaloo.zip
new file mode 100644
index 00000000..cb0b9f3c
--- /dev/null
+++ b/tests/testdata/DataPackParse/test_data_pack_boogaloo.zip
Binary files differ
diff --git a/tests/testdata/DataPackParse/test_folder/data/dummy/tags/item/foo_proof/bar.json b/tests/testdata/DataPackParse/test_folder/data/dummy/tags/item/foo_proof/bar.json
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/tests/testdata/DataPackParse/test_folder/data/dummy/tags/item/foo_proof/bar.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/tests/testdata/DataPackParse/test_folder/pack.mcmeta b/tests/testdata/DataPackParse/test_folder/pack.mcmeta
new file mode 100644
index 00000000..dbfc7e9b
--- /dev/null
+++ b/tests/testdata/DataPackParse/test_folder/pack.mcmeta
@@ -0,0 +1,6 @@
+{
+ "pack": {
+ "pack_format": 10,
+ "description": "Some data pack, maybe"
+ }
+}
diff --git a/tests/testdata/ResourcePackParse/test_resource_pack_idk.zip b/tests/testdata/ResourcePackParse/test_resource_pack_idk.zip
index 52b91cdc..b4e66a60 100644
--- a/tests/testdata/ResourcePackParse/test_resource_pack_idk.zip
+++ b/tests/testdata/ResourcePackParse/test_resource_pack_idk.zip
Binary files differ
diff --git a/tests/testdata/ShaderPackParse/shaderpack1.zip b/tests/testdata/ShaderPackParse/shaderpack1.zip
new file mode 100644
index 00000000..9a8fb186
--- /dev/null
+++ b/tests/testdata/ShaderPackParse/shaderpack1.zip
Binary files differ
diff --git a/tests/testdata/ShaderPackParse/shaderpack2/shaders/shaders.properties b/tests/testdata/ShaderPackParse/shaderpack2/shaders/shaders.properties
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/testdata/ShaderPackParse/shaderpack2/shaders/shaders.properties
diff --git a/tests/testdata/ShaderPackParse/shaderpack3.zip b/tests/testdata/ShaderPackParse/shaderpack3.zip
new file mode 100644
index 00000000..dbec042d
--- /dev/null
+++ b/tests/testdata/ShaderPackParse/shaderpack3.zip
Binary files differ
diff --git a/tests/testdata/WorldSaveParse/minecraft_save_1.zip b/tests/testdata/WorldSaveParse/minecraft_save_1.zip
new file mode 100644
index 00000000..832a243d
--- /dev/null
+++ b/tests/testdata/WorldSaveParse/minecraft_save_1.zip
Binary files differ
diff --git a/tests/testdata/WorldSaveParse/minecraft_save_2.zip b/tests/testdata/WorldSaveParse/minecraft_save_2.zip
new file mode 100644
index 00000000..6c895176
--- /dev/null
+++ b/tests/testdata/WorldSaveParse/minecraft_save_2.zip
Binary files differ
diff --git a/tests/testdata/WorldSaveParse/minecraft_save_3/world_3/level.dat b/tests/testdata/WorldSaveParse/minecraft_save_3/world_3/level.dat
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/testdata/WorldSaveParse/minecraft_save_3/world_3/level.dat
diff --git a/tests/testdata/WorldSaveParse/minecraft_save_4/saves/world_4/level.dat b/tests/testdata/WorldSaveParse/minecraft_save_4/saves/world_4/level.dat
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/testdata/WorldSaveParse/minecraft_save_4/saves/world_4/level.dat