diff --git a/apps/components_tests/CMakeLists.txt b/apps/components_tests/CMakeLists.txt index 4f260be189..22bb542538 100644 --- a/apps/components_tests/CMakeLists.txt +++ b/apps/components_tests/CMakeLists.txt @@ -78,6 +78,7 @@ file(GLOB UNITTEST_SRC_FILES esm3/testsaveload.cpp esm3/testesmwriter.cpp esm3/testinfoorder.cpp + esm3/testcstringids.cpp nifosg/testnifloader.cpp diff --git a/apps/components_tests/esm3/testcstringids.cpp b/apps/components_tests/esm3/testcstringids.cpp new file mode 100644 index 0000000000..239b205965 --- /dev/null +++ b/apps/components_tests/esm3/testcstringids.cpp @@ -0,0 +1,57 @@ +#include +#include +#include + +#include + +namespace ESM +{ + namespace + { + TEST(Esm3CStringIdTest, dialNameShouldBeNullTerminated) + { + std::unique_ptr stream; + + { + auto ostream = std::make_unique(); + + ESMWriter writer; + writer.setFormatVersion(DefaultFormatVersion); + writer.save(*ostream); + + Dialogue record; + record.blank(); + record.mStringId = "topic name"; + record.mId = RefId::stringRefId(record.mStringId); + record.mType = Dialogue::Topic; + writer.startRecord(Dialogue::sRecordId); + record.save(writer); + writer.endRecord(Dialogue::sRecordId); + + stream = std::move(ostream); + } + + ESMReader reader; + reader.open(std::move(stream), "stream"); + ASSERT_TRUE(reader.hasMoreRecs()); + ASSERT_EQ(reader.getRecName(), Dialogue::sRecordId); + reader.getRecHeader(); + while (reader.hasMoreSubs()) + { + reader.getSubName(); + if (reader.retSubName().toInt() == SREC_NAME) + { + reader.getSubHeader(); + auto size = reader.getSubSize(); + std::string buffer(size, '1'); + reader.getExact(buffer.data(), size); + ASSERT_EQ(buffer[size - 1], '\0'); + return; + } + else + reader.skipHSub(); + } + ASSERT_FALSE(true); + } + } +} diff --git a/apps/components_tests/esm3/testesmwriter.cpp b/apps/components_tests/esm3/testesmwriter.cpp index 9e9ae9947e..c481684c8d 100644 --- a/apps/components_tests/esm3/testesmwriter.cpp +++ b/apps/components_tests/esm3/testesmwriter.cpp @@ -57,7 +57,7 @@ namespace ESM // If this test failed probably there is a change in RefId format and CurrentSaveGameFormatVersion should be // incremented, current version should be handled. - TEST_P(Esm3EsmWriterRefIdSizeTest, writeHRefIdShouldProduceCertainNubmerOfBytes) + TEST_P(Esm3EsmWriterRefIdSizeTest, writeHRefIdShouldProduceCertainNumberOfBytes) { const auto [refId, size] = GetParam(); diff --git a/components/esm3/loaddial.cpp b/components/esm3/loaddial.cpp index 0ac0e2f197..4b546f0d9c 100644 --- a/components/esm3/loaddial.cpp +++ b/components/esm3/loaddial.cpp @@ -85,7 +85,7 @@ namespace ESM esm.writeHNCString("NAME", mStringId); } else if (esm.getFormatVersion() <= MaxNameIsRefIdOnlyFormatVersion) - esm.writeHNRefId("NAME", mId); + esm.writeHNCRefId("NAME", mId); else esm.writeHNRefId("ID__", mId);