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