NOISSUE reorganize unit tests to be placed next to the code they test. Nuke more dead tests.
This commit is contained in:
		@@ -1,6 +1,8 @@
 | 
			
		||||
project(MultiMC_logic)
 | 
			
		||||
 | 
			
		||||
set(LOGIC_SOURCES
 | 
			
		||||
include (UnitTest)
 | 
			
		||||
 | 
			
		||||
set(CORE_SOURCES
 | 
			
		||||
	# LOGIC - Base classes and infrastructure
 | 
			
		||||
	BaseInstaller.h
 | 
			
		||||
	BaseInstaller.cpp
 | 
			
		||||
@@ -42,12 +44,6 @@ set(LOGIC_SOURCES
 | 
			
		||||
	# a smart pointer wrapper intended for safer use with Qt signal/slot mechanisms
 | 
			
		||||
	QObjectPtr.h
 | 
			
		||||
 | 
			
		||||
	# Path matchers
 | 
			
		||||
	pathmatcher/FSTreeMatcher.h
 | 
			
		||||
	pathmatcher/IPathMatcher.h
 | 
			
		||||
	pathmatcher/MultiMatcher.h
 | 
			
		||||
	pathmatcher/RegexpMatcher.h
 | 
			
		||||
 | 
			
		||||
	# Compression support
 | 
			
		||||
	GZip.h
 | 
			
		||||
	GZip.cpp
 | 
			
		||||
@@ -60,6 +56,31 @@ set(LOGIC_SOURCES
 | 
			
		||||
	Version.h
 | 
			
		||||
	Version.cpp
 | 
			
		||||
 | 
			
		||||
	# A Recursive file system watcher
 | 
			
		||||
	RecursiveFileSystemWatcher.h
 | 
			
		||||
	RecursiveFileSystemWatcher.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
add_unit_test(FileSystem
 | 
			
		||||
	SOURCES FileSystem_test.cpp
 | 
			
		||||
	LIBS MultiMC_logic
 | 
			
		||||
	DATA testdata
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
add_unit_test(GZip
 | 
			
		||||
	SOURCES GZip_test.cpp
 | 
			
		||||
	LIBS MultiMC_logic
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
set(PATHMATCHER_SOURCES
 | 
			
		||||
	# Path matchers
 | 
			
		||||
	pathmatcher/FSTreeMatcher.h
 | 
			
		||||
	pathmatcher/IPathMatcher.h
 | 
			
		||||
	pathmatcher/MultiMatcher.h
 | 
			
		||||
	pathmatcher/RegexpMatcher.h
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
set(NET_SOURCES
 | 
			
		||||
	# network stuffs
 | 
			
		||||
	net/NetAction.h
 | 
			
		||||
	net/MD5EtagDownload.h
 | 
			
		||||
@@ -76,24 +97,10 @@ set(LOGIC_SOURCES
 | 
			
		||||
	net/PasteUpload.cpp
 | 
			
		||||
	net/URLConstants.h
 | 
			
		||||
	net/URLConstants.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
	# Yggdrasil login stuff
 | 
			
		||||
	minecraft/auth/AuthSession.h
 | 
			
		||||
	minecraft/auth/AuthSession.cpp
 | 
			
		||||
	minecraft/auth/MojangAccountList.h
 | 
			
		||||
	minecraft/auth/MojangAccountList.cpp
 | 
			
		||||
	minecraft/auth/MojangAccount.h
 | 
			
		||||
	minecraft/auth/MojangAccount.cpp
 | 
			
		||||
	minecraft/auth/YggdrasilTask.h
 | 
			
		||||
	minecraft/auth/YggdrasilTask.cpp
 | 
			
		||||
	minecraft/auth/flows/AuthenticateTask.h
 | 
			
		||||
	minecraft/auth/flows/AuthenticateTask.cpp
 | 
			
		||||
	minecraft/auth/flows/RefreshTask.cpp
 | 
			
		||||
	minecraft/auth/flows/RefreshTask.cpp
 | 
			
		||||
	minecraft/auth/flows/ValidateTask.h
 | 
			
		||||
	minecraft/auth/flows/ValidateTask.cpp
 | 
			
		||||
 | 
			
		||||
	# Game launch logic
 | 
			
		||||
# Game launch logic
 | 
			
		||||
set(LAUNCH_SOURCES
 | 
			
		||||
	launch/steps/PostLaunchCommand.cpp
 | 
			
		||||
	launch/steps/PostLaunchCommand.h
 | 
			
		||||
	launch/steps/PreLaunchCommand.cpp
 | 
			
		||||
@@ -110,30 +117,70 @@ set(LOGIC_SOURCES
 | 
			
		||||
	launch/LoggedProcess.h
 | 
			
		||||
	launch/MessageLevel.cpp
 | 
			
		||||
	launch/MessageLevel.h
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
	# Update system
 | 
			
		||||
# Old update system
 | 
			
		||||
set(UPDATE_SOURCES
 | 
			
		||||
	updater/GoUpdate.h
 | 
			
		||||
	updater/GoUpdate.cpp
 | 
			
		||||
	updater/UpdateChecker.h
 | 
			
		||||
	updater/UpdateChecker.cpp
 | 
			
		||||
	updater/DownloadTask.h
 | 
			
		||||
	updater/DownloadTask.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
add_unit_test(UpdateChecker
 | 
			
		||||
	SOURCES updater/UpdateChecker_test.cpp
 | 
			
		||||
	LIBS MultiMC_logic
 | 
			
		||||
	DATA updater/testdata
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
add_unit_test(DownloadTask
 | 
			
		||||
	SOURCES updater/DownloadTask_test.cpp
 | 
			
		||||
	LIBS MultiMC_logic
 | 
			
		||||
	DATA updater/testdata
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
# Rarely used notifications
 | 
			
		||||
set(NOTIFICATIONS_SOURCES
 | 
			
		||||
	# Notifications - short warning messages
 | 
			
		||||
	notifications/NotificationChecker.h
 | 
			
		||||
	notifications/NotificationChecker.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# Backend for the news bar... there's usually no news.
 | 
			
		||||
set(NEWS_SOURCES
 | 
			
		||||
	# News System
 | 
			
		||||
	news/NewsChecker.h
 | 
			
		||||
	news/NewsChecker.cpp
 | 
			
		||||
	news/NewsEntry.h
 | 
			
		||||
	news/NewsEntry.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# Minecraft services status checker
 | 
			
		||||
set(STATUS_SOURCES
 | 
			
		||||
	# Status system
 | 
			
		||||
	status/StatusChecker.h
 | 
			
		||||
	status/StatusChecker.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# Support for Minecraft instances and launch
 | 
			
		||||
set(MINECRAFT_SOURCES
 | 
			
		||||
	# Minecraft support
 | 
			
		||||
	minecraft/auth/AuthSession.h
 | 
			
		||||
	minecraft/auth/AuthSession.cpp
 | 
			
		||||
	minecraft/auth/MojangAccountList.h
 | 
			
		||||
	minecraft/auth/MojangAccountList.cpp
 | 
			
		||||
	minecraft/auth/MojangAccount.h
 | 
			
		||||
	minecraft/auth/MojangAccount.cpp
 | 
			
		||||
	minecraft/auth/YggdrasilTask.h
 | 
			
		||||
	minecraft/auth/YggdrasilTask.cpp
 | 
			
		||||
	minecraft/auth/flows/AuthenticateTask.h
 | 
			
		||||
	minecraft/auth/flows/AuthenticateTask.cpp
 | 
			
		||||
	minecraft/auth/flows/RefreshTask.cpp
 | 
			
		||||
	minecraft/auth/flows/RefreshTask.cpp
 | 
			
		||||
	minecraft/auth/flows/ValidateTask.h
 | 
			
		||||
	minecraft/auth/flows/ValidateTask.cpp
 | 
			
		||||
	minecraft/onesix/OneSixUpdate.h
 | 
			
		||||
	minecraft/onesix/OneSixUpdate.cpp
 | 
			
		||||
	minecraft/onesix/OneSixInstance.h
 | 
			
		||||
@@ -201,55 +248,6 @@ set(LOGIC_SOURCES
 | 
			
		||||
	minecraft/ftb/FTBPlugin.h
 | 
			
		||||
	minecraft/ftb/FTBPlugin.cpp
 | 
			
		||||
 | 
			
		||||
	# A Recursive file system watcher
 | 
			
		||||
	RecursiveFileSystemWatcher.h
 | 
			
		||||
	RecursiveFileSystemWatcher.cpp
 | 
			
		||||
 | 
			
		||||
	# the screenshots feature
 | 
			
		||||
	screenshots/Screenshot.h
 | 
			
		||||
	screenshots/ImgurUpload.h
 | 
			
		||||
	screenshots/ImgurUpload.cpp
 | 
			
		||||
	screenshots/ImgurAlbumCreation.h
 | 
			
		||||
	screenshots/ImgurAlbumCreation.cpp
 | 
			
		||||
 | 
			
		||||
	# Tasks
 | 
			
		||||
	tasks/Task.h
 | 
			
		||||
	tasks/Task.cpp
 | 
			
		||||
	tasks/ThreadTask.h
 | 
			
		||||
	tasks/ThreadTask.cpp
 | 
			
		||||
	tasks/SequentialTask.h
 | 
			
		||||
	tasks/SequentialTask.cpp
 | 
			
		||||
 | 
			
		||||
	# Settings
 | 
			
		||||
	settings/INIFile.cpp
 | 
			
		||||
	settings/INIFile.h
 | 
			
		||||
	settings/INISettingsObject.cpp
 | 
			
		||||
	settings/INISettingsObject.h
 | 
			
		||||
	settings/OverrideSetting.cpp
 | 
			
		||||
	settings/OverrideSetting.h
 | 
			
		||||
	settings/PassthroughSetting.cpp
 | 
			
		||||
	settings/PassthroughSetting.h
 | 
			
		||||
	settings/Setting.cpp
 | 
			
		||||
	settings/Setting.h
 | 
			
		||||
	settings/SettingsObject.cpp
 | 
			
		||||
	settings/SettingsObject.h
 | 
			
		||||
 | 
			
		||||
	# Java related code
 | 
			
		||||
	java/launch/CheckJava.cpp
 | 
			
		||||
	java/launch/CheckJava.h
 | 
			
		||||
	java/JavaChecker.h
 | 
			
		||||
	java/JavaChecker.cpp
 | 
			
		||||
	java/JavaCheckerJob.h
 | 
			
		||||
	java/JavaCheckerJob.cpp
 | 
			
		||||
	java/JavaInstall.h
 | 
			
		||||
	java/JavaInstall.cpp
 | 
			
		||||
	java/JavaInstallList.h
 | 
			
		||||
	java/JavaInstallList.cpp
 | 
			
		||||
	java/JavaUtils.h
 | 
			
		||||
	java/JavaUtils.cpp
 | 
			
		||||
	java/JavaVersion.h
 | 
			
		||||
	java/JavaVersion.cpp
 | 
			
		||||
 | 
			
		||||
	# Assets
 | 
			
		||||
	minecraft/AssetsUtils.h
 | 
			
		||||
	minecraft/AssetsUtils.cpp
 | 
			
		||||
@@ -271,11 +269,106 @@ set(LOGIC_SOURCES
 | 
			
		||||
	minecraft/liteloader/LiteLoaderInstaller.cpp
 | 
			
		||||
	minecraft/liteloader/LiteLoaderVersionList.h
 | 
			
		||||
	minecraft/liteloader/LiteLoaderVersionList.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
add_unit_test(GradleSpecifier
 | 
			
		||||
	SOURCES minecraft/GradleSpecifier_test.cpp
 | 
			
		||||
	LIBS MultiMC_logic
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
add_unit_test(MojangVersionFormat
 | 
			
		||||
	SOURCES minecraft/MojangVersionFormat_test.cpp
 | 
			
		||||
	LIBS MultiMC_logic
 | 
			
		||||
	DATA minecraft/testdata
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
add_unit_test(Library
 | 
			
		||||
	SOURCES minecraft/Library_test.cpp
 | 
			
		||||
	LIBS MultiMC_logic
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
# FIXME: shares data with FileSystem test
 | 
			
		||||
add_unit_test(ModList
 | 
			
		||||
	SOURCES minecraft/ModList_test.cpp
 | 
			
		||||
	DATA testdata
 | 
			
		||||
	LIBS MultiMC_logic
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
add_unit_test(ParseUtils
 | 
			
		||||
	SOURCES minecraft/ParseUtils_test.cpp
 | 
			
		||||
	LIBS MultiMC_logic
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
# the screenshots feature
 | 
			
		||||
set(SCREENSHOTS_SOURCES
 | 
			
		||||
	screenshots/Screenshot.h
 | 
			
		||||
	screenshots/ImgurUpload.h
 | 
			
		||||
	screenshots/ImgurUpload.cpp
 | 
			
		||||
	screenshots/ImgurAlbumCreation.h
 | 
			
		||||
	screenshots/ImgurAlbumCreation.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
set(TASKS_SOURCES
 | 
			
		||||
	# Tasks
 | 
			
		||||
	tasks/Task.h
 | 
			
		||||
	tasks/Task.cpp
 | 
			
		||||
	tasks/ThreadTask.h
 | 
			
		||||
	tasks/ThreadTask.cpp
 | 
			
		||||
	tasks/SequentialTask.h
 | 
			
		||||
	tasks/SequentialTask.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
set(SETTINGS_SOURCES
 | 
			
		||||
	# Settings
 | 
			
		||||
	settings/INIFile.cpp
 | 
			
		||||
	settings/INIFile.h
 | 
			
		||||
	settings/INISettingsObject.cpp
 | 
			
		||||
	settings/INISettingsObject.h
 | 
			
		||||
	settings/OverrideSetting.cpp
 | 
			
		||||
	settings/OverrideSetting.h
 | 
			
		||||
	settings/PassthroughSetting.cpp
 | 
			
		||||
	settings/PassthroughSetting.h
 | 
			
		||||
	settings/Setting.cpp
 | 
			
		||||
	settings/Setting.h
 | 
			
		||||
	settings/SettingsObject.cpp
 | 
			
		||||
	settings/SettingsObject.h
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
add_unit_test(INIFile
 | 
			
		||||
	SOURCES settings/INIFile_test.cpp
 | 
			
		||||
	LIBS MultiMC_logic
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
set(JAVA_SOURCES
 | 
			
		||||
	# Java related code
 | 
			
		||||
	java/launch/CheckJava.cpp
 | 
			
		||||
	java/launch/CheckJava.h
 | 
			
		||||
	java/JavaChecker.h
 | 
			
		||||
	java/JavaChecker.cpp
 | 
			
		||||
	java/JavaCheckerJob.h
 | 
			
		||||
	java/JavaCheckerJob.cpp
 | 
			
		||||
	java/JavaInstall.h
 | 
			
		||||
	java/JavaInstall.cpp
 | 
			
		||||
	java/JavaInstallList.h
 | 
			
		||||
	java/JavaInstallList.cpp
 | 
			
		||||
	java/JavaUtils.h
 | 
			
		||||
	java/JavaUtils.cpp
 | 
			
		||||
	java/JavaVersion.h
 | 
			
		||||
	java/JavaVersion.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
add_unit_test(JavaVersion
 | 
			
		||||
	SOURCES java/JavaVersion_test.cpp
 | 
			
		||||
	LIBS MultiMC_logic
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
set(TRANSLATIONS_SOURCES
 | 
			
		||||
	# Translations
 | 
			
		||||
	trans/TranslationDownloader.h
 | 
			
		||||
	trans/TranslationDownloader.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
set(TOOLS_SOURCES
 | 
			
		||||
	# Tools
 | 
			
		||||
	tools/BaseExternalTool.cpp
 | 
			
		||||
	tools/BaseExternalTool.h
 | 
			
		||||
@@ -287,7 +380,9 @@ set(LOGIC_SOURCES
 | 
			
		||||
	tools/JVisualVM.h
 | 
			
		||||
	tools/MCEditTool.cpp
 | 
			
		||||
	tools/MCEditTool.h
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
set(WONKO_SOURCES
 | 
			
		||||
	# Wonko
 | 
			
		||||
	wonko/tasks/BaseWonkoEntityRemoteLoadTask.cpp
 | 
			
		||||
	wonko/tasks/BaseWonkoEntityRemoteLoadTask.h
 | 
			
		||||
@@ -310,11 +405,36 @@ set(LOGIC_SOURCES
 | 
			
		||||
	wonko/WonkoReference.cpp
 | 
			
		||||
	wonko/WonkoReference.h
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
add_unit_test(WonkoIndex
 | 
			
		||||
	SOURCES wonko/WonkoIndex_test.cpp
 | 
			
		||||
	LIBS MultiMC_logic
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
################################ COMPILE ################################
 | 
			
		||||
 | 
			
		||||
# we need zlib
 | 
			
		||||
find_package(ZLIB REQUIRED)
 | 
			
		||||
 | 
			
		||||
set(LOGIC_SOURCES
 | 
			
		||||
	${CORE_SOURCES}
 | 
			
		||||
	${PATHMATCHER_SOURCES}
 | 
			
		||||
	${NET_SOURCES}
 | 
			
		||||
	${LAUNCH_SOURCES}
 | 
			
		||||
	${UPDATE_SOURCES}
 | 
			
		||||
	${NOTIFICATIONS_SOURCES}
 | 
			
		||||
	${NEWS_SOURCES}
 | 
			
		||||
	${STATUS_SOURCES}
 | 
			
		||||
	${MINECRAFT_SOURCES}
 | 
			
		||||
	${SCREENSHOTS_SOURCES}
 | 
			
		||||
	${TASKS_SOURCES}
 | 
			
		||||
	${SETTINGS_SOURCES}
 | 
			
		||||
	${JAVA_SOURCES}
 | 
			
		||||
	${TRANSLATIONS_SOURCES}
 | 
			
		||||
	${TOOLS_SOURCES}
 | 
			
		||||
	${WONKO_SOURCES}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
add_library(MultiMC_logic SHARED ${LOGIC_SOURCES})
 | 
			
		||||
set_target_properties(MultiMC_logic PROPERTIES CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN 1)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										164
									
								
								api/logic/FileSystem_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								api/logic/FileSystem_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,164 @@
 | 
			
		||||
#include <QTest>
 | 
			
		||||
#include <QTemporaryDir>
 | 
			
		||||
#include <QStandardPaths>
 | 
			
		||||
#include "TestUtil.h"
 | 
			
		||||
 | 
			
		||||
#include "FileSystem.h"
 | 
			
		||||
 | 
			
		||||
class FileSystemTest : public QObject
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
 | 
			
		||||
	const QString bothSlash = "/foo/";
 | 
			
		||||
	const QString trailingSlash = "foo/";
 | 
			
		||||
	const QString leadingSlash = "/foo";
 | 
			
		||||
 | 
			
		||||
private
 | 
			
		||||
slots:
 | 
			
		||||
	void test_pathCombine()
 | 
			
		||||
	{
 | 
			
		||||
		QCOMPARE(QString("/foo/foo"), FS::PathCombine(bothSlash, bothSlash));
 | 
			
		||||
		QCOMPARE(QString("foo/foo"), FS::PathCombine(trailingSlash, trailingSlash));
 | 
			
		||||
		QCOMPARE(QString("/foo/foo"), FS::PathCombine(leadingSlash, leadingSlash));
 | 
			
		||||
 | 
			
		||||
		QCOMPARE(QString("/foo/foo/foo"), FS::PathCombine(bothSlash, bothSlash, bothSlash));
 | 
			
		||||
		QCOMPARE(QString("foo/foo/foo"), FS::PathCombine(trailingSlash, trailingSlash, trailingSlash));
 | 
			
		||||
		QCOMPARE(QString("/foo/foo/foo"), FS::PathCombine(leadingSlash, leadingSlash, leadingSlash));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_PathCombine1_data()
 | 
			
		||||
	{
 | 
			
		||||
		QTest::addColumn<QString>("result");
 | 
			
		||||
		QTest::addColumn<QString>("path1");
 | 
			
		||||
		QTest::addColumn<QString>("path2");
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("qt 1") << "/abc/def/ghi/jkl" << "/abc/def" << "ghi/jkl";
 | 
			
		||||
		QTest::newRow("qt 2") << "/abc/def/ghi/jkl" << "/abc/def/" << "ghi/jkl";
 | 
			
		||||
#if defined(Q_OS_WIN)
 | 
			
		||||
		QTest::newRow("win native, from C:") << "C:/abc" << "C:" << "abc";
 | 
			
		||||
		QTest::newRow("win native 1") << "C:/abc/def/ghi/jkl" << "C:\\abc\\def" << "ghi\\jkl";
 | 
			
		||||
		QTest::newRow("win native 2") << "C:/abc/def/ghi/jkl" << "C:\\abc\\def\\" << "ghi\\jkl";
 | 
			
		||||
#endif
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_PathCombine1()
 | 
			
		||||
	{
 | 
			
		||||
		QFETCH(QString, result);
 | 
			
		||||
		QFETCH(QString, path1);
 | 
			
		||||
		QFETCH(QString, path2);
 | 
			
		||||
 | 
			
		||||
		QCOMPARE(FS::PathCombine(path1, path2), result);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_PathCombine2_data()
 | 
			
		||||
	{
 | 
			
		||||
		QTest::addColumn<QString>("result");
 | 
			
		||||
		QTest::addColumn<QString>("path1");
 | 
			
		||||
		QTest::addColumn<QString>("path2");
 | 
			
		||||
		QTest::addColumn<QString>("path3");
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("qt 1") << "/abc/def/ghi/jkl" << "/abc" << "def" << "ghi/jkl";
 | 
			
		||||
		QTest::newRow("qt 2") << "/abc/def/ghi/jkl" << "/abc/" << "def" << "ghi/jkl";
 | 
			
		||||
		QTest::newRow("qt 3") << "/abc/def/ghi/jkl" << "/abc" << "def/" << "ghi/jkl";
 | 
			
		||||
		QTest::newRow("qt 4") << "/abc/def/ghi/jkl" << "/abc/" << "def/" << "ghi/jkl";
 | 
			
		||||
#if defined(Q_OS_WIN)
 | 
			
		||||
		QTest::newRow("win 1") << "C:/abc/def/ghi/jkl" << "C:\\abc" << "def" << "ghi\\jkl";
 | 
			
		||||
		QTest::newRow("win 2") << "C:/abc/def/ghi/jkl" << "C:\\abc\\" << "def" << "ghi\\jkl";
 | 
			
		||||
		QTest::newRow("win 3") << "C:/abc/def/ghi/jkl" << "C:\\abc" << "def\\" << "ghi\\jkl";
 | 
			
		||||
		QTest::newRow("win 4") << "C:/abc/def/ghi/jkl" << "C:\\abc\\" << "def" << "ghi\\jkl";
 | 
			
		||||
#endif
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_PathCombine2()
 | 
			
		||||
	{
 | 
			
		||||
		QFETCH(QString, result);
 | 
			
		||||
		QFETCH(QString, path1);
 | 
			
		||||
		QFETCH(QString, path2);
 | 
			
		||||
		QFETCH(QString, path3);
 | 
			
		||||
 | 
			
		||||
		QCOMPARE(FS::PathCombine(path1, path2, path3), result);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_copy()
 | 
			
		||||
	{
 | 
			
		||||
		QString folder = QFINDTESTDATA("data/test_folder");
 | 
			
		||||
		auto f = [&folder]()
 | 
			
		||||
		{
 | 
			
		||||
			QTemporaryDir tempDir;
 | 
			
		||||
			tempDir.setAutoRemove(true);
 | 
			
		||||
			qDebug() << "From:" << folder << "To:" << tempDir.path();
 | 
			
		||||
 | 
			
		||||
			QDir target_dir(FS::PathCombine(tempDir.path(), "test_folder"));
 | 
			
		||||
			qDebug() << tempDir.path();
 | 
			
		||||
			qDebug() << target_dir.path();
 | 
			
		||||
			FS::copy c(folder, target_dir.path());
 | 
			
		||||
			c();
 | 
			
		||||
 | 
			
		||||
			for(auto entry: target_dir.entryList())
 | 
			
		||||
			{
 | 
			
		||||
				qDebug() << entry;
 | 
			
		||||
			}
 | 
			
		||||
			QVERIFY(target_dir.entryList().contains("pack.mcmeta"));
 | 
			
		||||
			QVERIFY(target_dir.entryList().contains("assets"));
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		// first try variant without trailing /
 | 
			
		||||
		QVERIFY(!folder.endsWith('/'));
 | 
			
		||||
		f();
 | 
			
		||||
 | 
			
		||||
		// then variant with trailing /
 | 
			
		||||
		folder.append('/');
 | 
			
		||||
		QVERIFY(folder.endsWith('/'));
 | 
			
		||||
		f();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_getDesktop()
 | 
			
		||||
	{
 | 
			
		||||
		QCOMPARE(FS::getDesktopDir(), QStandardPaths::writableLocation(QStandardPaths::DesktopLocation));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
// this is only valid on linux
 | 
			
		||||
// FIXME: implement on windows, OSX, then test.
 | 
			
		||||
#if defined(Q_OS_LINUX)
 | 
			
		||||
	void test_createShortcut_data()
 | 
			
		||||
	{
 | 
			
		||||
		QTest::addColumn<QString>("location");
 | 
			
		||||
		QTest::addColumn<QString>("dest");
 | 
			
		||||
		QTest::addColumn<QStringList>("args");
 | 
			
		||||
		QTest::addColumn<QString>("name");
 | 
			
		||||
		QTest::addColumn<QString>("iconLocation");
 | 
			
		||||
		QTest::addColumn<QByteArray>("result");
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("unix") << QDir::currentPath()
 | 
			
		||||
							  << "asdfDest"
 | 
			
		||||
							  << (QStringList() << "arg1" << "arg2")
 | 
			
		||||
							  << "asdf"
 | 
			
		||||
							  << QString()
 | 
			
		||||
						 #if defined(Q_OS_LINUX)
 | 
			
		||||
							  << MULTIMC_GET_TEST_FILE("data/FileSystem-test_createShortcut-unix")
 | 
			
		||||
						 #elif defined(Q_OS_WIN)
 | 
			
		||||
							  << QByteArray()
 | 
			
		||||
						 #endif
 | 
			
		||||
								 ;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_createShortcut()
 | 
			
		||||
	{
 | 
			
		||||
		QFETCH(QString, location);
 | 
			
		||||
		QFETCH(QString, dest);
 | 
			
		||||
		QFETCH(QStringList, args);
 | 
			
		||||
		QFETCH(QString, name);
 | 
			
		||||
		QFETCH(QString, iconLocation);
 | 
			
		||||
		QFETCH(QByteArray, result);
 | 
			
		||||
 | 
			
		||||
		QVERIFY(FS::createShortCut(location, dest, args, name, iconLocation));
 | 
			
		||||
		QCOMPARE(QString::fromLocal8Bit(TestsInternal::readFile(location + QDir::separator() + name + ".desktop")), QString::fromLocal8Bit(result));
 | 
			
		||||
 | 
			
		||||
		//QDir().remove(location);
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
QTEST_GUILESS_MAIN(FileSystemTest)
 | 
			
		||||
 | 
			
		||||
#include "FileSystem_test.moc"
 | 
			
		||||
							
								
								
									
										57
									
								
								api/logic/GZip_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								api/logic/GZip_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
#include <QTest>
 | 
			
		||||
#include "TestUtil.h"
 | 
			
		||||
 | 
			
		||||
#include "GZip.h"
 | 
			
		||||
#include <random>
 | 
			
		||||
 | 
			
		||||
void fib(int &prev, int &cur)
 | 
			
		||||
{
 | 
			
		||||
	auto ret = prev + cur;
 | 
			
		||||
	prev = cur;
 | 
			
		||||
	cur = ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class GZipTest : public QObject
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
private
 | 
			
		||||
slots:
 | 
			
		||||
 | 
			
		||||
	void test_Through()
 | 
			
		||||
	{
 | 
			
		||||
		// test up to 10 MB
 | 
			
		||||
		static const int size = 10 * 1024 * 1024;
 | 
			
		||||
		QByteArray random;
 | 
			
		||||
		QByteArray compressed;
 | 
			
		||||
		QByteArray decompressed;
 | 
			
		||||
		std::default_random_engine eng((std::random_device())());
 | 
			
		||||
		std::uniform_int_distribution<uint8_t> idis(0, std::numeric_limits<uint8_t>::max());
 | 
			
		||||
 | 
			
		||||
		// initialize random buffer
 | 
			
		||||
		for(int i = 0; i < size; i++)
 | 
			
		||||
		{
 | 
			
		||||
			random.append((char)idis(eng));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// initialize fibonacci
 | 
			
		||||
		int prev = 1;
 | 
			
		||||
		int cur = 1;
 | 
			
		||||
 | 
			
		||||
		// test if fibonacci long random buffers pass through GZip
 | 
			
		||||
		do
 | 
			
		||||
		{
 | 
			
		||||
			QByteArray copy = random;
 | 
			
		||||
			copy.resize(cur);
 | 
			
		||||
			compressed.clear();
 | 
			
		||||
			decompressed.clear();
 | 
			
		||||
			QVERIFY(GZip::zip(copy, compressed));
 | 
			
		||||
			QVERIFY(GZip::unzip(compressed, decompressed));
 | 
			
		||||
			QCOMPARE(decompressed, copy);
 | 
			
		||||
			fib(prev, cur);
 | 
			
		||||
		} while (cur < size);
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
QTEST_GUILESS_MAIN(GZipTest)
 | 
			
		||||
 | 
			
		||||
#include "GZip_test.moc"
 | 
			
		||||
							
								
								
									
										123
									
								
								api/logic/Version_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								api/logic/Version_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,123 @@
 | 
			
		||||
/* Copyright 2013-2015 MultiMC Contributors
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <QTest>
 | 
			
		||||
 | 
			
		||||
#include "TestUtil.h"
 | 
			
		||||
#include <Version.h>
 | 
			
		||||
 | 
			
		||||
class ModUtilsTest : public QObject
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
	void setupVersions()
 | 
			
		||||
	{
 | 
			
		||||
		QTest::addColumn<QString>("first");
 | 
			
		||||
		QTest::addColumn<QString>("second");
 | 
			
		||||
		QTest::addColumn<bool>("lessThan");
 | 
			
		||||
		QTest::addColumn<bool>("equal");
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("equal, explicit") << "1.2.0" << "1.2.0" << false << true;
 | 
			
		||||
		QTest::newRow("equal, implicit 1") << "1.2" << "1.2.0" << false << true;
 | 
			
		||||
		QTest::newRow("equal, implicit 2") << "1.2.0" << "1.2" << false << true;
 | 
			
		||||
		QTest::newRow("equal, two-digit") << "1.42" << "1.42" << false << true;
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("lessThan, explicit 1") << "1.2.0" << "1.2.1" << true << false;
 | 
			
		||||
		QTest::newRow("lessThan, explicit 2") << "1.2.0" << "1.3.0" << true << false;
 | 
			
		||||
		QTest::newRow("lessThan, explicit 3") << "1.2.0" << "2.2.0" << true << false;
 | 
			
		||||
		QTest::newRow("lessThan, implicit 1") << "1.2" << "1.2.1" << true << false;
 | 
			
		||||
		QTest::newRow("lessThan, implicit 2") << "1.2" << "1.3.0" << true << false;
 | 
			
		||||
		QTest::newRow("lessThan, implicit 3") << "1.2" << "2.2.0" << true << false;
 | 
			
		||||
		QTest::newRow("lessThan, two-digit") << "1.41" << "1.42" << true << false;
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("greaterThan, explicit 1") << "1.2.1" << "1.2.0" << false << false;
 | 
			
		||||
		QTest::newRow("greaterThan, explicit 2") << "1.3.0" << "1.2.0" << false << false;
 | 
			
		||||
		QTest::newRow("greaterThan, explicit 3") << "2.2.0" << "1.2.0" << false << false;
 | 
			
		||||
		QTest::newRow("greaterThan, implicit 1") << "1.2.1" << "1.2" << false << false;
 | 
			
		||||
		QTest::newRow("greaterThan, implicit 2") << "1.3.0" << "1.2" << false << false;
 | 
			
		||||
		QTest::newRow("greaterThan, implicit 3") << "2.2.0" << "1.2" << false << false;
 | 
			
		||||
		QTest::newRow("greaterThan, two-digit") << "1.42" << "1.41" << false << false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
private slots:
 | 
			
		||||
	void initTestCase()
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	void cleanupTestCase()
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_versionIsInInterval_data()
 | 
			
		||||
	{
 | 
			
		||||
		QTest::addColumn<QString>("version");
 | 
			
		||||
		QTest::addColumn<QString>("interval");
 | 
			
		||||
		QTest::addColumn<bool>("result");
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("empty, true") << "1.2.3" << "" << true;
 | 
			
		||||
		QTest::newRow("one version, true") << "1.2.3" << "1.2.3" << true;
 | 
			
		||||
		QTest::newRow("one version, false") << "1.2.3" << "1.2.2" << false;
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("one version inclusive <-> infinity, true") << "1.2.3" << "[1.2.3,)" << true;
 | 
			
		||||
		QTest::newRow("one version exclusive <-> infinity, true") << "1.2.3" << "(1.2.2,)" << true;
 | 
			
		||||
		QTest::newRow("one version inclusive <-> infitity, false") << "1.2.3" << "[1.2.4,)" << false;
 | 
			
		||||
		QTest::newRow("one version exclusive <-> infinity, false") << "1.2.3" << "(1.2.3,)" << false;
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("infinity <-> one version inclusive, true") << "1.2.3" << "(,1.2.3]" << true;
 | 
			
		||||
		QTest::newRow("infinity <-> one version exclusive, true") << "1.2.3" << "(,1.2.4)" << true;
 | 
			
		||||
		QTest::newRow("infinity <-> one version inclusive, false") << "1.2.3" << "(,1.2.2]" << false;
 | 
			
		||||
		QTest::newRow("infinity <-> one version exclusive, false") << "1.2.3" << "(,1.2.3)" << false;
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("inclusive <-> inclusive, true") << "1.2.3" << "[1.2.2,1.2.3]" << true;
 | 
			
		||||
		QTest::newRow("inclusive <-> exclusive, true") << "1.2.3" << "[1.2.3,1.2.4)" << true;
 | 
			
		||||
		QTest::newRow("exclusive <-> inclusive, true") << "1.2.3" << "(1.2.2,1.2.3]" << true;
 | 
			
		||||
		QTest::newRow("exclusive <-> exclusive, true") << "1.2.3" << "(1.2.2,1.2.4)" << true;
 | 
			
		||||
		QTest::newRow("inclusive <-> inclusive, false") << "1.2.3" << "[1.0.0,1.2.2]" << false;
 | 
			
		||||
		QTest::newRow("inclusive <-> exclusive, false") << "1.2.3" << "[1.0.0,1.2.3)" << false;
 | 
			
		||||
		QTest::newRow("exclusive <-> inclusive, false") << "1.2.3" << "(1.2.3,2.0.0]" << false;
 | 
			
		||||
		QTest::newRow("exclusive <-> exclusive, false") << "1.2.3" << "(1.0.0,1.2.3)" << false;
 | 
			
		||||
	}
 | 
			
		||||
	void test_versionIsInInterval()
 | 
			
		||||
	{
 | 
			
		||||
		QFETCH(QString, version);
 | 
			
		||||
		QFETCH(QString, interval);
 | 
			
		||||
		QFETCH(bool, result);
 | 
			
		||||
 | 
			
		||||
		QCOMPARE(versionIsInInterval(version, interval), result);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_versionCompare_data()
 | 
			
		||||
	{
 | 
			
		||||
		setupVersions();
 | 
			
		||||
	}
 | 
			
		||||
	void test_versionCompare()
 | 
			
		||||
	{
 | 
			
		||||
		QFETCH(QString, first);
 | 
			
		||||
		QFETCH(QString, second);
 | 
			
		||||
		QFETCH(bool, lessThan);
 | 
			
		||||
		QFETCH(bool, equal);
 | 
			
		||||
 | 
			
		||||
		const auto v1 = Version(first);
 | 
			
		||||
		const auto v2 = Version(second);
 | 
			
		||||
 | 
			
		||||
		QCOMPARE(v1 < v2, lessThan);
 | 
			
		||||
		QCOMPARE(v1 > v2, !lessThan && !equal);
 | 
			
		||||
		QCOMPARE(v1 == v2, equal);
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
QTEST_GUILESS_MAIN(ModUtilsTest)
 | 
			
		||||
 | 
			
		||||
#include "Version_test.moc"
 | 
			
		||||
							
								
								
									
										116
									
								
								api/logic/java/JavaVersion_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								api/logic/java/JavaVersion_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,116 @@
 | 
			
		||||
#include <QTest>
 | 
			
		||||
#include "TestUtil.h"
 | 
			
		||||
 | 
			
		||||
#include "java/JavaVersion.h"
 | 
			
		||||
 | 
			
		||||
class JavaVersionTest : public QObject
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
private
 | 
			
		||||
slots:
 | 
			
		||||
	void test_Parse_data()
 | 
			
		||||
	{
 | 
			
		||||
		QTest::addColumn<QString>("string");
 | 
			
		||||
		QTest::addColumn<int>("major");
 | 
			
		||||
		QTest::addColumn<int>("minor");
 | 
			
		||||
		QTest::addColumn<int>("security");
 | 
			
		||||
		QTest::addColumn<QString>("prerelease");
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("old format") << "1.6.0_33" << 6 << 0 << 33 << QString();
 | 
			
		||||
		QTest::newRow("old format prerelease") << "1.9.0_1-ea" << 9 << 0 << 1 << "ea";
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("new format major") << "9" << 9 << 0 << 0 << QString();
 | 
			
		||||
		QTest::newRow("new format minor") << "9.1" << 9 << 1 << 0 << QString();
 | 
			
		||||
		QTest::newRow("new format security") << "9.0.1" << 9 << 0 << 1 << QString();
 | 
			
		||||
		QTest::newRow("new format prerelease") << "9-ea" << 9 << 0 << 0 << "ea";
 | 
			
		||||
		QTest::newRow("new format long prerelease") << "9.0.1-ea" << 9 << 0 << 1 << "ea";
 | 
			
		||||
	}
 | 
			
		||||
	void test_Parse()
 | 
			
		||||
	{
 | 
			
		||||
		QFETCH(QString, string);
 | 
			
		||||
		QFETCH(int, major);
 | 
			
		||||
		QFETCH(int, minor);
 | 
			
		||||
		QFETCH(int, security);
 | 
			
		||||
		QFETCH(QString, prerelease);
 | 
			
		||||
 | 
			
		||||
		JavaVersion test(string);
 | 
			
		||||
		QCOMPARE(test.string, string);
 | 
			
		||||
		QCOMPARE(test.toString(), string);
 | 
			
		||||
		QCOMPARE(test.major, major);
 | 
			
		||||
		QCOMPARE(test.minor, minor);
 | 
			
		||||
		QCOMPARE(test.security, security);
 | 
			
		||||
		QCOMPARE(test.prerelease, prerelease);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_Sort_data()
 | 
			
		||||
	{
 | 
			
		||||
		QTest::addColumn<QString>("lhs");
 | 
			
		||||
		QTest::addColumn<QString>("rhs");
 | 
			
		||||
		QTest::addColumn<bool>("smaller");
 | 
			
		||||
		QTest::addColumn<bool>("equal");
 | 
			
		||||
		QTest::addColumn<bool>("bigger");
 | 
			
		||||
 | 
			
		||||
		// old format and new format equivalence
 | 
			
		||||
		QTest::newRow("1.6.0_33 == 6.0.33") << "1.6.0_33" << "6.0.33" << false << true << false;
 | 
			
		||||
		// old format major version
 | 
			
		||||
		QTest::newRow("1.5.0_33 < 1.6.0_33") << "1.5.0_33" << "1.6.0_33" << true << false << false;
 | 
			
		||||
		// new format - first release vs first security patch
 | 
			
		||||
		QTest::newRow("9 < 9.0.1") << "9" << "9.0.1" << true << false << false;
 | 
			
		||||
		QTest::newRow("9.0.1 > 9") << "9.0.1" << "9" << false << false << true;
 | 
			
		||||
		// new format - first minor vs first release/security patch
 | 
			
		||||
		QTest::newRow("9.1 > 9.0.1") << "9.1" << "9.0.1" << false << false << true;
 | 
			
		||||
		QTest::newRow("9.0.1 < 9.1") << "9.0.1" << "9.1" << true << false << false;
 | 
			
		||||
		QTest::newRow("9.1 > 9") << "9.1" << "9" << false << false << true;
 | 
			
		||||
		QTest::newRow("9 > 9.1") << "9" << "9.1" << true << false << false;
 | 
			
		||||
		// new format - omitted numbers
 | 
			
		||||
		QTest::newRow("9 == 9.0") << "9" << "9.0" << false << true << false;
 | 
			
		||||
		QTest::newRow("9 == 9.0.0") << "9" << "9.0.0" << false << true << false;
 | 
			
		||||
		QTest::newRow("9.0 == 9.0.0") << "9.0" << "9.0.0" << false << true << false;
 | 
			
		||||
		// early access and prereleases compared to final release
 | 
			
		||||
		QTest::newRow("9-ea < 9") << "9-ea" << "9" << true << false << false;
 | 
			
		||||
		QTest::newRow("9 < 9.0.1-ea") << "9" << "9.0.1-ea" << true << false << false;
 | 
			
		||||
		QTest::newRow("9.0.1-ea > 9") << "9.0.1-ea" << "9" << false << false << true;
 | 
			
		||||
		// prerelease difference only testing
 | 
			
		||||
		QTest::newRow("9-1 == 9-1") << "9-1" << "9-1" << false << true << false;
 | 
			
		||||
		QTest::newRow("9-1 < 9-2") << "9-1" << "9-2" << true << false << false;
 | 
			
		||||
		QTest::newRow("9-5 < 9-20") << "9-5" << "9-20" << true << false << false;
 | 
			
		||||
		QTest::newRow("9-rc1 < 9-rc2") << "9-rc1" << "9-rc2" << true << false << false;
 | 
			
		||||
		QTest::newRow("9-rc5 < 9-rc20") << "9-rc5" << "9-rc20" << true << false << false;
 | 
			
		||||
		QTest::newRow("9-rc < 9-rc2") << "9-rc" << "9-rc2" << true << false << false;
 | 
			
		||||
		QTest::newRow("9-ea < 9-rc") << "9-ea" << "9-rc" << true << false << false;
 | 
			
		||||
	}
 | 
			
		||||
	void test_Sort()
 | 
			
		||||
	{
 | 
			
		||||
		QFETCH(QString, lhs);
 | 
			
		||||
		QFETCH(QString, rhs);
 | 
			
		||||
		QFETCH(bool, smaller);
 | 
			
		||||
		QFETCH(bool, equal);
 | 
			
		||||
		QFETCH(bool, bigger);
 | 
			
		||||
		JavaVersion lver(lhs);
 | 
			
		||||
		JavaVersion rver(rhs);
 | 
			
		||||
		QCOMPARE(lver < rver, smaller);
 | 
			
		||||
		QCOMPARE(lver == rver, equal);
 | 
			
		||||
		QCOMPARE(lver > rver, bigger);
 | 
			
		||||
	}
 | 
			
		||||
	void test_PermGen_data()
 | 
			
		||||
	{
 | 
			
		||||
		QTest::addColumn<QString>("version");
 | 
			
		||||
		QTest::addColumn<bool>("needs_permgen");
 | 
			
		||||
		QTest::newRow("1.6.0_33") << "1.6.0_33" << true;
 | 
			
		||||
		QTest::newRow("1.7.0_60") << "1.7.0_60" << true;
 | 
			
		||||
		QTest::newRow("1.8.0_22") << "1.8.0_22" << false;
 | 
			
		||||
		QTest::newRow("9-ea") << "9-ea" << false;
 | 
			
		||||
		QTest::newRow("9.2.4") << "9.2.4" << false;
 | 
			
		||||
	}
 | 
			
		||||
	void test_PermGen()
 | 
			
		||||
	{
 | 
			
		||||
		QFETCH(QString, version);
 | 
			
		||||
		QFETCH(bool, needs_permgen);
 | 
			
		||||
		JavaVersion v(version);
 | 
			
		||||
		QCOMPARE(needs_permgen, v.requiresPermGen());
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
QTEST_GUILESS_MAIN(JavaVersionTest)
 | 
			
		||||
 | 
			
		||||
#include "JavaVersion_test.moc"
 | 
			
		||||
							
								
								
									
										77
									
								
								api/logic/minecraft/GradleSpecifier_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								api/logic/minecraft/GradleSpecifier_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
			
		||||
#include <QTest>
 | 
			
		||||
#include "TestUtil.h"
 | 
			
		||||
 | 
			
		||||
#include "minecraft/GradleSpecifier.h"
 | 
			
		||||
 | 
			
		||||
class GradleSpecifierTest : public QObject
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
private
 | 
			
		||||
slots:
 | 
			
		||||
	void initTestCase()
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	void cleanupTestCase()
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_Positive_data()
 | 
			
		||||
	{
 | 
			
		||||
		QTest::addColumn<QString>("through");
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("3 parter") << "org.gradle.test.classifiers:service:1.0";
 | 
			
		||||
		QTest::newRow("classifier") << "org.gradle.test.classifiers:service:1.0:jdk15";
 | 
			
		||||
		QTest::newRow("jarextension") << "org.gradle.test.classifiers:service:1.0@jar";
 | 
			
		||||
		QTest::newRow("jarboth") << "org.gradle.test.classifiers:service:1.0:jdk15@jar";
 | 
			
		||||
		QTest::newRow("packxz") << "org.gradle.test.classifiers:service:1.0:jdk15@jar.pack.xz";
 | 
			
		||||
	}
 | 
			
		||||
	void test_Positive()
 | 
			
		||||
	{
 | 
			
		||||
		QFETCH(QString, through);
 | 
			
		||||
 | 
			
		||||
		QString converted = GradleSpecifier(through);
 | 
			
		||||
 | 
			
		||||
		QCOMPARE(converted, through);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_Path_data()
 | 
			
		||||
	{
 | 
			
		||||
		QTest::addColumn<QString>("spec");
 | 
			
		||||
		QTest::addColumn<QString>("expected");
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("3 parter") << "group.id:artifact:1.0" << "group/id/artifact/1.0/artifact-1.0.jar";
 | 
			
		||||
		QTest::newRow("doom") << "id.software:doom:1.666:demons@wad" << "id/software/doom/1.666/doom-1.666-demons.wad";
 | 
			
		||||
	}
 | 
			
		||||
	void test_Path()
 | 
			
		||||
	{
 | 
			
		||||
		QFETCH(QString, spec);
 | 
			
		||||
		QFETCH(QString, expected);
 | 
			
		||||
 | 
			
		||||
		QString converted = GradleSpecifier(spec).toPath();
 | 
			
		||||
 | 
			
		||||
		QCOMPARE(converted, expected);
 | 
			
		||||
	}
 | 
			
		||||
	void test_Negative_data()
 | 
			
		||||
	{
 | 
			
		||||
		QTest::addColumn<QString>("input");
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("too many :") << "org:gradle.test:class:::ifiers:service:1.0::";
 | 
			
		||||
		QTest::newRow("nonsense") << "I like turtles";
 | 
			
		||||
		QTest::newRow("empty string") << "";
 | 
			
		||||
		QTest::newRow("missing version") << "herp.derp:artifact";
 | 
			
		||||
	}
 | 
			
		||||
	void test_Negative()
 | 
			
		||||
	{
 | 
			
		||||
		QFETCH(QString, input);
 | 
			
		||||
 | 
			
		||||
		GradleSpecifier spec(input);
 | 
			
		||||
		QVERIFY(!spec.valid());
 | 
			
		||||
		QCOMPARE(spec.operator QString(), QString("INVALID"));
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
QTEST_GUILESS_MAIN(GradleSpecifierTest)
 | 
			
		||||
 | 
			
		||||
#include "GradleSpecifier_test.moc"
 | 
			
		||||
							
								
								
									
										195
									
								
								api/logic/minecraft/Library_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								api/logic/minecraft/Library_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,195 @@
 | 
			
		||||
#include <QTest>
 | 
			
		||||
#include "TestUtil.h"
 | 
			
		||||
 | 
			
		||||
#include "minecraft/MojangVersionFormat.h"
 | 
			
		||||
#include "minecraft/onesix/OneSixVersionFormat.h"
 | 
			
		||||
#include "minecraft/Library.h"
 | 
			
		||||
#include "net/HttpMetaCache.h"
 | 
			
		||||
#include "FileSystem.h"
 | 
			
		||||
 | 
			
		||||
class LibraryTest : public QObject
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
private:
 | 
			
		||||
	LibraryPtr readMojangJson(const char *file)
 | 
			
		||||
	{
 | 
			
		||||
		auto path = QFINDTESTDATA(file);
 | 
			
		||||
		QFile jsonFile(path);
 | 
			
		||||
		jsonFile.open(QIODevice::ReadOnly);
 | 
			
		||||
		auto data = jsonFile.readAll();
 | 
			
		||||
		jsonFile.close();
 | 
			
		||||
		return MojangVersionFormat::libraryFromJson(QJsonDocument::fromJson(data).object(), file);
 | 
			
		||||
	}
 | 
			
		||||
	// get absolute path to expected storage, assuming default cache prefix
 | 
			
		||||
	QStringList getStorage(QString relative)
 | 
			
		||||
	{
 | 
			
		||||
		return {FS::PathCombine(cache->getBasePath("libraries"), relative)};
 | 
			
		||||
	}
 | 
			
		||||
private
 | 
			
		||||
slots:
 | 
			
		||||
	void initTestCase()
 | 
			
		||||
	{
 | 
			
		||||
		cache.reset(new HttpMetaCache());
 | 
			
		||||
		cache->addBase("libraries", QDir("libraries").absolutePath());
 | 
			
		||||
	}
 | 
			
		||||
	void test_legacy()
 | 
			
		||||
	{
 | 
			
		||||
		Library test("test.package:testname:testversion");
 | 
			
		||||
		QCOMPARE(test.artifactPrefix(), QString("test.package:testname"));
 | 
			
		||||
		QCOMPARE(test.isNative(), false);
 | 
			
		||||
 | 
			
		||||
		QStringList jar, native, native32, native64;
 | 
			
		||||
		test.getApplicableFiles(currentSystem, jar, native, native32, native64);
 | 
			
		||||
		QCOMPARE(jar, getStorage("test/package/testname/testversion/testname-testversion.jar"));
 | 
			
		||||
		QCOMPARE(native, {});
 | 
			
		||||
		QCOMPARE(native32, {});
 | 
			
		||||
		QCOMPARE(native64, {});
 | 
			
		||||
	}
 | 
			
		||||
	void test_legacy_url()
 | 
			
		||||
	{
 | 
			
		||||
		QStringList failedFiles;
 | 
			
		||||
		Library test("test.package:testname:testversion");
 | 
			
		||||
		test.setRepositoryURL("file://foo/bar");
 | 
			
		||||
		auto downloads = test.getDownloads(currentSystem, cache.get(), failedFiles);
 | 
			
		||||
		QCOMPARE(downloads.size(), 1);
 | 
			
		||||
		QCOMPARE(failedFiles, {});
 | 
			
		||||
		NetActionPtr dl = downloads[0];
 | 
			
		||||
		QCOMPARE(dl->m_url, QUrl("file://foo/bar/test/package/testname/testversion/testname-testversion.jar"));
 | 
			
		||||
	}
 | 
			
		||||
	void test_legacy_url_local_broken()
 | 
			
		||||
	{
 | 
			
		||||
		Library test("test.package:testname:testversion");
 | 
			
		||||
		QCOMPARE(test.isNative(), false);
 | 
			
		||||
		QStringList failedFiles;
 | 
			
		||||
		test.setHint("local");
 | 
			
		||||
		auto downloads = test.getDownloads(currentSystem, cache.get(), failedFiles);
 | 
			
		||||
		QCOMPARE(downloads.size(), 0);
 | 
			
		||||
		QCOMPARE(failedFiles, getStorage("test/package/testname/testversion/testname-testversion.jar"));
 | 
			
		||||
	}
 | 
			
		||||
	void test_legacy_native()
 | 
			
		||||
	{
 | 
			
		||||
		Library test("test.package:testname:testversion");
 | 
			
		||||
		test.m_nativeClassifiers[OpSys::Os_Linux]="linux";
 | 
			
		||||
		QCOMPARE(test.isNative(), true);
 | 
			
		||||
		test.setRepositoryURL("file://foo/bar");
 | 
			
		||||
		{
 | 
			
		||||
			QStringList jar, native, native32, native64;
 | 
			
		||||
			test.getApplicableFiles(Os_Linux, jar, native, native32, native64);
 | 
			
		||||
			QCOMPARE(jar, {});
 | 
			
		||||
			QCOMPARE(native, getStorage("test/package/testname/testversion/testname-testversion-linux.jar"));
 | 
			
		||||
			QCOMPARE(native32, {});
 | 
			
		||||
			QCOMPARE(native64, {});
 | 
			
		||||
			QStringList failedFiles;
 | 
			
		||||
			auto dls = test.getDownloads(Os_Linux, cache.get(), failedFiles);
 | 
			
		||||
			QCOMPARE(dls.size(), 1);
 | 
			
		||||
			QCOMPARE(failedFiles, {});
 | 
			
		||||
			auto dl = dls[0];
 | 
			
		||||
			QCOMPARE(dl->m_url, QUrl("file://foo/bar/test/package/testname/testversion/testname-testversion-linux.jar"));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	void test_legacy_native_arch()
 | 
			
		||||
	{
 | 
			
		||||
		Library test("test.package:testname:testversion");
 | 
			
		||||
		test.m_nativeClassifiers[OpSys::Os_Linux]="linux-${arch}";
 | 
			
		||||
		test.m_nativeClassifiers[OpSys::Os_OSX]="osx-${arch}";
 | 
			
		||||
		test.m_nativeClassifiers[OpSys::Os_Windows]="windows-${arch}";
 | 
			
		||||
		QCOMPARE(test.isNative(), true);
 | 
			
		||||
		test.setRepositoryURL("file://foo/bar");
 | 
			
		||||
		{
 | 
			
		||||
			QStringList jar, native, native32, native64;
 | 
			
		||||
			test.getApplicableFiles(Os_Linux, jar, native, native32, native64);
 | 
			
		||||
			QCOMPARE(jar, {});
 | 
			
		||||
			QCOMPARE(native, {});
 | 
			
		||||
			QCOMPARE(native32, getStorage("test/package/testname/testversion/testname-testversion-linux-32.jar"));
 | 
			
		||||
			QCOMPARE(native64, getStorage("test/package/testname/testversion/testname-testversion-linux-64.jar"));
 | 
			
		||||
			QStringList failedFiles;
 | 
			
		||||
			auto dls = test.getDownloads(Os_Linux, cache.get(), failedFiles);
 | 
			
		||||
			QCOMPARE(dls.size(), 2);
 | 
			
		||||
			QCOMPARE(failedFiles, {});
 | 
			
		||||
			QCOMPARE(dls[0]->m_url, QUrl("file://foo/bar/test/package/testname/testversion/testname-testversion-linux-32.jar"));
 | 
			
		||||
			QCOMPARE(dls[1]->m_url, QUrl("file://foo/bar/test/package/testname/testversion/testname-testversion-linux-64.jar"));
 | 
			
		||||
		}
 | 
			
		||||
		{
 | 
			
		||||
			QStringList jar, native, native32, native64;
 | 
			
		||||
			test.getApplicableFiles(Os_Windows, jar, native, native32, native64);
 | 
			
		||||
			QCOMPARE(jar, {});
 | 
			
		||||
			QCOMPARE(native, {});
 | 
			
		||||
			QCOMPARE(native32, getStorage("test/package/testname/testversion/testname-testversion-windows-32.jar"));
 | 
			
		||||
			QCOMPARE(native64, getStorage("test/package/testname/testversion/testname-testversion-windows-64.jar"));
 | 
			
		||||
			QStringList failedFiles;
 | 
			
		||||
			auto dls = test.getDownloads(Os_Windows, cache.get(), failedFiles);
 | 
			
		||||
			QCOMPARE(dls.size(), 2);
 | 
			
		||||
			QCOMPARE(failedFiles, {});
 | 
			
		||||
			QCOMPARE(dls[0]->m_url, QUrl("file://foo/bar/test/package/testname/testversion/testname-testversion-windows-32.jar"));
 | 
			
		||||
			QCOMPARE(dls[1]->m_url, QUrl("file://foo/bar/test/package/testname/testversion/testname-testversion-windows-64.jar"));
 | 
			
		||||
		}
 | 
			
		||||
		{
 | 
			
		||||
			QStringList jar, native, native32, native64;
 | 
			
		||||
			test.getApplicableFiles(Os_OSX, jar, native, native32, native64);
 | 
			
		||||
			QCOMPARE(jar, {});
 | 
			
		||||
			QCOMPARE(native, {});
 | 
			
		||||
			QCOMPARE(native32, getStorage("test/package/testname/testversion/testname-testversion-osx-32.jar"));
 | 
			
		||||
			QCOMPARE(native64, getStorage("test/package/testname/testversion/testname-testversion-osx-64.jar"));
 | 
			
		||||
			QStringList failedFiles;
 | 
			
		||||
			auto dls = test.getDownloads(Os_OSX, cache.get(), failedFiles);
 | 
			
		||||
			QCOMPARE(dls.size(), 2);
 | 
			
		||||
			QCOMPARE(failedFiles, {});
 | 
			
		||||
			QCOMPARE(dls[0]->m_url, QUrl("file://foo/bar/test/package/testname/testversion/testname-testversion-osx-32.jar"));
 | 
			
		||||
			QCOMPARE(dls[1]->m_url, QUrl("file://foo/bar/test/package/testname/testversion/testname-testversion-osx-64.jar"));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	void test_onenine()
 | 
			
		||||
	{
 | 
			
		||||
		auto test = readMojangJson("data/lib-simple.json");
 | 
			
		||||
		QStringList jar, native, native32, native64;
 | 
			
		||||
		test->getApplicableFiles(Os_OSX, jar, native, native32, native64);
 | 
			
		||||
		QCOMPARE(jar, getStorage("com/paulscode/codecwav/20101023/codecwav-20101023.jar"));
 | 
			
		||||
		QCOMPARE(native, {});
 | 
			
		||||
		QCOMPARE(native32, {});
 | 
			
		||||
		QCOMPARE(native64, {});
 | 
			
		||||
		QStringList failedFiles;
 | 
			
		||||
		auto dls = test->getDownloads(Os_Linux, cache.get(), failedFiles);
 | 
			
		||||
		QCOMPARE(dls.size(), 1);
 | 
			
		||||
		QCOMPARE(failedFiles, {});
 | 
			
		||||
		QCOMPARE(dls[0]->m_url, QUrl("https://libraries.minecraft.net/com/paulscode/codecwav/20101023/codecwav-20101023.jar"));
 | 
			
		||||
	}
 | 
			
		||||
	void test_onenine_native()
 | 
			
		||||
	{
 | 
			
		||||
		auto test = readMojangJson("data/lib-native.json");
 | 
			
		||||
		QStringList jar, native, native32, native64;
 | 
			
		||||
		test->getApplicableFiles(Os_OSX, jar, native, native32, native64);
 | 
			
		||||
		QCOMPARE(jar, getStorage("org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209.jar"));
 | 
			
		||||
		QCOMPARE(native, getStorage("org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar"));
 | 
			
		||||
		QCOMPARE(native32, {});
 | 
			
		||||
		QCOMPARE(native64, {});
 | 
			
		||||
		QStringList failedFiles;
 | 
			
		||||
		auto dls = test->getDownloads(Os_OSX, cache.get(), failedFiles);
 | 
			
		||||
		QCOMPARE(dls.size(), 2);
 | 
			
		||||
		QCOMPARE(failedFiles, {});
 | 
			
		||||
		QCOMPARE(dls[0]->m_url, QUrl("https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209.jar"));
 | 
			
		||||
		QCOMPARE(dls[1]->m_url, QUrl("https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar"));
 | 
			
		||||
	}
 | 
			
		||||
	void test_onenine_native_arch()
 | 
			
		||||
	{
 | 
			
		||||
		auto test = readMojangJson("data/lib-native-arch.json");
 | 
			
		||||
		QStringList jar, native, native32, native64;
 | 
			
		||||
		test->getApplicableFiles(Os_Windows, jar, native, native32, native64);
 | 
			
		||||
		QCOMPARE(jar, {});
 | 
			
		||||
		QCOMPARE(native, {});
 | 
			
		||||
		QCOMPARE(native32, getStorage("tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-32.jar"));
 | 
			
		||||
		QCOMPARE(native64, getStorage("tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-64.jar"));
 | 
			
		||||
		QStringList failedFiles;
 | 
			
		||||
		auto dls = test->getDownloads(Os_Windows, cache.get(), failedFiles);
 | 
			
		||||
		QCOMPARE(dls.size(), 2);
 | 
			
		||||
		QCOMPARE(failedFiles, {});
 | 
			
		||||
		QCOMPARE(dls[0]->m_url, QUrl("https://libraries.minecraft.net/tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-32.jar"));
 | 
			
		||||
		QCOMPARE(dls[1]->m_url, QUrl("https://libraries.minecraft.net/tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-64.jar"));
 | 
			
		||||
	}
 | 
			
		||||
private:
 | 
			
		||||
	std::unique_ptr<HttpMetaCache> cache;
 | 
			
		||||
	QString workDir;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
QTEST_GUILESS_MAIN(LibraryTest)
 | 
			
		||||
 | 
			
		||||
#include "Library_test.moc"
 | 
			
		||||
							
								
								
									
										53
									
								
								api/logic/minecraft/ModList_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								api/logic/minecraft/ModList_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
 | 
			
		||||
#include <QTest>
 | 
			
		||||
#include <QTemporaryDir>
 | 
			
		||||
#include "TestUtil.h"
 | 
			
		||||
 | 
			
		||||
#include "FileSystem.h"
 | 
			
		||||
#include "minecraft/ModList.h"
 | 
			
		||||
 | 
			
		||||
class ModListTest : public QObject
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
 | 
			
		||||
private
 | 
			
		||||
slots:
 | 
			
		||||
	// test for GH-1178 - install a folder with files to a mod list
 | 
			
		||||
	void test_1178()
 | 
			
		||||
	{
 | 
			
		||||
		// source
 | 
			
		||||
		QString source = QFINDTESTDATA("data/test_folder");
 | 
			
		||||
 | 
			
		||||
		// sanity check
 | 
			
		||||
		QVERIFY(!source.endsWith('/'));
 | 
			
		||||
 | 
			
		||||
		auto verify = [](QString path)
 | 
			
		||||
		{
 | 
			
		||||
			QDir target_dir(FS::PathCombine(path, "test_folder"));
 | 
			
		||||
			QVERIFY(target_dir.entryList().contains("pack.mcmeta"));
 | 
			
		||||
			QVERIFY(target_dir.entryList().contains("assets"));
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		// 1. test with no trailing /
 | 
			
		||||
		{
 | 
			
		||||
			QString folder = source;
 | 
			
		||||
			QTemporaryDir tempDir;
 | 
			
		||||
			ModList m(tempDir.path());
 | 
			
		||||
			m.installMod(folder);
 | 
			
		||||
			verify(tempDir.path());
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 2. test with trailing /
 | 
			
		||||
		{
 | 
			
		||||
			QString folder = source + '/';
 | 
			
		||||
			QTemporaryDir tempDir;
 | 
			
		||||
			ModList m(tempDir.path());
 | 
			
		||||
			m.installMod(folder);
 | 
			
		||||
			verify(tempDir.path());
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
QTEST_GUILESS_MAIN(ModListTest)
 | 
			
		||||
 | 
			
		||||
#include "ModList_test.moc"
 | 
			
		||||
							
								
								
									
										55
									
								
								api/logic/minecraft/MojangVersionFormat_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								api/logic/minecraft/MojangVersionFormat_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
#include <QTest>
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
#include "TestUtil.h"
 | 
			
		||||
 | 
			
		||||
#include "minecraft/MojangVersionFormat.h"
 | 
			
		||||
 | 
			
		||||
class MojangVersionFormatTest : public QObject
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
 | 
			
		||||
	static QJsonDocument readJson(const char *file)
 | 
			
		||||
	{
 | 
			
		||||
		auto path = QFINDTESTDATA(file);
 | 
			
		||||
		QFile jsonFile(path);
 | 
			
		||||
		jsonFile.open(QIODevice::ReadOnly);
 | 
			
		||||
		auto data = jsonFile.readAll();
 | 
			
		||||
		jsonFile.close();
 | 
			
		||||
		return QJsonDocument::fromJson(data);
 | 
			
		||||
	}
 | 
			
		||||
	static void writeJson(const char *file, QJsonDocument doc)
 | 
			
		||||
	{
 | 
			
		||||
		QFile jsonFile(file);
 | 
			
		||||
		jsonFile.open(QIODevice::WriteOnly | QIODevice::Text);
 | 
			
		||||
		auto data = doc.toJson(QJsonDocument::Indented);
 | 
			
		||||
		jsonFile.write(data);
 | 
			
		||||
		jsonFile.close();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
private
 | 
			
		||||
slots:
 | 
			
		||||
	void test_Through_Simple()
 | 
			
		||||
	{
 | 
			
		||||
		
 | 
			
		||||
		QJsonDocument doc = readJson("data/1.9-simple.json");
 | 
			
		||||
		auto vfile = MojangVersionFormat::versionFileFromJson(doc, "1.9-simple.json");
 | 
			
		||||
		auto doc2 = MojangVersionFormat::versionFileToJson(vfile);
 | 
			
		||||
		writeJson("1.9-simple-passthorugh.json", doc2);
 | 
			
		||||
		QCOMPARE(doc, doc2);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_Through()
 | 
			
		||||
	{
 | 
			
		||||
		
 | 
			
		||||
		QJsonDocument doc = readJson("data/1.9.json");
 | 
			
		||||
		auto vfile = MojangVersionFormat::versionFileFromJson(doc, "1.9.json");
 | 
			
		||||
		auto doc2 = MojangVersionFormat::versionFileToJson(vfile);
 | 
			
		||||
		writeJson("1.9-passthorugh.json", doc2);
 | 
			
		||||
		QCOMPARE(doc, doc2);
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
QTEST_GUILESS_MAIN(MojangVersionFormatTest)
 | 
			
		||||
 | 
			
		||||
#include "MojangVersionFormat_test.moc"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										45
									
								
								api/logic/minecraft/ParseUtils_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								api/logic/minecraft/ParseUtils_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
#include <QTest>
 | 
			
		||||
#include "TestUtil.h"
 | 
			
		||||
 | 
			
		||||
#include "minecraft/ParseUtils.h"
 | 
			
		||||
 | 
			
		||||
class ParseUtilsTest : public QObject
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
private
 | 
			
		||||
slots:
 | 
			
		||||
	void test_Through_data()
 | 
			
		||||
	{
 | 
			
		||||
		QTest::addColumn<QString>("timestamp");
 | 
			
		||||
		const char * timestamps[] =
 | 
			
		||||
		{
 | 
			
		||||
			"2016-02-29T13:49:54+01:00",
 | 
			
		||||
			"2016-02-26T15:21:11+00:01",
 | 
			
		||||
			"2016-02-24T15:52:36+01:13",
 | 
			
		||||
			"2016-02-18T17:41:00+00:00",
 | 
			
		||||
			"2016-02-17T15:23:19+00:00",
 | 
			
		||||
			"2016-02-16T15:22:39+09:22",
 | 
			
		||||
			"2016-02-10T15:06:41+00:00",
 | 
			
		||||
			"2016-02-04T15:28:02-05:33"
 | 
			
		||||
		};
 | 
			
		||||
		for(int i = 0; i < (sizeof(timestamps) / sizeof(const char *)); i++)
 | 
			
		||||
		{
 | 
			
		||||
			QTest::newRow(timestamps[i]) << QString(timestamps[i]);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	void test_Through()
 | 
			
		||||
	{
 | 
			
		||||
		QFETCH(QString, timestamp);
 | 
			
		||||
 | 
			
		||||
		auto time_parsed = timeFromS3Time(timestamp);
 | 
			
		||||
		auto time_serialized = timeToS3Time(time_parsed);
 | 
			
		||||
		
 | 
			
		||||
		QCOMPARE(time_serialized, timestamp);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
QTEST_GUILESS_MAIN(ParseUtilsTest)
 | 
			
		||||
 | 
			
		||||
#include "ParseUtils_test.moc"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										198
									
								
								api/logic/minecraft/testdata/1.9-simple.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								api/logic/minecraft/testdata/1.9-simple.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,198 @@
 | 
			
		||||
{
 | 
			
		||||
    "assets": "1.9",
 | 
			
		||||
    "id": "1.9",
 | 
			
		||||
    "libraries": [
 | 
			
		||||
        {
 | 
			
		||||
            "name": "oshi-project:oshi-core:1.1"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "net.java.dev.jna:jna:3.4.0"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "net.java.dev.jna:platform:3.4.0"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "com.ibm.icu:icu4j-core-mojang:51.2"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "net.sf.jopt-simple:jopt-simple:4.6"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "com.paulscode:codecjorbis:20101023"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "com.paulscode:codecwav:20101023"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "com.paulscode:libraryjavasound:20101123"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "com.paulscode:librarylwjglopenal:20100824"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "com.paulscode:soundsystem:20120107"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "io.netty:netty-all:4.0.23.Final"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "com.google.guava:guava:17.0"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "org.apache.commons:commons-lang3:3.3.2"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "commons-io:commons-io:2.4"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "commons-codec:commons-codec:1.9"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "net.java.jinput:jinput:2.0.5"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "net.java.jutils:jutils:1.0.0"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "com.google.code.gson:gson:2.2.4"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "com.mojang:authlib:1.5.22"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "com.mojang:realms:1.8.4"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "org.apache.commons:commons-compress:1.8.1"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "org.apache.httpcomponents:httpclient:4.3.3"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "commons-logging:commons-logging:1.1.3"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "org.apache.httpcomponents:httpcore:4.3.2"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "org.apache.logging.log4j:log4j-api:2.0-beta9"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "org.apache.logging.log4j:log4j-core:2.0-beta9"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209",
 | 
			
		||||
            "rules": [
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "allow"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "disallow",
 | 
			
		||||
                    "os": {
 | 
			
		||||
                        "name": "osx"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209",
 | 
			
		||||
            "rules": [
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "allow"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "disallow",
 | 
			
		||||
                    "os": {
 | 
			
		||||
                        "name": "osx"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "extract": {
 | 
			
		||||
                "exclude": [
 | 
			
		||||
                    "META-INF/"
 | 
			
		||||
                ]
 | 
			
		||||
            },
 | 
			
		||||
            "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209",
 | 
			
		||||
            "natives": {
 | 
			
		||||
                "linux": "natives-linux",
 | 
			
		||||
                "osx": "natives-osx",
 | 
			
		||||
                "windows": "natives-windows"
 | 
			
		||||
            },
 | 
			
		||||
            "rules": [
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "allow"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "disallow",
 | 
			
		||||
                    "os": {
 | 
			
		||||
                        "name": "osx"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "org.lwjgl.lwjgl:lwjgl:2.9.2-nightly-20140822",
 | 
			
		||||
            "rules": [
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "allow",
 | 
			
		||||
                    "os": {
 | 
			
		||||
                        "name": "osx"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.2-nightly-20140822",
 | 
			
		||||
            "rules": [
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "allow",
 | 
			
		||||
                    "os": {
 | 
			
		||||
                        "name": "osx"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "extract": {
 | 
			
		||||
                "exclude": [
 | 
			
		||||
                    "META-INF/"
 | 
			
		||||
                ]
 | 
			
		||||
            },
 | 
			
		||||
            "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.2-nightly-20140822",
 | 
			
		||||
            "natives": {
 | 
			
		||||
                "linux": "natives-linux",
 | 
			
		||||
                "osx": "natives-osx",
 | 
			
		||||
                "windows": "natives-windows"
 | 
			
		||||
            },
 | 
			
		||||
            "rules": [
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "allow",
 | 
			
		||||
                    "os": {
 | 
			
		||||
                        "name": "osx"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "extract": {
 | 
			
		||||
                "exclude": [
 | 
			
		||||
                    "META-INF/"
 | 
			
		||||
                ]
 | 
			
		||||
            },
 | 
			
		||||
            "name": "net.java.jinput:jinput-platform:2.0.5",
 | 
			
		||||
            "natives": {
 | 
			
		||||
                "linux": "natives-linux",
 | 
			
		||||
                "osx": "natives-osx",
 | 
			
		||||
                "windows": "natives-windows"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "mainClass": "net.minecraft.client.main.Main",
 | 
			
		||||
    "minecraftArguments": "--username ${auth_player_name} --version ${version_name} --gameDir ${game_directory} --assetsDir ${assets_root} --assetIndex ${assets_index_name} --uuid ${auth_uuid} --accessToken ${auth_access_token} --userType ${user_type} --versionType ${version_type}",
 | 
			
		||||
    "minimumLauncherVersion": 18,
 | 
			
		||||
    "releaseTime": "2016-02-29T13:49:54+00:00",
 | 
			
		||||
    "time": "2016-03-01T13:14:53+00:00",
 | 
			
		||||
    "type": "release"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										529
									
								
								api/logic/minecraft/testdata/1.9.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										529
									
								
								api/logic/minecraft/testdata/1.9.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,529 @@
 | 
			
		||||
{
 | 
			
		||||
    "assetIndex": {
 | 
			
		||||
        "id": "1.9",
 | 
			
		||||
        "sha1": "cde65b47a43f638653ab1da3848b53f8a7477b16",
 | 
			
		||||
        "size": 136916,
 | 
			
		||||
        "totalSize": 119917473,
 | 
			
		||||
        "url": "https://launchermeta.mojang.com/mc-staging/assets/1.9/cde65b47a43f638653ab1da3848b53f8a7477b16/1.9.json"
 | 
			
		||||
    },
 | 
			
		||||
    "assets": "1.9",
 | 
			
		||||
    "downloads": {
 | 
			
		||||
        "client": {
 | 
			
		||||
            "sha1": "2f67dfe8953299440d1902f9124f0f2c3a2c940f",
 | 
			
		||||
            "size": 8697592,
 | 
			
		||||
            "url": "https://launcher.mojang.com/mc/game/1.9/client/2f67dfe8953299440d1902f9124f0f2c3a2c940f/client.jar"
 | 
			
		||||
        },
 | 
			
		||||
        "server": {
 | 
			
		||||
            "sha1": "b4d449cf2918e0f3bd8aa18954b916a4d1880f0d",
 | 
			
		||||
            "size": 8848015,
 | 
			
		||||
            "url": "https://launcher.mojang.com/mc/game/1.9/server/b4d449cf2918e0f3bd8aa18954b916a4d1880f0d/server.jar"
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "id": "1.9",
 | 
			
		||||
    "libraries": [
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "oshi-project/oshi-core/1.1/oshi-core-1.1.jar",
 | 
			
		||||
                    "sha1": "9ddf7b048a8d701be231c0f4f95fd986198fd2d8",
 | 
			
		||||
                    "size": 30973,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/oshi-project/oshi-core/1.1/oshi-core-1.1.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "oshi-project:oshi-core:1.1"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "net/java/dev/jna/jna/3.4.0/jna-3.4.0.jar",
 | 
			
		||||
                    "sha1": "803ff252fedbd395baffd43b37341dc4a150a554",
 | 
			
		||||
                    "size": 1008730,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/net/java/dev/jna/jna/3.4.0/jna-3.4.0.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "net.java.dev.jna:jna:3.4.0"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "net/java/dev/jna/platform/3.4.0/platform-3.4.0.jar",
 | 
			
		||||
                    "sha1": "e3f70017be8100d3d6923f50b3d2ee17714e9c13",
 | 
			
		||||
                    "size": 913436,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/net/java/dev/jna/platform/3.4.0/platform-3.4.0.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "net.java.dev.jna:platform:3.4.0"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "com/ibm/icu/icu4j-core-mojang/51.2/icu4j-core-mojang-51.2.jar",
 | 
			
		||||
                    "sha1": "63d216a9311cca6be337c1e458e587f99d382b84",
 | 
			
		||||
                    "size": 1634692,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/com/ibm/icu/icu4j-core-mojang/51.2/icu4j-core-mojang-51.2.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "com.ibm.icu:icu4j-core-mojang:51.2"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "net/sf/jopt-simple/jopt-simple/4.6/jopt-simple-4.6.jar",
 | 
			
		||||
                    "sha1": "306816fb57cf94f108a43c95731b08934dcae15c",
 | 
			
		||||
                    "size": 62477,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/net/sf/jopt-simple/jopt-simple/4.6/jopt-simple-4.6.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "net.sf.jopt-simple:jopt-simple:4.6"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "com/paulscode/codecjorbis/20101023/codecjorbis-20101023.jar",
 | 
			
		||||
                    "sha1": "c73b5636faf089d9f00e8732a829577de25237ee",
 | 
			
		||||
                    "size": 103871,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/com/paulscode/codecjorbis/20101023/codecjorbis-20101023.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "com.paulscode:codecjorbis:20101023"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "com/paulscode/codecwav/20101023/codecwav-20101023.jar",
 | 
			
		||||
                    "sha1": "12f031cfe88fef5c1dd36c563c0a3a69bd7261da",
 | 
			
		||||
                    "size": 5618,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/com/paulscode/codecwav/20101023/codecwav-20101023.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "com.paulscode:codecwav:20101023"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "com/paulscode/libraryjavasound/20101123/libraryjavasound-20101123.jar",
 | 
			
		||||
                    "sha1": "5c5e304366f75f9eaa2e8cca546a1fb6109348b3",
 | 
			
		||||
                    "size": 21679,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/com/paulscode/libraryjavasound/20101123/libraryjavasound-20101123.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "com.paulscode:libraryjavasound:20101123"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "com/paulscode/librarylwjglopenal/20100824/librarylwjglopenal-20100824.jar",
 | 
			
		||||
                    "sha1": "73e80d0794c39665aec3f62eee88ca91676674ef",
 | 
			
		||||
                    "size": 18981,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/com/paulscode/librarylwjglopenal/20100824/librarylwjglopenal-20100824.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "com.paulscode:librarylwjglopenal:20100824"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "com/paulscode/soundsystem/20120107/soundsystem-20120107.jar",
 | 
			
		||||
                    "sha1": "419c05fe9be71f792b2d76cfc9b67f1ed0fec7f6",
 | 
			
		||||
                    "size": 65020,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/com/paulscode/soundsystem/20120107/soundsystem-20120107.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "com.paulscode:soundsystem:20120107"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "io/netty/netty-all/4.0.23.Final/netty-all-4.0.23.Final.jar",
 | 
			
		||||
                    "sha1": "0294104aaf1781d6a56a07d561e792c5d0c95f45",
 | 
			
		||||
                    "size": 1779991,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/io/netty/netty-all/4.0.23.Final/netty-all-4.0.23.Final.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "io.netty:netty-all:4.0.23.Final"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "com/google/guava/guava/17.0/guava-17.0.jar",
 | 
			
		||||
                    "sha1": "9c6ef172e8de35fd8d4d8783e4821e57cdef7445",
 | 
			
		||||
                    "size": 2243036,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/com/google/guava/guava/17.0/guava-17.0.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "com.google.guava:guava:17.0"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "org/apache/commons/commons-lang3/3.3.2/commons-lang3-3.3.2.jar",
 | 
			
		||||
                    "sha1": "90a3822c38ec8c996e84c16a3477ef632cbc87a3",
 | 
			
		||||
                    "size": 412739,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/org/apache/commons/commons-lang3/3.3.2/commons-lang3-3.3.2.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "org.apache.commons:commons-lang3:3.3.2"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "commons-io/commons-io/2.4/commons-io-2.4.jar",
 | 
			
		||||
                    "sha1": "b1b6ea3b7e4aa4f492509a4952029cd8e48019ad",
 | 
			
		||||
                    "size": 185140,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/commons-io/commons-io/2.4/commons-io-2.4.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "commons-io:commons-io:2.4"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "commons-codec/commons-codec/1.9/commons-codec-1.9.jar",
 | 
			
		||||
                    "sha1": "9ce04e34240f674bc72680f8b843b1457383161a",
 | 
			
		||||
                    "size": 263965,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/commons-codec/commons-codec/1.9/commons-codec-1.9.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "commons-codec:commons-codec:1.9"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar",
 | 
			
		||||
                    "sha1": "39c7796b469a600f72380316f6b1f11db6c2c7c4",
 | 
			
		||||
                    "size": 208338,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "net.java.jinput:jinput:2.0.5"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar",
 | 
			
		||||
                    "sha1": "e12fe1fda814bd348c1579329c86943d2cd3c6a6",
 | 
			
		||||
                    "size": 7508,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "net.java.jutils:jutils:1.0.0"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "com/google/code/gson/gson/2.2.4/gson-2.2.4.jar",
 | 
			
		||||
                    "sha1": "a60a5e993c98c864010053cb901b7eab25306568",
 | 
			
		||||
                    "size": 190432,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/com/google/code/gson/gson/2.2.4/gson-2.2.4.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "com.google.code.gson:gson:2.2.4"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "com/mojang/authlib/1.5.22/authlib-1.5.22.jar",
 | 
			
		||||
                    "sha1": "afaa8f6df976fcb5520e76ef1d5798c9e6b5c0b2",
 | 
			
		||||
                    "size": 64539,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/com/mojang/authlib/1.5.22/authlib-1.5.22.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "com.mojang:authlib:1.5.22"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "com/mojang/realms/1.8.4/realms-1.8.4.jar",
 | 
			
		||||
                    "sha1": "15f8dc326c97a96dee6e65392e145ad6d1cb46cb",
 | 
			
		||||
                    "size": 1131574,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/com/mojang/realms/1.8.4/realms-1.8.4.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "com.mojang:realms:1.8.4"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar",
 | 
			
		||||
                    "sha1": "a698750c16740fd5b3871425f4cb3bbaa87f529d",
 | 
			
		||||
                    "size": 365552,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "org.apache.commons:commons-compress:1.8.1"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.jar",
 | 
			
		||||
                    "sha1": "18f4247ff4572a074444572cee34647c43e7c9c7",
 | 
			
		||||
                    "size": 589512,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "org.apache.httpcomponents:httpclient:4.3.3"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar",
 | 
			
		||||
                    "sha1": "f6f66e966c70a83ffbdb6f17a0919eaf7c8aca7f",
 | 
			
		||||
                    "size": 62050,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "commons-logging:commons-logging:1.1.3"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar",
 | 
			
		||||
                    "sha1": "31fbbff1ddbf98f3aa7377c94d33b0447c646b6e",
 | 
			
		||||
                    "size": 282269,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "org.apache.httpcomponents:httpcore:4.3.2"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "org/apache/logging/log4j/log4j-api/2.0-beta9/log4j-api-2.0-beta9.jar",
 | 
			
		||||
                    "sha1": "1dd66e68cccd907880229f9e2de1314bd13ff785",
 | 
			
		||||
                    "size": 108161,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-api/2.0-beta9/log4j-api-2.0-beta9.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "org.apache.logging.log4j:log4j-api:2.0-beta9"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "org/apache/logging/log4j/log4j-core/2.0-beta9/log4j-core-2.0-beta9.jar",
 | 
			
		||||
                    "sha1": "678861ba1b2e1fccb594bb0ca03114bb05da9695",
 | 
			
		||||
                    "size": 681134,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-core/2.0-beta9/log4j-core-2.0-beta9.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "org.apache.logging.log4j:log4j-core:2.0-beta9"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "org/lwjgl/lwjgl/lwjgl/2.9.4-nightly-20150209/lwjgl-2.9.4-nightly-20150209.jar",
 | 
			
		||||
                    "sha1": "697517568c68e78ae0b4544145af031c81082dfe",
 | 
			
		||||
                    "size": 1047168,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl/2.9.4-nightly-20150209/lwjgl-2.9.4-nightly-20150209.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209",
 | 
			
		||||
            "rules": [
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "allow"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "disallow",
 | 
			
		||||
                    "os": {
 | 
			
		||||
                        "name": "osx"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "org/lwjgl/lwjgl/lwjgl_util/2.9.4-nightly-20150209/lwjgl_util-2.9.4-nightly-20150209.jar",
 | 
			
		||||
                    "sha1": "d51a7c040a721d13efdfbd34f8b257b2df882ad0",
 | 
			
		||||
                    "size": 173887,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl_util/2.9.4-nightly-20150209/lwjgl_util-2.9.4-nightly-20150209.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209",
 | 
			
		||||
            "rules": [
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "allow"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "disallow",
 | 
			
		||||
                    "os": {
 | 
			
		||||
                        "name": "osx"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209.jar",
 | 
			
		||||
                    "sha1": "b04f3ee8f5e43fa3b162981b50bb72fe1acabb33",
 | 
			
		||||
                    "size": 22,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209.jar"
 | 
			
		||||
                },
 | 
			
		||||
                "classifiers": {
 | 
			
		||||
                    "natives-linux": {
 | 
			
		||||
                        "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-linux.jar",
 | 
			
		||||
                        "sha1": "931074f46c795d2f7b30ed6395df5715cfd7675b",
 | 
			
		||||
                        "size": 578680,
 | 
			
		||||
                        "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-linux.jar"
 | 
			
		||||
                    },
 | 
			
		||||
                    "natives-osx": {
 | 
			
		||||
                        "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar",
 | 
			
		||||
                        "sha1": "bcab850f8f487c3f4c4dbabde778bb82bd1a40ed",
 | 
			
		||||
                        "size": 426822,
 | 
			
		||||
                        "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar"
 | 
			
		||||
                    },
 | 
			
		||||
                    "natives-windows": {
 | 
			
		||||
                        "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-windows.jar",
 | 
			
		||||
                        "sha1": "b84d5102b9dbfabfeb5e43c7e2828d98a7fc80e0",
 | 
			
		||||
                        "size": 613748,
 | 
			
		||||
                        "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-windows.jar"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "extract": {
 | 
			
		||||
                "exclude": [
 | 
			
		||||
                    "META-INF/"
 | 
			
		||||
                ]
 | 
			
		||||
            },
 | 
			
		||||
            "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209",
 | 
			
		||||
            "natives": {
 | 
			
		||||
                "linux": "natives-linux",
 | 
			
		||||
                "osx": "natives-osx",
 | 
			
		||||
                "windows": "natives-windows"
 | 
			
		||||
            },
 | 
			
		||||
            "rules": [
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "allow"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "disallow",
 | 
			
		||||
                    "os": {
 | 
			
		||||
                        "name": "osx"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "org/lwjgl/lwjgl/lwjgl/2.9.2-nightly-20140822/lwjgl-2.9.2-nightly-20140822.jar",
 | 
			
		||||
                    "sha1": "7707204c9ffa5d91662de95f0a224e2f721b22af",
 | 
			
		||||
                    "size": 1045632,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl/2.9.2-nightly-20140822/lwjgl-2.9.2-nightly-20140822.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "org.lwjgl.lwjgl:lwjgl:2.9.2-nightly-20140822",
 | 
			
		||||
            "rules": [
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "allow",
 | 
			
		||||
                    "os": {
 | 
			
		||||
                        "name": "osx"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "artifact": {
 | 
			
		||||
                    "path": "org/lwjgl/lwjgl/lwjgl_util/2.9.2-nightly-20140822/lwjgl_util-2.9.2-nightly-20140822.jar",
 | 
			
		||||
                    "sha1": "f0e612c840a7639c1f77f68d72a28dae2f0c8490",
 | 
			
		||||
                    "size": 173887,
 | 
			
		||||
                    "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl_util/2.9.2-nightly-20140822/lwjgl_util-2.9.2-nightly-20140822.jar"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.2-nightly-20140822",
 | 
			
		||||
            "rules": [
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "allow",
 | 
			
		||||
                    "os": {
 | 
			
		||||
                        "name": "osx"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "classifiers": {
 | 
			
		||||
                    "natives-linux": {
 | 
			
		||||
                        "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.2-nightly-20140822/lwjgl-platform-2.9.2-nightly-20140822-natives-linux.jar",
 | 
			
		||||
                        "sha1": "d898a33b5d0a6ef3fed3a4ead506566dce6720a5",
 | 
			
		||||
                        "size": 578539,
 | 
			
		||||
                        "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.2-nightly-20140822/lwjgl-platform-2.9.2-nightly-20140822-natives-linux.jar"
 | 
			
		||||
                    },
 | 
			
		||||
                    "natives-osx": {
 | 
			
		||||
                        "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.2-nightly-20140822/lwjgl-platform-2.9.2-nightly-20140822-natives-osx.jar",
 | 
			
		||||
                        "sha1": "79f5ce2fea02e77fe47a3c745219167a542121d7",
 | 
			
		||||
                        "size": 468116,
 | 
			
		||||
                        "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.2-nightly-20140822/lwjgl-platform-2.9.2-nightly-20140822-natives-osx.jar"
 | 
			
		||||
                    },
 | 
			
		||||
                    "natives-windows": {
 | 
			
		||||
                        "path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.2-nightly-20140822/lwjgl-platform-2.9.2-nightly-20140822-natives-windows.jar",
 | 
			
		||||
                        "sha1": "78b2a55ce4dc29c6b3ec4df8ca165eba05f9b341",
 | 
			
		||||
                        "size": 613680,
 | 
			
		||||
                        "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.2-nightly-20140822/lwjgl-platform-2.9.2-nightly-20140822-natives-windows.jar"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "extract": {
 | 
			
		||||
                "exclude": [
 | 
			
		||||
                    "META-INF/"
 | 
			
		||||
                ]
 | 
			
		||||
            },
 | 
			
		||||
            "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.2-nightly-20140822",
 | 
			
		||||
            "natives": {
 | 
			
		||||
                "linux": "natives-linux",
 | 
			
		||||
                "osx": "natives-osx",
 | 
			
		||||
                "windows": "natives-windows"
 | 
			
		||||
            },
 | 
			
		||||
            "rules": [
 | 
			
		||||
                {
 | 
			
		||||
                    "action": "allow",
 | 
			
		||||
                    "os": {
 | 
			
		||||
                        "name": "osx"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "downloads": {
 | 
			
		||||
                "classifiers": {
 | 
			
		||||
                    "natives-linux": {
 | 
			
		||||
                        "path": "net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-linux.jar",
 | 
			
		||||
                        "sha1": "7ff832a6eb9ab6a767f1ade2b548092d0fa64795",
 | 
			
		||||
                        "size": 10362,
 | 
			
		||||
                        "url": "https://libraries.minecraft.net/net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-linux.jar"
 | 
			
		||||
                    },
 | 
			
		||||
                    "natives-osx": {
 | 
			
		||||
                        "path": "net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-osx.jar",
 | 
			
		||||
                        "sha1": "53f9c919f34d2ca9de8c51fc4e1e8282029a9232",
 | 
			
		||||
                        "size": 12186,
 | 
			
		||||
                        "url": "https://libraries.minecraft.net/net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-osx.jar"
 | 
			
		||||
                    },
 | 
			
		||||
                    "natives-windows": {
 | 
			
		||||
                        "path": "net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-windows.jar",
 | 
			
		||||
                        "sha1": "385ee093e01f587f30ee1c8a2ee7d408fd732e16",
 | 
			
		||||
                        "size": 155179,
 | 
			
		||||
                        "url": "https://libraries.minecraft.net/net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-windows.jar"
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "extract": {
 | 
			
		||||
                "exclude": [
 | 
			
		||||
                    "META-INF/"
 | 
			
		||||
                ]
 | 
			
		||||
            },
 | 
			
		||||
            "name": "net.java.jinput:jinput-platform:2.0.5",
 | 
			
		||||
            "natives": {
 | 
			
		||||
                "linux": "natives-linux",
 | 
			
		||||
                "osx": "natives-osx",
 | 
			
		||||
                "windows": "natives-windows"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "mainClass": "net.minecraft.client.main.Main",
 | 
			
		||||
    "minecraftArguments": "--username ${auth_player_name} --version ${version_name} --gameDir ${game_directory} --assetsDir ${assets_root} --assetIndex ${assets_index_name} --uuid ${auth_uuid} --accessToken ${auth_access_token} --userType ${user_type} --versionType ${version_type}",
 | 
			
		||||
    "minimumLauncherVersion": 18,
 | 
			
		||||
    "releaseTime": "2016-02-29T13:49:54+00:00",
 | 
			
		||||
    "time": "2016-03-01T13:14:53+00:00",
 | 
			
		||||
    "type": "release"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										46
									
								
								api/logic/minecraft/testdata/lib-native-arch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								api/logic/minecraft/testdata/lib-native-arch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
{
 | 
			
		||||
	"downloads": {
 | 
			
		||||
		"classifiers": {
 | 
			
		||||
			"natives-osx": {
 | 
			
		||||
				"path": "tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-osx.jar",
 | 
			
		||||
				"sha1": "62503ee712766cf77f97252e5902786fd834b8c5",
 | 
			
		||||
				"size": 418331,
 | 
			
		||||
				"url": "https://libraries.minecraft.net/tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-osx.jar"
 | 
			
		||||
			},
 | 
			
		||||
			"natives-windows-32": {
 | 
			
		||||
				"path": "tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-32.jar",
 | 
			
		||||
				"sha1": "7c6affe439099806a4f552da14c42f9d643d8b23",
 | 
			
		||||
				"size": 386792,
 | 
			
		||||
				"url": "https://libraries.minecraft.net/tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-32.jar"
 | 
			
		||||
			},
 | 
			
		||||
			"natives-windows-64": {
 | 
			
		||||
				"path": "tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-64.jar",
 | 
			
		||||
				"sha1": "39d0c3d363735b4785598e0e7fbf8297c706a9f9",
 | 
			
		||||
				"size": 463390,
 | 
			
		||||
				"url": "https://libraries.minecraft.net/tv/twitch/twitch-platform/5.16/twitch-platform-5.16-natives-windows-64.jar"
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	"extract": {
 | 
			
		||||
		"exclude": [
 | 
			
		||||
			"META-INF/"
 | 
			
		||||
		]
 | 
			
		||||
	},
 | 
			
		||||
	"name": "tv.twitch:twitch-platform:5.16",
 | 
			
		||||
	"natives": {
 | 
			
		||||
		"linux": "natives-linux",
 | 
			
		||||
		"osx": "natives-osx",
 | 
			
		||||
		"windows": "natives-windows-${arch}"
 | 
			
		||||
	},
 | 
			
		||||
	"rules": [
 | 
			
		||||
		{
 | 
			
		||||
			"action": "allow"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"action": "disallow",
 | 
			
		||||
			"os": {
 | 
			
		||||
				"name": "linux"
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										52
									
								
								api/logic/minecraft/testdata/lib-native.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								api/logic/minecraft/testdata/lib-native.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
{
 | 
			
		||||
	"downloads": {
 | 
			
		||||
		"artifact": {
 | 
			
		||||
			"path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209.jar",
 | 
			
		||||
			"sha1": "b04f3ee8f5e43fa3b162981b50bb72fe1acabb33",
 | 
			
		||||
			"size": 22,
 | 
			
		||||
			"url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209.jar"
 | 
			
		||||
		},
 | 
			
		||||
		"classifiers": {
 | 
			
		||||
			"natives-linux": {
 | 
			
		||||
				"path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-linux.jar",
 | 
			
		||||
				"sha1": "931074f46c795d2f7b30ed6395df5715cfd7675b",
 | 
			
		||||
				"size": 578680,
 | 
			
		||||
				"url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-linux.jar"
 | 
			
		||||
			},
 | 
			
		||||
			"natives-osx": {
 | 
			
		||||
				"path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar",
 | 
			
		||||
				"sha1": "bcab850f8f487c3f4c4dbabde778bb82bd1a40ed",
 | 
			
		||||
				"size": 426822,
 | 
			
		||||
				"url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar"
 | 
			
		||||
			},
 | 
			
		||||
			"natives-windows": {
 | 
			
		||||
				"path": "org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-windows.jar",
 | 
			
		||||
				"sha1": "b84d5102b9dbfabfeb5e43c7e2828d98a7fc80e0",
 | 
			
		||||
				"size": 613748,
 | 
			
		||||
				"url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-windows.jar"
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	"extract": {
 | 
			
		||||
		"exclude": [
 | 
			
		||||
			"META-INF/"
 | 
			
		||||
		]
 | 
			
		||||
	},
 | 
			
		||||
	"name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209",
 | 
			
		||||
	"natives": {
 | 
			
		||||
		"linux": "natives-linux",
 | 
			
		||||
		"osx": "natives-osx",
 | 
			
		||||
		"windows": "natives-windows"
 | 
			
		||||
	},
 | 
			
		||||
	"rules": [
 | 
			
		||||
		{
 | 
			
		||||
			"action": "allow"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"action": "disallow",
 | 
			
		||||
			"os": {
 | 
			
		||||
				"name": "osx"
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								api/logic/minecraft/testdata/lib-simple.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								api/logic/minecraft/testdata/lib-simple.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
{
 | 
			
		||||
	"downloads": {
 | 
			
		||||
		"artifact": {
 | 
			
		||||
			"path": "com/paulscode/codecwav/20101023/codecwav-20101023.jar",
 | 
			
		||||
			"sha1": "12f031cfe88fef5c1dd36c563c0a3a69bd7261da",
 | 
			
		||||
			"size": 5618,
 | 
			
		||||
			"url": "https://libraries.minecraft.net/com/paulscode/codecwav/20101023/codecwav-20101023.jar"
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	"name": "com.paulscode:codecwav:20101023"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										62
									
								
								api/logic/settings/INIFile_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								api/logic/settings/INIFile_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
			
		||||
#include <QTest>
 | 
			
		||||
#include "TestUtil.h"
 | 
			
		||||
 | 
			
		||||
#include "settings/INIFile.h"
 | 
			
		||||
 | 
			
		||||
class IniFileTest : public QObject
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
private
 | 
			
		||||
slots:
 | 
			
		||||
	void initTestCase()
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	void cleanupTestCase()
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_Escape_data()
 | 
			
		||||
	{
 | 
			
		||||
		QTest::addColumn<QString>("through");
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("unix path") << "/abc/def/ghi/jkl";
 | 
			
		||||
		QTest::newRow("windows path") << "C:\\Program files\\terrible\\name\\of something\\";
 | 
			
		||||
		QTest::newRow("Plain text") << "Lorem ipsum dolor sit amet.";
 | 
			
		||||
		QTest::newRow("Escape sequences") << "Lorem\n\t\n\\n\\tAAZ\nipsum dolor\n\nsit amet.";
 | 
			
		||||
		QTest::newRow("Escape sequences 2") << "\"\n\n\"";
 | 
			
		||||
	}
 | 
			
		||||
	void test_Escape()
 | 
			
		||||
	{
 | 
			
		||||
		QFETCH(QString, through);
 | 
			
		||||
 | 
			
		||||
		QString there = INIFile::escape(through);
 | 
			
		||||
		QString back = INIFile::unescape(there);
 | 
			
		||||
 | 
			
		||||
		QCOMPARE(back, through);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_SaveLoad()
 | 
			
		||||
	{
 | 
			
		||||
		QString a = "a";
 | 
			
		||||
		QString b = "a\nb\t\n\\\\\\C:\\Program files\\terrible\\name\\of something\\";
 | 
			
		||||
		QString filename = "test_SaveLoad.ini";
 | 
			
		||||
 | 
			
		||||
		// save
 | 
			
		||||
		INIFile f;
 | 
			
		||||
		f.set("a", a);
 | 
			
		||||
		f.set("b", b);
 | 
			
		||||
		f.saveFile(filename);
 | 
			
		||||
 | 
			
		||||
		// load
 | 
			
		||||
		INIFile f2;
 | 
			
		||||
		f2.loadFile(filename);
 | 
			
		||||
		QCOMPARE(a, f2.get("a","NOT SET").toString());
 | 
			
		||||
		QCOMPARE(b, f2.get("b","NOT SET").toString());
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
QTEST_GUILESS_MAIN(IniFileTest)
 | 
			
		||||
 | 
			
		||||
#include "INIFile_test.moc"
 | 
			
		||||
							
								
								
									
										6
									
								
								api/logic/testdata/FileSystem-test_createShortcut-unix
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										6
									
								
								api/logic/testdata/FileSystem-test_createShortcut-unix
									
									
									
									
										vendored
									
									
										Executable file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
[Desktop Entry]
 | 
			
		||||
Type=Application
 | 
			
		||||
TryExec=asdfDest
 | 
			
		||||
Exec=asdfDest 'arg1' 'arg2'
 | 
			
		||||
Name=asdf
 | 
			
		||||
Icon=
 | 
			
		||||
							
								
								
									
										1
									
								
								api/logic/testdata/test_folder/assets/minecraft/textures/blah.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								api/logic/testdata/test_folder/assets/minecraft/textures/blah.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								api/logic/testdata/test_folder/pack.mcmeta
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								api/logic/testdata/test_folder/pack.mcmeta
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "pack": {
 | 
			
		||||
    "pack_format": 1,
 | 
			
		||||
    "description": "Some resource pack maybe"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								api/logic/testdata/test_folder/pack.nfo
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								api/logic/testdata/test_folder/pack.nfo
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										214
									
								
								api/logic/updater/DownloadTask_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										214
									
								
								api/logic/updater/DownloadTask_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,214 @@
 | 
			
		||||
#include <QTest>
 | 
			
		||||
#include <QSignalSpy>
 | 
			
		||||
 | 
			
		||||
#include "TestUtil.h"
 | 
			
		||||
 | 
			
		||||
#include "updater/GoUpdate.h"
 | 
			
		||||
#include "updater/DownloadTask.h"
 | 
			
		||||
#include "updater/UpdateChecker.h"
 | 
			
		||||
#include <FileSystem.h>
 | 
			
		||||
 | 
			
		||||
using namespace GoUpdate;
 | 
			
		||||
 | 
			
		||||
FileSourceList encodeBaseFile(const char *suffix)
 | 
			
		||||
{
 | 
			
		||||
	auto base = qApp->applicationDirPath();
 | 
			
		||||
	QUrl localFile = QUrl::fromLocalFile(base + suffix);
 | 
			
		||||
	QString localUrlString = localFile.toString(QUrl::FullyEncoded);
 | 
			
		||||
	auto item = FileSource("http", localUrlString);
 | 
			
		||||
	return FileSourceList({item});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Q_DECLARE_METATYPE(VersionFileList)
 | 
			
		||||
Q_DECLARE_METATYPE(Operation)
 | 
			
		||||
 | 
			
		||||
QDebug operator<<(QDebug dbg, const FileSource &f)
 | 
			
		||||
{
 | 
			
		||||
	dbg.nospace() << "FileSource(type=" << f.type << " url=" << f.url
 | 
			
		||||
				  << " comp=" << f.compressionType << ")";
 | 
			
		||||
	return dbg.maybeSpace();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QDebug operator<<(QDebug dbg, const VersionFileEntry &v)
 | 
			
		||||
{
 | 
			
		||||
	dbg.nospace() << "VersionFileEntry(path=" << v.path << " mode=" << v.mode
 | 
			
		||||
				  << " md5=" << v.md5 << " sources=" << v.sources << ")";
 | 
			
		||||
	return dbg.maybeSpace();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QDebug operator<<(QDebug dbg, const Operation::Type &t)
 | 
			
		||||
{
 | 
			
		||||
	switch (t)
 | 
			
		||||
	{
 | 
			
		||||
	case Operation::OP_REPLACE:
 | 
			
		||||
		dbg << "OP_COPY";
 | 
			
		||||
		break;
 | 
			
		||||
	case Operation::OP_DELETE:
 | 
			
		||||
		dbg << "OP_DELETE";
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
	return dbg.maybeSpace();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QDebug operator<<(QDebug dbg, const Operation &u)
 | 
			
		||||
{
 | 
			
		||||
	dbg.nospace() << "Operation(type=" << u.type << " file=" << u.file
 | 
			
		||||
				  << " dest=" << u.dest << " mode=" << u.mode << ")";
 | 
			
		||||
	return dbg.maybeSpace();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class DownloadTaskTest : public QObject
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
private
 | 
			
		||||
slots:
 | 
			
		||||
	void initTestCase()
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
	void cleanupTestCase()
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_parseVersionInfo_data()
 | 
			
		||||
	{
 | 
			
		||||
		QTest::addColumn<QByteArray>("data");
 | 
			
		||||
		QTest::addColumn<VersionFileList>("list");
 | 
			
		||||
		QTest::addColumn<QString>("error");
 | 
			
		||||
		QTest::addColumn<bool>("ret");
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("one")
 | 
			
		||||
			<< MULTIMC_GET_TEST_FILE("data/1.json")
 | 
			
		||||
			<< (VersionFileList()
 | 
			
		||||
				<< VersionFileEntry{"fileOne",
 | 
			
		||||
														493,
 | 
			
		||||
														encodeBaseFile("/data/fileOneA"),
 | 
			
		||||
														"9eb84090956c484e32cb6c08455a667b"}
 | 
			
		||||
				<< VersionFileEntry{"fileTwo",
 | 
			
		||||
														644,
 | 
			
		||||
														encodeBaseFile("/data/fileTwo"),
 | 
			
		||||
														"38f94f54fa3eb72b0ea836538c10b043"}
 | 
			
		||||
				<< VersionFileEntry{"fileThree",
 | 
			
		||||
														750,
 | 
			
		||||
														encodeBaseFile("/data/fileThree"),
 | 
			
		||||
														"f12df554b21e320be6471d7154130e70"})
 | 
			
		||||
			<< QString() << true;
 | 
			
		||||
		QTest::newRow("two")
 | 
			
		||||
			<< MULTIMC_GET_TEST_FILE("data/2.json")
 | 
			
		||||
			<< (VersionFileList()
 | 
			
		||||
				<< VersionFileEntry{"fileOne",
 | 
			
		||||
														493,
 | 
			
		||||
														encodeBaseFile("/data/fileOneB"),
 | 
			
		||||
														"42915a71277c9016668cce7b82c6b577"}
 | 
			
		||||
				<< VersionFileEntry{"fileTwo",
 | 
			
		||||
														644,
 | 
			
		||||
														encodeBaseFile("/data/fileTwo"),
 | 
			
		||||
														"38f94f54fa3eb72b0ea836538c10b043"})
 | 
			
		||||
			<< QString() << true;
 | 
			
		||||
	}
 | 
			
		||||
	void test_parseVersionInfo()
 | 
			
		||||
	{
 | 
			
		||||
		QFETCH(QByteArray, data);
 | 
			
		||||
		QFETCH(VersionFileList, list);
 | 
			
		||||
		QFETCH(QString, error);
 | 
			
		||||
		QFETCH(bool, ret);
 | 
			
		||||
 | 
			
		||||
		VersionFileList outList;
 | 
			
		||||
		QString outError;
 | 
			
		||||
		bool outRet = parseVersionInfo(data, outList, outError);
 | 
			
		||||
		QCOMPARE(outRet, ret);
 | 
			
		||||
		QCOMPARE(outList, list);
 | 
			
		||||
		QCOMPARE(outError, error);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_processFileLists_data()
 | 
			
		||||
	{
 | 
			
		||||
		QTest::addColumn<QString>("tempFolder");
 | 
			
		||||
		QTest::addColumn<VersionFileList>("currentVersion");
 | 
			
		||||
		QTest::addColumn<VersionFileList>("newVersion");
 | 
			
		||||
		QTest::addColumn<OperationList>("expectedOperations");
 | 
			
		||||
 | 
			
		||||
		QTemporaryDir tempFolderObj;
 | 
			
		||||
		QString tempFolder = tempFolderObj.path();
 | 
			
		||||
		// update fileOne, keep fileTwo, remove fileThree
 | 
			
		||||
		QTest::newRow("test 1")
 | 
			
		||||
			<< tempFolder << (VersionFileList()
 | 
			
		||||
							  << VersionFileEntry{
 | 
			
		||||
									 "data/fileOne", 493,
 | 
			
		||||
									 FileSourceList()
 | 
			
		||||
										 << FileSource(
 | 
			
		||||
												"http", "http://host/path/fileOne-1"),
 | 
			
		||||
									 "9eb84090956c484e32cb6c08455a667b"}
 | 
			
		||||
							  << VersionFileEntry{
 | 
			
		||||
									 "data/fileTwo", 644,
 | 
			
		||||
									 FileSourceList()
 | 
			
		||||
										 << FileSource(
 | 
			
		||||
												"http", "http://host/path/fileTwo-1"),
 | 
			
		||||
									 "38f94f54fa3eb72b0ea836538c10b043"}
 | 
			
		||||
							  << VersionFileEntry{
 | 
			
		||||
									 "data/fileThree", 420,
 | 
			
		||||
									 FileSourceList()
 | 
			
		||||
										 << FileSource(
 | 
			
		||||
												"http", "http://host/path/fileThree-1"),
 | 
			
		||||
									 "f12df554b21e320be6471d7154130e70"})
 | 
			
		||||
			<< (VersionFileList()
 | 
			
		||||
				<< VersionFileEntry{
 | 
			
		||||
					   "data/fileOne", 493,
 | 
			
		||||
					   FileSourceList()
 | 
			
		||||
						   << FileSource("http",
 | 
			
		||||
															 "http://host/path/fileOne-2"),
 | 
			
		||||
					   "42915a71277c9016668cce7b82c6b577"}
 | 
			
		||||
				<< VersionFileEntry{
 | 
			
		||||
					   "data/fileTwo", 644,
 | 
			
		||||
					   FileSourceList()
 | 
			
		||||
						   << FileSource("http",
 | 
			
		||||
															 "http://host/path/fileTwo-2"),
 | 
			
		||||
					   "38f94f54fa3eb72b0ea836538c10b043"})
 | 
			
		||||
			<< (OperationList()
 | 
			
		||||
				<< Operation::DeleteOp("data/fileThree")
 | 
			
		||||
				<< Operation::CopyOp(
 | 
			
		||||
					   FS::PathCombine(tempFolder,
 | 
			
		||||
								   QString("data/fileOne").replace("/", "_")),
 | 
			
		||||
					   "data/fileOne", 493));
 | 
			
		||||
	}
 | 
			
		||||
	void test_processFileLists()
 | 
			
		||||
	{
 | 
			
		||||
		QFETCH(QString, tempFolder);
 | 
			
		||||
		QFETCH(VersionFileList, currentVersion);
 | 
			
		||||
		QFETCH(VersionFileList, newVersion);
 | 
			
		||||
		QFETCH(OperationList, expectedOperations);
 | 
			
		||||
 | 
			
		||||
		OperationList operations;
 | 
			
		||||
 | 
			
		||||
		processFileLists(currentVersion, newVersion, QCoreApplication::applicationDirPath(), tempFolder, new NetJob("Dummy"), operations);
 | 
			
		||||
		qDebug() << (operations == expectedOperations);
 | 
			
		||||
		qDebug() << operations;
 | 
			
		||||
		qDebug() << expectedOperations;
 | 
			
		||||
		QCOMPARE(operations, expectedOperations);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_OSXPathFixup()
 | 
			
		||||
	{
 | 
			
		||||
		QString path, pathOrig;
 | 
			
		||||
		bool result;
 | 
			
		||||
		// Proper OSX path
 | 
			
		||||
		pathOrig = path = "MultiMC.app/Foo/Bar/Baz";
 | 
			
		||||
		qDebug() << "Proper OSX path: " << path;
 | 
			
		||||
		result = fixPathForOSX(path);
 | 
			
		||||
		QCOMPARE(path, QString("Foo/Bar/Baz"));
 | 
			
		||||
		QCOMPARE(result, true);
 | 
			
		||||
 | 
			
		||||
		// Bad OSX path
 | 
			
		||||
		pathOrig = path = "translations/klingon.lol";
 | 
			
		||||
		qDebug() << "Bad OSX path: " << path;
 | 
			
		||||
		result = fixPathForOSX(path);
 | 
			
		||||
		QCOMPARE(path, pathOrig);
 | 
			
		||||
		QCOMPARE(result, false);
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern "C"
 | 
			
		||||
{
 | 
			
		||||
	QTEST_GUILESS_MAIN(DownloadTaskTest)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#include "DownloadTask_test.moc"
 | 
			
		||||
							
								
								
									
										146
									
								
								api/logic/updater/UpdateChecker_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								api/logic/updater/UpdateChecker_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,146 @@
 | 
			
		||||
#include <QTest>
 | 
			
		||||
#include <QSignalSpy>
 | 
			
		||||
 | 
			
		||||
#include "TestUtil.h"
 | 
			
		||||
#include "updater/UpdateChecker.h"
 | 
			
		||||
 | 
			
		||||
Q_DECLARE_METATYPE(UpdateChecker::ChannelListEntry)
 | 
			
		||||
 | 
			
		||||
bool operator==(const UpdateChecker::ChannelListEntry &e1, const UpdateChecker::ChannelListEntry &e2)
 | 
			
		||||
{
 | 
			
		||||
	qDebug() << e1.url << "vs" << e2.url;
 | 
			
		||||
	return e1.id == e2.id &&
 | 
			
		||||
			e1.name == e2.name &&
 | 
			
		||||
			e1.description == e2.description &&
 | 
			
		||||
			e1.url == e2.url;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QDebug operator<<(QDebug dbg, const UpdateChecker::ChannelListEntry &c)
 | 
			
		||||
{
 | 
			
		||||
	dbg.nospace() << "ChannelListEntry(id=" << c.id << " name=" << c.name << " description=" << c.description << " url=" << c.url << ")";
 | 
			
		||||
	return dbg.maybeSpace();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class UpdateCheckerTest : public QObject
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
private
 | 
			
		||||
slots:
 | 
			
		||||
	void initTestCase()
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	void cleanupTestCase()
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	static QString findTestDataUrl(const char *file)
 | 
			
		||||
	{
 | 
			
		||||
		return QUrl::fromLocalFile(QFINDTESTDATA(file)).toString();
 | 
			
		||||
	}
 | 
			
		||||
	void tst_ChannelListParsing_data()
 | 
			
		||||
	{
 | 
			
		||||
		QTest::addColumn<QString>("channel");
 | 
			
		||||
		QTest::addColumn<QString>("channelUrl");
 | 
			
		||||
		QTest::addColumn<bool>("hasChannels");
 | 
			
		||||
		QTest::addColumn<bool>("valid");
 | 
			
		||||
		QTest::addColumn<QList<UpdateChecker::ChannelListEntry> >("result");
 | 
			
		||||
 | 
			
		||||
		QTest::newRow("garbage")
 | 
			
		||||
				<< QString()
 | 
			
		||||
				<< findTestDataUrl("data/garbageChannels.json")
 | 
			
		||||
				<< false
 | 
			
		||||
				<< false
 | 
			
		||||
				<< QList<UpdateChecker::ChannelListEntry>();
 | 
			
		||||
		QTest::newRow("errors")
 | 
			
		||||
				<< QString()
 | 
			
		||||
				<< findTestDataUrl("data/errorChannels.json")
 | 
			
		||||
				<< false
 | 
			
		||||
				<< true
 | 
			
		||||
				<< QList<UpdateChecker::ChannelListEntry>();
 | 
			
		||||
		QTest::newRow("no channels")
 | 
			
		||||
				<< QString()
 | 
			
		||||
				<< findTestDataUrl("data/noChannels.json")
 | 
			
		||||
				<< false
 | 
			
		||||
				<< true
 | 
			
		||||
				<< QList<UpdateChecker::ChannelListEntry>();
 | 
			
		||||
		QTest::newRow("one channel")
 | 
			
		||||
				<< QString("develop")
 | 
			
		||||
				<< findTestDataUrl("data/oneChannel.json")
 | 
			
		||||
				<< true
 | 
			
		||||
				<< true
 | 
			
		||||
				<< (QList<UpdateChecker::ChannelListEntry>() << UpdateChecker::ChannelListEntry{"develop", "Develop", "The channel called \"develop\"", "http://example.org/stuff"});
 | 
			
		||||
		QTest::newRow("several channels")
 | 
			
		||||
				<< QString("develop")
 | 
			
		||||
				<< findTestDataUrl("data/channels.json")
 | 
			
		||||
				<< true
 | 
			
		||||
				<< true
 | 
			
		||||
				<< (QList<UpdateChecker::ChannelListEntry>()
 | 
			
		||||
					<< UpdateChecker::ChannelListEntry{"develop", "Develop", "The channel called \"develop\"", findTestDataUrl("data")}
 | 
			
		||||
					<< UpdateChecker::ChannelListEntry{"stable", "Stable", "It's stable at least", findTestDataUrl("data")}
 | 
			
		||||
					<< UpdateChecker::ChannelListEntry{"42", "The Channel", "This is the channel that is going to answer all of your questions", "https://dent.me/tea"});
 | 
			
		||||
	}
 | 
			
		||||
	void tst_ChannelListParsing()
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
		QFETCH(QString, channel);
 | 
			
		||||
		QFETCH(QString, channelUrl);
 | 
			
		||||
		QFETCH(bool, hasChannels);
 | 
			
		||||
		QFETCH(bool, valid);
 | 
			
		||||
		QFETCH(QList<UpdateChecker::ChannelListEntry>, result);
 | 
			
		||||
 | 
			
		||||
		UpdateChecker checker(channelUrl, channel, 0);
 | 
			
		||||
 | 
			
		||||
		QSignalSpy channelListLoadedSpy(&checker, SIGNAL(channelListLoaded()));
 | 
			
		||||
		QVERIFY(channelListLoadedSpy.isValid());
 | 
			
		||||
 | 
			
		||||
		checker.updateChanList(false);
 | 
			
		||||
 | 
			
		||||
		if (valid)
 | 
			
		||||
		{
 | 
			
		||||
			QVERIFY(channelListLoadedSpy.wait());
 | 
			
		||||
			QCOMPARE(channelListLoadedSpy.size(), 1);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			channelListLoadedSpy.wait();
 | 
			
		||||
			QCOMPARE(channelListLoadedSpy.size(), 0);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		QCOMPARE(checker.hasChannels(), hasChannels);
 | 
			
		||||
		QCOMPARE(checker.getChannelList(), result);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void tst_UpdateChecking()
 | 
			
		||||
	{
 | 
			
		||||
		QString channel = "develop";
 | 
			
		||||
		QString channelUrl = findTestDataUrl("data/channels.json");
 | 
			
		||||
		int currentBuild = 2;
 | 
			
		||||
 | 
			
		||||
		UpdateChecker checker(channelUrl, channel, currentBuild);
 | 
			
		||||
 | 
			
		||||
		QSignalSpy updateAvailableSpy(&checker, SIGNAL(updateAvailable(GoUpdate::Status)));
 | 
			
		||||
		QVERIFY(updateAvailableSpy.isValid());
 | 
			
		||||
		QSignalSpy channelListLoadedSpy(&checker, SIGNAL(channelListLoaded()));
 | 
			
		||||
		QVERIFY(channelListLoadedSpy.isValid());
 | 
			
		||||
 | 
			
		||||
		checker.updateChanList(false);
 | 
			
		||||
		QVERIFY(channelListLoadedSpy.wait());
 | 
			
		||||
 | 
			
		||||
		qDebug() << "CWD:" << QDir::current().absolutePath();
 | 
			
		||||
		checker.m_channels[0].url = findTestDataUrl("data/");
 | 
			
		||||
		checker.checkForUpdate(channel, false);
 | 
			
		||||
 | 
			
		||||
		QVERIFY(updateAvailableSpy.wait());
 | 
			
		||||
 | 
			
		||||
		auto status = updateAvailableSpy.first().first().value<GoUpdate::Status>();
 | 
			
		||||
		QCOMPARE(checker.m_channels[0].url, status.newRepoUrl);
 | 
			
		||||
		QCOMPARE(3, status.newVersionId);
 | 
			
		||||
		QCOMPARE(currentBuild, status.currentVersionId);
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
QTEST_GUILESS_MAIN(UpdateCheckerTest)
 | 
			
		||||
 | 
			
		||||
#include "UpdateChecker_test.moc"
 | 
			
		||||
							
								
								
									
										43
									
								
								api/logic/updater/testdata/1.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								api/logic/updater/testdata/1.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
{
 | 
			
		||||
	"ApiVersion": 0,
 | 
			
		||||
	"Id": 1,
 | 
			
		||||
	"Name": "1.0.1",
 | 
			
		||||
	"Files": [
 | 
			
		||||
		{
 | 
			
		||||
			"Path": "fileOne",
 | 
			
		||||
			"Sources": [
 | 
			
		||||
				{
 | 
			
		||||
					"SourceType": "http",
 | 
			
		||||
					"Url": "@TEST_DATA_URL@/fileOneA"
 | 
			
		||||
				}
 | 
			
		||||
			],
 | 
			
		||||
			"Executable": true,
 | 
			
		||||
			"Perms": 493,
 | 
			
		||||
			"MD5": "9eb84090956c484e32cb6c08455a667b"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"Path": "fileTwo",
 | 
			
		||||
			"Sources": [
 | 
			
		||||
				{
 | 
			
		||||
					"SourceType": "http",
 | 
			
		||||
					"Url": "@TEST_DATA_URL@/fileTwo"
 | 
			
		||||
				}
 | 
			
		||||
			],
 | 
			
		||||
			"Executable": false,
 | 
			
		||||
			"Perms": 644,
 | 
			
		||||
			"MD5": "38f94f54fa3eb72b0ea836538c10b043"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"Path": "fileThree",
 | 
			
		||||
			"Sources": [
 | 
			
		||||
				{
 | 
			
		||||
					"SourceType": "http",
 | 
			
		||||
					"Url": "@TEST_DATA_URL@/fileThree"
 | 
			
		||||
				}
 | 
			
		||||
			],
 | 
			
		||||
			"Executable": false,
 | 
			
		||||
			"Perms": "750",
 | 
			
		||||
			"MD5": "f12df554b21e320be6471d7154130e70"
 | 
			
		||||
		}
 | 
			
		||||
	]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								api/logic/updater/testdata/2.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								api/logic/updater/testdata/2.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
{
 | 
			
		||||
	"ApiVersion": 0,
 | 
			
		||||
	"Id": 1,
 | 
			
		||||
	"Name": "1.0.1",
 | 
			
		||||
	"Files": [
 | 
			
		||||
		{
 | 
			
		||||
			"Path": "fileOne",
 | 
			
		||||
			"Sources": [
 | 
			
		||||
				{
 | 
			
		||||
					"SourceType": "http",
 | 
			
		||||
					"Url": "@TEST_DATA_URL@/fileOneB"
 | 
			
		||||
				}
 | 
			
		||||
			],
 | 
			
		||||
			"Executable": true,
 | 
			
		||||
			"Perms": 493,
 | 
			
		||||
			"MD5": "42915a71277c9016668cce7b82c6b577"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"Path": "fileTwo",
 | 
			
		||||
			"Sources": [
 | 
			
		||||
				{
 | 
			
		||||
					"SourceType": "http",
 | 
			
		||||
					"Url": "@TEST_DATA_URL@/fileTwo"
 | 
			
		||||
				}
 | 
			
		||||
			],
 | 
			
		||||
			"Executable": false,
 | 
			
		||||
			"Perms": 644,
 | 
			
		||||
			"MD5": "38f94f54fa3eb72b0ea836538c10b043"
 | 
			
		||||
		}
 | 
			
		||||
	]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								api/logic/updater/testdata/channels.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								api/logic/updater/testdata/channels.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
{
 | 
			
		||||
	"format_version": 0,
 | 
			
		||||
	"channels": [
 | 
			
		||||
		{
 | 
			
		||||
			"id": "develop",
 | 
			
		||||
			"name": "Develop",
 | 
			
		||||
			"description": "The channel called \"develop\"",
 | 
			
		||||
			"url": "@TEST_DATA_URL@"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"id": "stable",
 | 
			
		||||
			"name": "Stable",
 | 
			
		||||
			"description": "It's stable at least",
 | 
			
		||||
			"url": "@TEST_DATA_URL@"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"id": "42",
 | 
			
		||||
			"name": "The Channel",
 | 
			
		||||
			"description": "This is the channel that is going to answer all of your questions",
 | 
			
		||||
			"url": "https://dent.me/tea"
 | 
			
		||||
		}
 | 
			
		||||
	]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								api/logic/updater/testdata/errorChannels.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								api/logic/updater/testdata/errorChannels.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
{
 | 
			
		||||
	"format_version": 0,
 | 
			
		||||
	"channels": [
 | 
			
		||||
		{
 | 
			
		||||
			"id": "",
 | 
			
		||||
			"name": "Develop",
 | 
			
		||||
			"description": "The channel called \"develop\"",
 | 
			
		||||
			"url": "http://example.org/stuff"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"id": "stable",
 | 
			
		||||
			"name": "",
 | 
			
		||||
			"description": "It's stable at least",
 | 
			
		||||
			"url": "ftp://username@host/path/to/stuff"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"id": "42",
 | 
			
		||||
			"name": "The Channel",
 | 
			
		||||
			"description": "This is the channel that is going to answer all of your questions",
 | 
			
		||||
			"url": ""
 | 
			
		||||
		}
 | 
			
		||||
	]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								api/logic/updater/testdata/fileOneA
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								api/logic/updater/testdata/fileOneA
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
stuff
 | 
			
		||||
							
								
								
									
										3
									
								
								api/logic/updater/testdata/fileOneB
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								api/logic/updater/testdata/fileOneB
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
stuff
 | 
			
		||||
 | 
			
		||||
more stuff that came in the new version
 | 
			
		||||
							
								
								
									
										1
									
								
								api/logic/updater/testdata/fileThree
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								api/logic/updater/testdata/fileThree
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
this is yet another file
 | 
			
		||||
							
								
								
									
										1
									
								
								api/logic/updater/testdata/fileTwo
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								api/logic/updater/testdata/fileTwo
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
some other stuff
 | 
			
		||||
							
								
								
									
										22
									
								
								api/logic/updater/testdata/garbageChannels.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								api/logic/updater/testdata/garbageChannels.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
{
 | 
			
		||||
	"format_version": 0,
 | 
			
		||||
	"channels": [
 | 
			
		||||
		{
 | 
			
		||||
			"id": "develop",
 | 
			
		||||
			"name": "Develop",
 | 
			
		||||
			"description": "The channel called \"develop\"",
 | 
			
		||||
aa			"url": "http://example.org/stuff"
 | 
			
		||||
		},
 | 
			
		||||
a			"id": "stable",
 | 
			
		||||
			"name": "Stable",
 | 
			
		||||
			"description": "It's stable at least",
 | 
			
		||||
			"url": "ftp://username@host/path/to/stuff"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"id": "42"f
 | 
			
		||||
			"name": "The Channel",
 | 
			
		||||
			"description": "This is the channel that is going to answer all of your questions",
 | 
			
		||||
			"url": "https://dent.me/tea"
 | 
			
		||||
		}
 | 
			
		||||
	]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								api/logic/updater/testdata/index.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								api/logic/updater/testdata/index.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
{
 | 
			
		||||
	"ApiVersion": 0,
 | 
			
		||||
	"Versions": [
 | 
			
		||||
		{ "Id": 0, "Name": "1.0.0" },
 | 
			
		||||
		{ "Id": 1, "Name": "1.0.1" },
 | 
			
		||||
		{ "Id": 2, "Name": "1.0.2" },
 | 
			
		||||
		{ "Id": 3, "Name": "1.0.3" }
 | 
			
		||||
	]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										5
									
								
								api/logic/updater/testdata/noChannels.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								api/logic/updater/testdata/noChannels.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
{
 | 
			
		||||
	"format_version": 0,
 | 
			
		||||
	"channels": [
 | 
			
		||||
	]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								api/logic/updater/testdata/oneChannel.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								api/logic/updater/testdata/oneChannel.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
{
 | 
			
		||||
	"format_version": 0,
 | 
			
		||||
	"channels": [
 | 
			
		||||
		{
 | 
			
		||||
			"id": "develop",
 | 
			
		||||
			"name": "Develop",
 | 
			
		||||
			"description": "The channel called \"develop\"",
 | 
			
		||||
			"url": "http://example.org/stuff"
 | 
			
		||||
		}
 | 
			
		||||
	]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								api/logic/updater/testdata/tst_DownloadTask-test_writeInstallScript.xml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								api/logic/updater/testdata/tst_DownloadTask-test_writeInstallScript.xml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
<update version="3">
 | 
			
		||||
 <install>
 | 
			
		||||
  <file>
 | 
			
		||||
   <source>sourceOne</source>
 | 
			
		||||
   <dest>destOne</dest>
 | 
			
		||||
   <mode>0777</mode>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file>
 | 
			
		||||
   <source>MultiMC.exe</source>
 | 
			
		||||
   <dest>M/u/l/t/i/M/C/e/x/e</dest>
 | 
			
		||||
   <mode>0644</mode>
 | 
			
		||||
  </file>
 | 
			
		||||
 </install>
 | 
			
		||||
 <uninstall>
 | 
			
		||||
  <file>toDelete.abc</file>
 | 
			
		||||
 </uninstall>
 | 
			
		||||
</update>
 | 
			
		||||
							
								
								
									
										50
									
								
								api/logic/wonko/WonkoIndex_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								api/logic/wonko/WonkoIndex_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
			
		||||
#include <QTest>
 | 
			
		||||
#include "TestUtil.h"
 | 
			
		||||
 | 
			
		||||
#include "wonko/WonkoIndex.h"
 | 
			
		||||
#include "wonko/WonkoVersionList.h"
 | 
			
		||||
#include "Env.h"
 | 
			
		||||
 | 
			
		||||
class WonkoIndexTest : public QObject
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
private
 | 
			
		||||
slots:
 | 
			
		||||
	void test_isProvidedByEnv()
 | 
			
		||||
	{
 | 
			
		||||
		QVERIFY(ENV.wonkoIndex() != nullptr);
 | 
			
		||||
		QCOMPARE(ENV.wonkoIndex(), ENV.wonkoIndex());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_providesTasks()
 | 
			
		||||
	{
 | 
			
		||||
		QVERIFY(ENV.wonkoIndex()->localUpdateTask() != nullptr);
 | 
			
		||||
		QVERIFY(ENV.wonkoIndex()->remoteUpdateTask() != nullptr);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_hasUid_and_getList()
 | 
			
		||||
	{
 | 
			
		||||
		WonkoIndex windex({std::make_shared<WonkoVersionList>("list1"), std::make_shared<WonkoVersionList>("list2"), std::make_shared<WonkoVersionList>("list3")});
 | 
			
		||||
		QVERIFY(windex.hasUid("list1"));
 | 
			
		||||
		QVERIFY(!windex.hasUid("asdf"));
 | 
			
		||||
		QVERIFY(windex.getList("list2") != nullptr);
 | 
			
		||||
		QCOMPARE(windex.getList("list2")->uid(), QString("list2"));
 | 
			
		||||
		QVERIFY(windex.getList("adsf") == nullptr);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void test_merge()
 | 
			
		||||
	{
 | 
			
		||||
		WonkoIndex windex({std::make_shared<WonkoVersionList>("list1"), std::make_shared<WonkoVersionList>("list2"), std::make_shared<WonkoVersionList>("list3")});
 | 
			
		||||
		QCOMPARE(windex.lists().size(), 3);
 | 
			
		||||
		windex.merge(std::shared_ptr<WonkoIndex>(new WonkoIndex({std::make_shared<WonkoVersionList>("list1"), std::make_shared<WonkoVersionList>("list2"), std::make_shared<WonkoVersionList>("list3")})));
 | 
			
		||||
		QCOMPARE(windex.lists().size(), 3);
 | 
			
		||||
		windex.merge(std::shared_ptr<WonkoIndex>(new WonkoIndex({std::make_shared<WonkoVersionList>("list4"), std::make_shared<WonkoVersionList>("list2"), std::make_shared<WonkoVersionList>("list5")})));
 | 
			
		||||
		QCOMPARE(windex.lists().size(), 5);
 | 
			
		||||
		windex.merge(std::shared_ptr<WonkoIndex>(new WonkoIndex({std::make_shared<WonkoVersionList>("list6")})));
 | 
			
		||||
		QCOMPARE(windex.lists().size(), 6);
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
QTEST_GUILESS_MAIN(WonkoIndexTest)
 | 
			
		||||
 | 
			
		||||
#include "WonkoIndex_test.moc"
 | 
			
		||||
		Reference in New Issue
	
	Block a user