diff --git a/MissionEditor/IniFile.h b/MissionEditor/IniFile.h
index d3b5c5d..4e552ee 100644
--- a/MissionEditor/IniFile.h
+++ b/MissionEditor/IniFile.h
@@ -172,14 +172,17 @@ public:
void RemoveAt(size_t idx) {
ASSERT(idx < value_pairs.size());
- for (auto affectedIdx = idx + 1; affectedIdx < value_pairs.size(); ++affectedIdx) {
+ // delete from record first;
+ auto const& pair = value_pairs.at(idx);
+ ASSERT(value_pos.erase(pair.first) == 1);
+ value_pairs.erase(value_pairs.begin() + idx);
+ // now update all key-pos indexing, dec 1
+ for (auto affectedIdx = idx; affectedIdx < value_pairs.size(); ++affectedIdx) {
auto const& kvPair = value_pairs[affectedIdx];
auto const it = value_pos.find(kvPair.first);
ASSERT(it != value_pos.end());
it->second--;
}
- auto const itErased = value_pairs.erase(value_pairs.begin() + idx);
- ASSERT(value_pos.erase(itErased->first) == 1);
}
void RemoveByKey(const CString& key) {
diff --git a/UnitTest/CIni_Test.cpp b/UnitTest/CIni_Test.cpp
index 8c261e9..c22031b 100644
--- a/UnitTest/CIni_Test.cpp
+++ b/UnitTest/CIni_Test.cpp
@@ -137,3 +137,104 @@ Count=10
EXPECT_EQ(false, file.GetBool("Debug", "DisplayAllOverlay"));
}
+TEST(CIniFileClass, IniAddSectionTest) {
+ auto const fileName = "test.ini";
+ IniTestHelper helper(fileName, R"(
+[SlopeSetPiecesDirections]
+Count=10
+0=Right_1
+1=Left_1
+2=Top_1
+3=Bottom_1
+4=Right_2
+5=Left_2
+6=Left_2
+7=Bottom_2
+8=Top_2
+9=Top_2
+)");
+
+ CIniFile file;
+ ASSERT_EQ(file.LoadFile(std::string(fileName)), 0);
+ file.AddSection("Debug");
+ auto pDebugSec = file.TryGetSection("Debug");
+ ASSERT_NE(pDebugSec, nullptr);
+ pDebugSec->SetBool("DisplayAllOverlay", false);
+ pDebugSec->SetBool("AllowTunnels", true);
+ EXPECT_EQ(true, file.GetBool("Debug", "AllowTunnels"));
+ EXPECT_EQ(false, file.GetBool("Debug", "DisplayAllOverlay"));
+}
+
+TEST(CIniFileClass, IniDeleteSectionTest) {
+ auto const fileName = "test.ini";
+ IniTestHelper helper(fileName, R"(
+[LUNARLimits]
+TreeMax=999
+TreeMin=999
+
+[URBANLimits]
+TreeMax=999
+;TreeMax=27
+
+[TEMPERATELimits]
+TreeMax=999
+;TreeMax=27
+
+[SNOWLimits]
+TreeMax=999
+;TreeMax=27
+
+[NEWURBANLimits]
+TreeMax=999
+;TreeMax=27
+
+[DESERTLimits]
+TreeMin=30
+TreeMax=999
+)");
+
+ CIniFile file;
+ ASSERT_EQ(file.LoadFile(std::string(fileName)), 0);
+
+ EXPECT_EQ(999, file.GetInteger("SNOWLimits", "TreeMax"));
+ EXPECT_EQ(999, file.GetInteger("LUNARLimits", "TreeMin"));
+
+ EXPECT_EQ(6, file.Size());
+ file.DeleteSection("SNOWLimits");
+
+ EXPECT_EQ(0, file.GetInteger("SNOWLimits", "TreeMax"));
+ EXPECT_EQ(nullptr, file.TryGetSection("SNOWLimits"));
+ EXPECT_EQ(5, file.Size());
+}
+
+TEST(CIniFileClass, IniDeleteValueTest) {
+ auto const fileName = "test.ini";
+ IniTestHelper helper(fileName, R"(
+[LUNARLimits]
+TreeMax=999
+TreeMin=999
+
+[NewUrbanInfo]
+Morphable2=114
+Ramps2=117
+Cliffs2=110
+CliffsWater2=112
+
+; tileset ini overwritings
+; only used by FinalAlert
+[IgnoreSetTEMPERATE]
+0=77
+1=78
+2=79
+)");
+
+ CIniFile file;
+ ASSERT_EQ(file.LoadFile(std::string(fileName)), 0);
+
+ EXPECT_EQ(114, file.GetInteger("NewUrbanInfo", "Morphable2"));
+ file.RemoveValueByKey("NewUrbanInfo", "Morphable2");
+
+ EXPECT_EQ(0, file.GetInteger("NewUrbanInfo", "Morphable2"));
+ EXPECT_EQ(false, file["NewUrbanInfo"].Exists("Morphable2"));
+
+}
\ No newline at end of file
diff --git a/UnitTest/UnitTest.vcxproj b/UnitTest/UnitTest.vcxproj
index 9b9ec94..76b6c5c 100644
--- a/UnitTest/UnitTest.vcxproj
+++ b/UnitTest/UnitTest.vcxproj
@@ -107,6 +107,7 @@
$(SolutionDir)googletest\x64\include;%(AdditionalIncludeDirectories)
Create
MultiThreadedDebugDLL
+ stdcpp20
Console