From 455d829f2fc29af96af124c2900dafcd2144afce Mon Sep 17 00:00:00 2001 From: Geoffrey Merck Date: Wed, 17 Dec 2025 20:22:02 +0100 Subject: [PATCH] add test suite for Ambefilereader, fix a bug where last word was not read #60 --- DStarBase/AMBEFileReader.cpp | 2 +- Tests/AMBEFileReader/TIME_fr_FR2.ambe | Bin 0 -> 8941 bytes Tests/AMBEFileReader/TIME_fr_FR2.indx | 20 +++++++++++ Tests/AMBEFileReader/lookup.cpp | 47 ++++++++++++++++++-------- 4 files changed, 53 insertions(+), 16 deletions(-) create mode 100644 Tests/AMBEFileReader/TIME_fr_FR2.ambe create mode 100644 Tests/AMBEFileReader/TIME_fr_FR2.indx diff --git a/DStarBase/AMBEFileReader.cpp b/DStarBase/AMBEFileReader.cpp index 119ea4a..349a811 100644 --- a/DStarBase/AMBEFileReader.cpp +++ b/DStarBase/AMBEFileReader.cpp @@ -141,7 +141,7 @@ bool CAMBEFileReader::readIndex() unsigned long start = std::stoul(strt); unsigned long length = std::stoul(leng); - if (start >= m_ambeLength || (start + length) >= m_ambeLength) + if (start >= m_ambeLength || (start + length) > m_ambeLength) CLog::logInfo("The start or end for *%s* is out of range, start: %lu, end: %lu\n", name.c_str(), start, start + length); else m_index[name] = new CIndexRecord(name, start + SILENCE_LENGTH, length); diff --git a/Tests/AMBEFileReader/TIME_fr_FR2.ambe b/Tests/AMBEFileReader/TIME_fr_FR2.ambe new file mode 100644 index 0000000000000000000000000000000000000000..6239b56621cb3f4b3390d153a9c3229818500002 GIT binary patch literal 8941 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 DRm$L- literal 0 HcmV?d00001 diff --git a/Tests/AMBEFileReader/TIME_fr_FR2.indx b/Tests/AMBEFileReader/TIME_fr_FR2.indx new file mode 100644 index 0000000..dd43877 --- /dev/null +++ b/Tests/AMBEFileReader/TIME_fr_FR2.indx @@ -0,0 +1,20 @@ +bonjour 0 66 +cinq 66 50 +deux 116 43 +dix 159 53 +et_demie 212 52 +et_quart 264 53 +heure 317 44 +heures 361 44 +huit 405 49 +il_est 454 44 +midi 498 50 +minuit 548 50 +moins_le_quart 598 64 +neuf 662 51 +onze 713 47 +quatre 760 49 +sept 809 46 +six 855 52 +trois 907 41 +une 948 45 diff --git a/Tests/AMBEFileReader/lookup.cpp b/Tests/AMBEFileReader/lookup.cpp index 9f75475..6fcdd27 100644 --- a/Tests/AMBEFileReader/lookup.cpp +++ b/Tests/AMBEFileReader/lookup.cpp @@ -71,30 +71,47 @@ namespace AMBEFileReaderTests std::vector data; res = reader.lookup("0", data); EXPECT_FALSE(res) << "read shall return false on non existent file"; - - for(auto d : data) { - delete d; - } + for(auto d : data) delete d; } - TEST_F(AMBEFileReader_lookup, validId) + class AMBEFileReader_lookup_Param : public ::testing::TestWithParam {}; + TEST_P(AMBEFileReader_lookup_Param, validId) { - std::string indexFile = std::string(std::filesystem::current_path()) + "/AMBEFileReader/fr_FR.indx"; - std::string ambeFile = std::string(std::filesystem::current_path()) + "/AMBEFileReader/fr_FR.ambe"; + std::string indexFile = (std::filesystem::current_path() / "AMBEFileReader/TIME_fr_FR2.indx").string(); + std::string ambeFile = (std::filesystem::current_path() / "AMBEFileReader/TIME_fr_FR2.ambe").string(); + CAMBEFileReader reader(indexFile, ambeFile); bool res = reader.read(); - EXPECT_TRUE(res) << "read shall return true on existent files"; + ASSERT_TRUE(res) << "read shall return true on existent files"; - std::vector data; - res = reader.lookup("0", data); - EXPECT_TRUE(res) << "read shall return true on existent files and valid Id"; - EXPECT_NE(data.size(), 0U) << "Vector shall contain data"; + std::vector data; + const std::string& id = GetParam(); - for(auto d : data) { - delete d; - } + res = reader.lookup(id, data); + EXPECT_TRUE(res) << "lookup shall return true on valid Id: " << id; + EXPECT_NE(data.size(), 0U) << "Vector shall contain data for Id: " << id; + + for (auto* d : data) delete d; } + static std::string ParamName( + const ::testing::TestParamInfo& info) + { + return info.param; + } + + INSTANTIATE_TEST_SUITE_P( + AmbeFileReader_lookup_validIds, + AMBEFileReader_lookup_Param, + ::testing::Values( + "bonjour", "cinq", "deux", "dix", "et_demie", "et_quart", + "heure", "heures", "huit", "il_est", "midi", "minuit", + "moins_le_quart", "neuf", "onze", "quatre", "sept", + "six", "trois", "une" + ), + ParamName + ); + TEST_F(AMBEFileReader_lookup, invalidId) { std::string indexFile = std::string(std::filesystem::current_path()) + "/AMBEFileReader/fr_FR.indx";