diff --git a/MUtilities_VS2017.sln b/MUtilities_VS2017.sln
index 17dcacf..37908e3 100644
--- a/MUtilities_VS2017.sln
+++ b/MUtilities_VS2017.sln
@@ -5,6 +5,8 @@ VisualStudioVersion = 15.0.26430.16
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MUtilities", "MUtilities_VS2017.vcxproj", "{55405FE1-149F-434C-9D72-4B64348D2A08}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MUtilitiesTest", "test\MUtilitiesTest_VS2017.vcxproj", "{B7BCA0A5-17AD-4F20-A42C-CD6FFBD55D89}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
@@ -18,8 +20,17 @@ Global
{55405FE1-149F-434C-9D72-4B64348D2A08}.Release_Static|x86.Build.0 = Release_Static|Win32
{55405FE1-149F-434C-9D72-4B64348D2A08}.Release|x86.ActiveCfg = Release|Win32
{55405FE1-149F-434C-9D72-4B64348D2A08}.Release|x86.Build.0 = Release|Win32
+ {B7BCA0A5-17AD-4F20-A42C-CD6FFBD55D89}.Debug|x86.ActiveCfg = Debug|Win32
+ {B7BCA0A5-17AD-4F20-A42C-CD6FFBD55D89}.Debug|x86.Build.0 = Debug|Win32
+ {B7BCA0A5-17AD-4F20-A42C-CD6FFBD55D89}.Release_Static|x86.ActiveCfg = Release_Static|Win32
+ {B7BCA0A5-17AD-4F20-A42C-CD6FFBD55D89}.Release_Static|x86.Build.0 = Release_Static|Win32
+ {B7BCA0A5-17AD-4F20-A42C-CD6FFBD55D89}.Release|x86.ActiveCfg = Release|Win32
+ {B7BCA0A5-17AD-4F20-A42C-CD6FFBD55D89}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {46D377DA-C6DC-44E6-9320-01A50F650EB9}
+ EndGlobalSection
EndGlobal
diff --git a/test/MUtilitiesTest_VS2017.vcxproj b/test/MUtilitiesTest_VS2017.vcxproj
new file mode 100644
index 0000000..7954be1
--- /dev/null
+++ b/test/MUtilitiesTest_VS2017.vcxproj
@@ -0,0 +1,168 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release_Static
+ Win32
+
+
+ Release
+ Win32
+
+
+
+
+
+
+
+
+
+
+ {55405fe1-149f-434c-9d72-4b64348d2a08}
+
+
+
+
+
+
+ {B7BCA0A5-17AD-4F20-A42C-CD6FFBD55D89}
+ Win32Proj
+ MUtilitiesTest_VS2017
+ 8.1
+ MUtilitiesTest
+
+
+
+ Application
+ true
+ v141_xp
+ Unicode
+
+
+ Application
+ false
+ v141_xp
+ true
+ Unicode
+
+
+ Application
+ false
+ v141_xp
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ $(SolutionDir)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\obj\$(Platform)\$(Configuration)\$(ProjectName)\
+
+
+ false
+ $(SolutionDir)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\obj\$(Platform)\$(Configuration)\$(ProjectName)\
+
+
+ false
+ $(SolutionDir)\bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)\obj\$(Platform)\$(Configuration)\$(ProjectName)\
+
+
+
+
+
+ Level3
+ Disabled
+ WIN32;_DEBUG;_CONSOLE;QT_GUI_LIB;QT_CORE_LIB;QT_THREAD_SUPPORT;QT_DEBUG;%(PreprocessorDefinitions)
+ $(SolutionDir)\include;$(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(SolutionDir)\..\Prerequisites\GoogleTest\include;%(AdditionalIncludeDirectories)
+ MultiThreadedDebugDLL
+ NoExtensions
+
+
+ Console
+ true
+ $(SolutionDir)\..\Prerequisites\Qt4\$(PlatformToolset)\Debug\lib;$(SolutionDir)\..\Prerequisites\GoogleTest\lib\$(PlatformToolset)\Debug;%(AdditionalLibraryDirectories)
+ notelemetry.obj;gtestd.lib;QtCored4.lib;QtGuid4.lib;%(AdditionalDependencies)
+ LinkVerboseLib
+
+
+
+
+ Level3
+
+
+ Full
+ true
+ true
+ WIN32;NDEBUG;_CONSOLE;QT_GUI_LIB;QT_CORE_LIB;QT_THREAD_SUPPORT;QT_NO_DEBUG;%(PreprocessorDefinitions)
+ $(SolutionDir)\include;$(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(SolutionDir)\..\Prerequisites\GoogleTest\include;%(AdditionalIncludeDirectories)
+ MultiThreadedDLL
+ NoExtensions
+ false
+ AnySuitable
+ Speed
+ true
+
+
+ Console
+ true
+ true
+ true
+ $(SolutionDir)\..\Prerequisites\Qt4\$(PlatformToolset)\Shared\lib;$(SolutionDir)\..\Prerequisites\GoogleTest\lib\$(PlatformToolset)\Shared;%(AdditionalLibraryDirectories)
+ notelemetry.obj;gtest.lib;QtCore4.lib;QtGui4.lib;%(AdditionalDependencies)
+ LinkVerboseLib
+
+
+
+
+ Level3
+
+
+ Full
+ true
+ true
+ WIN32;NDEBUG;_CONSOLE;MUTILS_STATIC_LIB;QT_GUI_LIB;QT_CORE_LIB;QT_THREAD_SUPPORT;QT_NODLL;QT_NO_DEBUG;%(PreprocessorDefinitions)
+ $(SolutionDir)\include;$(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(SolutionDir)\..\Prerequisites\GoogleTest\include;%(AdditionalIncludeDirectories)
+ MultiThreaded
+ NoExtensions
+ false
+ AnySuitable
+ Speed
+ true
+
+
+ Console
+ true
+ true
+ true
+ $(SolutionDir)\..\Prerequisites\Qt4\$(PlatformToolset)\Static\lib;$(SolutionDir)\..\Prerequisites\GoogleTest\lib\$(PlatformToolset)\Static;%(AdditionalLibraryDirectories)
+ notelemetry.obj;gtest.lib;QtCore.lib;QtGui.lib;Ws2_32.lib;Winmm.lib;Imm32.lib;PowrProf.lib;Version.lib;Psapi.lib;Sensapi.lib;%(AdditionalDependencies)
+ LinkVerboseLib
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/MUtilitiesTest_VS2017.vcxproj.filters b/test/MUtilitiesTest_VS2017.vcxproj.filters
new file mode 100644
index 0000000..297923c
--- /dev/null
+++ b/test/MUtilitiesTest_VS2017.vcxproj.filters
@@ -0,0 +1,36 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Header Files
+
+
+
\ No newline at end of file
diff --git a/test/src/OSTest.cpp b/test/src/OSTest.cpp
new file mode 100644
index 0000000..e1a72be
--- /dev/null
+++ b/test/src/OSTest.cpp
@@ -0,0 +1,113 @@
+///////////////////////////////////////////////////////////////////////////////
+// MuldeR's Utilities for Qt
+// Copyright (C) 2004-2019 LoRd_MuldeR
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+//
+// http://www.gnu.org/licenses/lgpl-2.1.txt
+//////////////////////////////////////////////////////////////////////////////////
+
+#include "MUtilsTest.h"
+
+//MUtils
+#include
+
+//Qt
+#include
+#include
+
+//Win32
+#ifdef _WIN32
+#define WIN32_LEAN_AND_MEAN 1
+#include
+#endif
+
+//===========================================================================
+// TESTBED CLASS
+//===========================================================================
+
+class OSTest : public Testbed
+{
+protected:
+ virtual void SetUp()
+ {
+ }
+
+ virtual void TearDown()
+ {
+ }
+};
+
+//===========================================================================
+// TEST METHODS
+//===========================================================================
+
+
+static QString expandEnvVars(const wchar_t *text)
+{
+#ifdef _WINDOWS_
+ const DWORD size = ExpandEnvironmentStringsW(text, NULL, 0);
+ QVector buffer(size + 1);
+ const DWORD result = ExpandEnvironmentStringsW(text, buffer.data(), buffer.size());
+ if ((result > 0U) || (result <= size))
+ {
+ return MUTILS_QSTR(buffer.data());
+ }
+ return QString();
+#else
+ #error "Function expandEnvVars() not implemented!"
+#endif
+}
+
+//-----------------------------------------------------------------
+// KnownFolder
+//-----------------------------------------------------------------
+
+#define TEST_KNOWN_FOLDER(X,Y) do \
+{ \
+ const QString path = MUtils::OS::known_folder((MUtils::OS::##X)); \
+ /*_putws(MUTILS_WCHR(path));*/ \
+ ASSERT_FALSE(path.isEmpty()); \
+ const QString expected = QDir::fromNativeSeparators(expandEnvVars((Y))); \
+ ASSERT_STRCASEEQ(MUTILS_UTF8(path), MUTILS_UTF8(expected)); \
+} \
+while(0)
+
+TEST_F(OSTest, KnownFolder01) { TEST_KNOWN_FOLDER(FOLDER_PROFILE_USER, L"%USERPROFILE%"); }
+TEST_F(OSTest, KnownFolder02) { TEST_KNOWN_FOLDER(FOLDER_PROFILE_PUBL, L"%PUBLIC%"); }
+TEST_F(OSTest, KnownFolder03) { TEST_KNOWN_FOLDER(FOLDER_APPDATA_ROAM, L"%APPDATA%"); }
+TEST_F(OSTest, KnownFolder04) { TEST_KNOWN_FOLDER(FOLDER_APPDATA_LOCA, L"%LOCALAPPDATA%"); }
+TEST_F(OSTest, KnownFolder05) { TEST_KNOWN_FOLDER(FOLDER_DOCS_USER, L"%USERPROFILE%/Documents"); }
+TEST_F(OSTest, KnownFolder06) { TEST_KNOWN_FOLDER(FOLDER_DOCS_PUBL, L"%PUBLIC%/Documents"); }
+TEST_F(OSTest, KnownFolder07) { TEST_KNOWN_FOLDER(FOLDER_DESKTOP_USER, L"%USERPROFILE%/Desktop"); }
+TEST_F(OSTest, KnownFolder08) { TEST_KNOWN_FOLDER(FOLDER_DESKTOP_PUBL, L"%PUBLIC%/Desktop"); }
+TEST_F(OSTest, KnownFolder09) { TEST_KNOWN_FOLDER(FOLDER_PICTURES_USER, L"%USERPROFILE%/Pictures"); }
+TEST_F(OSTest, KnownFolder10) { TEST_KNOWN_FOLDER(FOLDER_PICTURES_PUBL, L"%PUBLIC%/Pictures"); }
+TEST_F(OSTest, KnownFolder11) { TEST_KNOWN_FOLDER(FOLDER_MUSIC_USER, L"%USERPROFILE%/Music"); }
+TEST_F(OSTest, KnownFolder12) { TEST_KNOWN_FOLDER(FOLDER_MUSIC_PUBL, L"%PUBLIC%/Music"); }
+TEST_F(OSTest, KnownFolder13) { TEST_KNOWN_FOLDER(FOLDER_VIDEO_USER, L"%USERPROFILE%/Videos"); }
+TEST_F(OSTest, KnownFolder14) { TEST_KNOWN_FOLDER(FOLDER_VIDEO_PUBL, L"%PUBLIC%/Videos"); }
+#ifdef _WIN64
+TEST_F(OSTest, KnownFolder15) { TEST_KNOWN_FOLDER(FOLDER_PROGRAMS_DEF, L"%ProgramFiles%"); }
+TEST_F(OSTest, KnownFolder17) { TEST_KNOWN_FOLDER(FOLDER_PROGRAMS_X64, L"%ProgramW6432%"); }
+#else
+TEST_F(OSTest, KnownFolder15) { TEST_KNOWN_FOLDER(FOLDER_PROGRAMS_DEF, L"%ProgramFiles(x86)%"); }
+#endif
+TEST_F(OSTest, KnownFolder16) { TEST_KNOWN_FOLDER(FOLDER_PROGRAMS_X86, L"%ProgramFiles(x86)%"); }
+TEST_F(OSTest, KnownFolder18) { TEST_KNOWN_FOLDER(FOLDER_SYSROOT, L"%SystemRoot%"); }
+TEST_F(OSTest, KnownFolder19) { TEST_KNOWN_FOLDER(FOLDER_SYSTEM_DEF, L"%SystemRoot%/System32"); }
+TEST_F(OSTest, KnownFolder20) { TEST_KNOWN_FOLDER(FOLDER_SYSTEM_X86, L"%SystemRoot%/SysWOW64"); }
+
+#undef TEST_KNOWN_FOLDER