diff --git a/MissionEditor.sln b/MissionEditor.sln
index 592d9e1..9993885 100644
--- a/MissionEditor.sln
+++ b/MissionEditor.sln
@@ -15,8 +15,12 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MissionEditorPackLib", "Mis
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XCC Library", "3rdParty\xcc\Library\XCC Library.vcxproj", "{5E445578-CB45-4D82-9A1C-FC7D3E8D866A}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTest", "UnitTest\UnitTest.vcxproj", "{75E18879-7564-4A2C-8C00-393A5A17171F}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
FinalAlertDebug YR|Win32 = FinalAlertDebug YR|Win32
FinalAlertDebug YR|x64 = FinalAlertDebug YR|x64
FinalAlertDebug|Win32 = FinalAlertDebug|Win32
@@ -29,12 +33,18 @@ Global
FinalSunDebug|x64 = FinalSunDebug|x64
FinalSunRelease|Win32 = FinalSunRelease|Win32
FinalSunRelease|x64 = FinalSunRelease|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
Template|Win32 = Template|Win32
Template|x64 = Template|x64
Tests FinalAlertDebug YR|Win32 = Tests FinalAlertDebug YR|Win32
Tests FinalAlertDebug YR|x64 = Tests FinalAlertDebug YR|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {9326D29A-6547-42B9-A668-519F3C0720A9}.Debug|Win32.ActiveCfg = Tests FinalAlertDebug YR|Win32
+ {9326D29A-6547-42B9-A668-519F3C0720A9}.Debug|Win32.Build.0 = Tests FinalAlertDebug YR|Win32
+ {9326D29A-6547-42B9-A668-519F3C0720A9}.Debug|x64.ActiveCfg = Tests FinalAlertDebug YR|x64
+ {9326D29A-6547-42B9-A668-519F3C0720A9}.Debug|x64.Build.0 = Tests FinalAlertDebug YR|x64
{9326D29A-6547-42B9-A668-519F3C0720A9}.FinalAlertDebug YR|Win32.ActiveCfg = FinalAlertDebug YR|Win32
{9326D29A-6547-42B9-A668-519F3C0720A9}.FinalAlertDebug YR|Win32.Build.0 = FinalAlertDebug YR|Win32
{9326D29A-6547-42B9-A668-519F3C0720A9}.FinalAlertDebug YR|x64.ActiveCfg = FinalAlertDebug YR|x64
@@ -59,6 +69,10 @@ Global
{9326D29A-6547-42B9-A668-519F3C0720A9}.FinalSunRelease|Win32.Build.0 = FinalSunRelease|Win32
{9326D29A-6547-42B9-A668-519F3C0720A9}.FinalSunRelease|x64.ActiveCfg = FinalSunRelease|x64
{9326D29A-6547-42B9-A668-519F3C0720A9}.FinalSunRelease|x64.Build.0 = FinalSunRelease|x64
+ {9326D29A-6547-42B9-A668-519F3C0720A9}.Release|Win32.ActiveCfg = FinalSunRelease|Win32
+ {9326D29A-6547-42B9-A668-519F3C0720A9}.Release|Win32.Build.0 = FinalSunRelease|Win32
+ {9326D29A-6547-42B9-A668-519F3C0720A9}.Release|x64.ActiveCfg = FinalSunRelease|x64
+ {9326D29A-6547-42B9-A668-519F3C0720A9}.Release|x64.Build.0 = FinalSunRelease|x64
{9326D29A-6547-42B9-A668-519F3C0720A9}.Template|Win32.ActiveCfg = Template|Win32
{9326D29A-6547-42B9-A668-519F3C0720A9}.Template|Win32.Build.0 = Template|Win32
{9326D29A-6547-42B9-A668-519F3C0720A9}.Template|x64.ActiveCfg = Template|x64
@@ -67,6 +81,10 @@ Global
{9326D29A-6547-42B9-A668-519F3C0720A9}.Tests FinalAlertDebug YR|Win32.Build.0 = Tests FinalAlertDebug YR|Win32
{9326D29A-6547-42B9-A668-519F3C0720A9}.Tests FinalAlertDebug YR|x64.ActiveCfg = Tests FinalAlertDebug YR|x64
{9326D29A-6547-42B9-A668-519F3C0720A9}.Tests FinalAlertDebug YR|x64.Build.0 = Tests FinalAlertDebug YR|x64
+ {DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.Debug|Win32.Build.0 = Debug|Win32
+ {DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.Debug|x64.ActiveCfg = Debug|x64
+ {DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.Debug|x64.Build.0 = Debug|x64
{DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.FinalAlertDebug YR|Win32.ActiveCfg = Debug|Win32
{DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.FinalAlertDebug YR|Win32.Build.0 = Debug|Win32
{DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.FinalAlertDebug YR|x64.ActiveCfg = Debug|x64
@@ -91,6 +109,10 @@ Global
{DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.FinalSunRelease|Win32.Build.0 = Release|Win32
{DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.FinalSunRelease|x64.ActiveCfg = Release|x64
{DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.FinalSunRelease|x64.Build.0 = Release|x64
+ {DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.Release|Win32.ActiveCfg = Release|Win32
+ {DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.Release|Win32.Build.0 = Release|Win32
+ {DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.Release|x64.ActiveCfg = Release|x64
+ {DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.Release|x64.Build.0 = Release|x64
{DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.Template|Win32.ActiveCfg = Debug|Win32
{DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.Template|Win32.Build.0 = Debug|Win32
{DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.Template|x64.ActiveCfg = Debug|x64
@@ -99,6 +121,10 @@ Global
{DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.Tests FinalAlertDebug YR|Win32.Build.0 = Debug|Win32
{DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.Tests FinalAlertDebug YR|x64.ActiveCfg = Debug|x64
{DEB40EF0-E215-4C2F-A0AD-3742E2E01A8C}.Tests FinalAlertDebug YR|x64.Build.0 = Debug|x64
+ {5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.Debug|Win32.Build.0 = Debug|Win32
+ {5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.Debug|x64.ActiveCfg = Debug|x64
+ {5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.Debug|x64.Build.0 = Debug|x64
{5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.FinalAlertDebug YR|Win32.ActiveCfg = DebugMinimal|Win32
{5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.FinalAlertDebug YR|Win32.Build.0 = DebugMinimal|Win32
{5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.FinalAlertDebug YR|x64.ActiveCfg = DebugMinimal|x64
@@ -123,6 +149,10 @@ Global
{5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.FinalSunRelease|Win32.Build.0 = ReleaseMinimal|Win32
{5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.FinalSunRelease|x64.ActiveCfg = Release|x64
{5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.FinalSunRelease|x64.Build.0 = Release|x64
+ {5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.Release|Win32.ActiveCfg = Release|Win32
+ {5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.Release|Win32.Build.0 = Release|Win32
+ {5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.Release|x64.ActiveCfg = Release|x64
+ {5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.Release|x64.Build.0 = Release|x64
{5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.Template|Win32.ActiveCfg = ReleaseMinimal|Win32
{5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.Template|Win32.Build.0 = ReleaseMinimal|Win32
{5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.Template|x64.ActiveCfg = DebugMinimal|x64
@@ -131,6 +161,46 @@ Global
{5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.Tests FinalAlertDebug YR|Win32.Build.0 = DebugMinimal|Win32
{5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.Tests FinalAlertDebug YR|x64.ActiveCfg = Debug|x64
{5E445578-CB45-4D82-9A1C-FC7D3E8D866A}.Tests FinalAlertDebug YR|x64.Build.0 = Debug|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.Debug|Win32.Build.0 = Debug|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.Debug|x64.ActiveCfg = Debug|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.Debug|x64.Build.0 = Debug|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalAlertDebug YR|Win32.ActiveCfg = Debug|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalAlertDebug YR|Win32.Build.0 = Debug|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalAlertDebug YR|x64.ActiveCfg = Debug|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalAlertDebug YR|x64.Build.0 = Debug|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalAlertDebug|Win32.ActiveCfg = Debug|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalAlertDebug|Win32.Build.0 = Debug|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalAlertDebug|x64.ActiveCfg = Debug|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalAlertDebug|x64.Build.0 = Debug|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalAlertRelease YR|Win32.ActiveCfg = Release|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalAlertRelease YR|Win32.Build.0 = Release|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalAlertRelease YR|x64.ActiveCfg = Release|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalAlertRelease YR|x64.Build.0 = Release|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalAlertRelease|Win32.ActiveCfg = Release|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalAlertRelease|Win32.Build.0 = Release|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalAlertRelease|x64.ActiveCfg = Release|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalAlertRelease|x64.Build.0 = Release|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalSunDebug|Win32.ActiveCfg = Debug|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalSunDebug|Win32.Build.0 = Debug|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalSunDebug|x64.ActiveCfg = Debug|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalSunDebug|x64.Build.0 = Debug|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalSunRelease|Win32.ActiveCfg = Release|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalSunRelease|Win32.Build.0 = Release|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalSunRelease|x64.ActiveCfg = Release|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.FinalSunRelease|x64.Build.0 = Release|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.Release|Win32.ActiveCfg = Release|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.Release|Win32.Build.0 = Release|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.Release|x64.ActiveCfg = Release|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.Release|x64.Build.0 = Release|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.Template|Win32.ActiveCfg = Debug|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.Template|Win32.Build.0 = Debug|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.Template|x64.ActiveCfg = Debug|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.Template|x64.Build.0 = Debug|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.Tests FinalAlertDebug YR|Win32.ActiveCfg = Debug|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.Tests FinalAlertDebug YR|Win32.Build.0 = Debug|Win32
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.Tests FinalAlertDebug YR|x64.ActiveCfg = Debug|x64
+ {75E18879-7564-4A2C-8C00-393A5A17171F}.Tests FinalAlertDebug YR|x64.Build.0 = Debug|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/UnitTest/CIni_Test.cpp b/UnitTest/CIni_Test.cpp
new file mode 100644
index 0000000..8bdb7ac
--- /dev/null
+++ b/UnitTest/CIni_Test.cpp
@@ -0,0 +1,24 @@
+#include "stdafx.h"
+#include "../MissionEditor/IniFile.h"
+
+TEST(CIniFileClass, LoadFileTest) {
+ auto const iniContent = R"(
+[Debug]
+;DisplayAllOverlay=Yes ; Doesn´t cripple the overlay list in any way
+;EnableTrackLogic=Yes ; Enables Track Logic
+;IgnoreSHPImageHeadUnused=Yes ; Use this *carefully* to make SHP graphics of some mods work that incorrectly have the shadow flag set
+AllowTunnels=yes
+AllowUnidirectionalTunnels=yes
+)";
+
+ auto const testIni = "test.ini";
+ std::ofstream iniFile(testIni);
+ iniFile << iniContent;
+ iniFile.flush();
+ iniFile.close();
+
+ CIniFile file;
+ ASSERT_EQ(file.LoadFile(std::string(testIni)), 0);
+
+ EXPECT_EQ(true, file.GetBool("Debug","AllowTunnels"));
+}
\ No newline at end of file
diff --git a/UnitTest/StdAfx.h b/UnitTest/StdAfx.h
new file mode 100644
index 0000000..6addd5a
--- /dev/null
+++ b/UnitTest/StdAfx.h
@@ -0,0 +1,32 @@
+/*
+ FinalSun/FinalAlert 2 Mission Editor
+
+ Copyright (C) 1999-2024 Electronic Arts, Inc.
+ Authored by Matthias Wagner
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+// stdafx.h : include everything that should be available everywhere in the code
+//
+
+#pragma once
+
+#include
+#include
+#include
+
+#if !defined(ASSERT)
+#define ASSERT(x) if (!(x)) throw("assertion failed");
+#endif
\ No newline at end of file
diff --git a/UnitTest/UnitTest.cpp b/UnitTest/UnitTest.cpp
new file mode 100644
index 0000000..13f2772
--- /dev/null
+++ b/UnitTest/UnitTest.cpp
@@ -0,0 +1,2 @@
+#include "stdafx.h"
+
diff --git a/UnitTest/UnitTest.vcxproj b/UnitTest/UnitTest.vcxproj
new file mode 100644
index 0000000..9b9ec94
--- /dev/null
+++ b/UnitTest/UnitTest.vcxproj
@@ -0,0 +1,145 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 16.0
+ Win32Proj
+ {75e18879-7564-4a2c-8c00-393a5a17171f}
+ UnitTest
+ 10.0
+
+
+
+ Application
+ true
+ v143
+ Unicode
+
+
+ Application
+ false
+ v143
+ true
+ Unicode
+
+
+ Application
+ true
+ v143
+ MultiByte
+
+
+ Application
+ false
+ v143
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Level3
+ true
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+ Console
+ true
+
+
+
+
+ Level3
+ true
+ true
+ true
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+ Console
+ true
+ true
+ true
+
+
+
+
+ Level3
+ true
+ _DEBUG;_CONSOLE;_AFXDLL;%(PreprocessorDefinitions)
+ true
+ $(SolutionDir)googletest\x64\include;%(AdditionalIncludeDirectories)
+ Create
+ MultiThreadedDebugDLL
+
+
+ Console
+ true
+ $(SolutionDir)googletest\x64\lib\$(Configuration)\*.lib;%(AdditionalDependencies)
+
+
+
+
+ Level3
+ true
+ true
+ true
+ NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+ Console
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UnitTest/UnitTest.vcxproj.filters b/UnitTest/UnitTest.vcxproj.filters
new file mode 100644
index 0000000..37e3ea3
--- /dev/null
+++ b/UnitTest/UnitTest.vcxproj.filters
@@ -0,0 +1,36 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;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
+
+
+
+
+ 源文件
+
+
+ 源文件
+
+
+ 源文件
+
+
+
+
+ 头文件
+
+
+ 头文件
+
+
+
\ No newline at end of file