From 202b1fa05808210881b19b9723ca7a50a9f52385 Mon Sep 17 00:00:00 2001 From: Lukhnos Liu Date: Tue, 18 Jan 2022 22:46:26 -0800 Subject: [PATCH] Also make PhraseReplacementMap more tolerant This also clarifies the test expectations and how parsing errors are handled. --- Source/Engine/CMakeLists.txt | 3 ++ Source/Engine/PhraseReplacementMap.cpp | 5 -- Source/Engine/PhraseReplacementMapTest.cpp | 59 ++++++++++++++++++++++ Source/Engine/UserPhrasesLMTest.cpp | 14 ++--- 4 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 Source/Engine/PhraseReplacementMapTest.cpp diff --git a/Source/Engine/CMakeLists.txt b/Source/Engine/CMakeLists.txt index 5778bacb..d0e5b05f 100644 --- a/Source/Engine/CMakeLists.txt +++ b/Source/Engine/CMakeLists.txt @@ -11,6 +11,8 @@ add_library(McBopomofoLMLib ParselessPhraseDB.h ParselessLM.cpp ParselessLM.h + PhraseReplacementMap.h + PhraseReplacementMap.cpp UserPhrasesLM.h UserPhrasesLM.cpp) @@ -32,6 +34,7 @@ add_executable(McBopomofoLMLibTest KeyValueBlobReaderTest.cpp ParselessLMTest.cpp ParselessPhraseDBTest.cpp + PhraseReplacementMapTest.cpp UserPhrasesLMTest.cpp) target_link_libraries(McBopomofoLMLibTest gtest_main McBopomofoLMLib) include(GoogleTest) diff --git a/Source/Engine/PhraseReplacementMap.cpp b/Source/Engine/PhraseReplacementMap.cpp index c0c3abbe..ed5831fb 100644 --- a/Source/Engine/PhraseReplacementMap.cpp +++ b/Source/Engine/PhraseReplacementMap.cpp @@ -58,11 +58,6 @@ bool PhraseReplacementMap::open(const char *path) while ((state = reader.Next(&keyValue)) == KeyValueBlobReader::State::HAS_PAIR) { keyValueMap[keyValue.key] = keyValue.value; } - - if (state == KeyValueBlobReader::State::ERROR) { - close(); - return false; - } return true; } diff --git a/Source/Engine/PhraseReplacementMapTest.cpp b/Source/Engine/PhraseReplacementMapTest.cpp new file mode 100644 index 00000000..239ea6e0 --- /dev/null +++ b/Source/Engine/PhraseReplacementMapTest.cpp @@ -0,0 +1,59 @@ +// Copyright (c) 2022 and onwards The McBopomofo Authors. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. + +#include +#include +#include + +#include "PhraseReplacementMap.h" +#include "gtest/gtest.h" + +namespace McBopomofo { + +TEST(PhraseReplacementMapTest, LenientReading) +{ + std::string tmp_name + = std::string(std::filesystem::temp_directory_path()) + "test.txt"; + + FILE* f = fopen(tmp_name.c_str(), "w"); + ASSERT_NE(f, nullptr); + + fprintf(f, "key value\n"); + fprintf(f, "key2\n"); // error line + fprintf(f, "key3 value2\n"); + int r = fclose(f); + ASSERT_EQ(r, 0); + + PhraseReplacementMap map; + map.open(tmp_name.c_str()); + ASSERT_EQ(map.valueForKey("key"), "value"); + ASSERT_EQ(map.valueForKey("key2"), ""); + + // key2 causes parsing error, and the line that has key3 won't be parsed. + ASSERT_EQ(map.valueForKey("key3"), ""); + + r = remove(tmp_name.c_str()); + ASSERT_EQ(r, 0); +} + +} // namespace McBopomofo diff --git a/Source/Engine/UserPhrasesLMTest.cpp b/Source/Engine/UserPhrasesLMTest.cpp index b923fd97..402d618f 100644 --- a/Source/Engine/UserPhrasesLMTest.cpp +++ b/Source/Engine/UserPhrasesLMTest.cpp @@ -38,17 +38,19 @@ TEST(UserPhreasesLMTest, LenientReading) FILE* f = fopen(tmp_name.c_str(), "w"); ASSERT_NE(f, nullptr); - fprintf(f, "bar foo\n"); - fprintf(f, "bar \n"); // error line - fprintf(f, "argh baz\n"); + fprintf(f, "value1 reading1\n"); + fprintf(f, "value2 \n"); // error line + fprintf(f, "value3 reading2\n"); int r = fclose(f); ASSERT_EQ(r, 0); UserPhrasesLM lm; lm.open(tmp_name.c_str()); - ASSERT_TRUE(lm.hasUnigramsForKey("foo")); - ASSERT_FALSE(lm.hasUnigramsForKey("bar")); - ASSERT_FALSE(lm.hasUnigramsForKey("baz")); + ASSERT_TRUE(lm.hasUnigramsForKey("reading1")); + ASSERT_FALSE(lm.hasUnigramsForKey("value2")); + + // Anything after the error won't be parsed, so reading2 won't be found. + ASSERT_FALSE(lm.hasUnigramsForKey("reading2")); r = remove(tmp_name.c_str()); ASSERT_EQ(r, 0);