Skip to content

Commit 0f56108

Browse files
authored
Merge pull request #769 from lukhnos/split-reading-improvement
Handle AssociatedPhrasesV2::SplitReadings() edge cases
2 parents 35faa87 + 2616692 commit 0f56108

2 files changed

Lines changed: 61 additions & 0 deletions

File tree

Source/Engine/AssociatedPhrasesV2.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
namespace McBopomofo {
3939

4040
static constexpr char kSeparatorChar = '-';
41+
static constexpr char kSpecialSymbolAffix = '_';
4142

4243
namespace {
4344
enum class RowParseState { kParsingValue, kParsingReading };
@@ -210,13 +211,23 @@ std::vector<std::string> AssociatedPhrasesV2::SplitReadings(
210211
return readings;
211212
}
212213

214+
auto begin = combinedReading.cbegin();
213215
auto it = combinedReading.cbegin();
214216
auto end = combinedReading.cend();
215217

216218
auto prev = it;
217219

218220
while (it != end) {
219221
if (*it == kSeparatorChar) {
222+
// Edge case: handle the case where the reading is _punctuation_-.
223+
if (it != begin && *(it - 1) == kSpecialSymbolAffix) {
224+
// But we need to handle the _punctuation__ case, too.
225+
if (!(it - 1 != begin && *(it - 2) == kSpecialSymbolAffix)) {
226+
++it;
227+
continue;
228+
}
229+
}
230+
220231
readings.emplace_back(std::string(prev, it));
221232
prev = ++it;
222233
continue;

Source/Engine/AssociatedPhrasesV2Test.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,10 +163,60 @@ TEST(AssociatedPhrasesV2Test, SplitReadings) {
163163
// Pathological cases, but should still yield the following results.
164164
result = AssociatedPhrasesV2::SplitReadings("A-B-");
165165
EXPECT_EQ(result, (std::vector<std::string>{"A", "B", ""}));
166+
result = AssociatedPhrasesV2::SplitReadings("A- B -");
167+
EXPECT_EQ(result, (std::vector<std::string>{"A", " B ", ""}));
168+
result = AssociatedPhrasesV2::SplitReadings("A -B- ");
169+
EXPECT_EQ(result, (std::vector<std::string>{"A ", "B", " "}));
170+
result = AssociatedPhrasesV2::SplitReadings("A-B ");
171+
EXPECT_EQ(result, (std::vector<std::string>{"A", "B "}));
166172
result = AssociatedPhrasesV2::SplitReadings("A-B--");
167173
EXPECT_EQ(result, (std::vector<std::string>{"A", "B", "", ""}));
168174
result = AssociatedPhrasesV2::SplitReadings("-");
169175
EXPECT_EQ(result, (std::vector<std::string>{"", ""}));
176+
177+
// Edge cases: _punctuation_- and similar ones need to be treated carefully.
178+
result = AssociatedPhrasesV2::SplitReadings("_foo_-");
179+
EXPECT_EQ(result, (std::vector<std::string>{"_foo_-"}));
180+
result = AssociatedPhrasesV2::SplitReadings("foo_-");
181+
EXPECT_EQ(result, (std::vector<std::string>{"foo_-"}));
182+
result = AssociatedPhrasesV2::SplitReadings("_foo_--_bar_-");
183+
EXPECT_EQ(result, (std::vector<std::string>{"_foo_-", "_bar_-"}));
184+
result = AssociatedPhrasesV2::SplitReadings("_foo_-_bar_-");
185+
EXPECT_EQ(result, (std::vector<std::string>{"_foo_-_bar_-"}));
186+
result = AssociatedPhrasesV2::SplitReadings("_foo_--");
187+
EXPECT_EQ(result, (std::vector<std::string>{"_foo_-", ""}));
188+
result = AssociatedPhrasesV2::SplitReadings("-_foo_-");
189+
EXPECT_EQ(result, (std::vector<std::string>{"", "_foo_-"}));
190+
result = AssociatedPhrasesV2::SplitReadings("A-_foo_--B");
191+
EXPECT_EQ(result, (std::vector<std::string>{"A", "_foo_-", "B"}));
192+
result = AssociatedPhrasesV2::SplitReadings("A-_foo_---B");
193+
EXPECT_EQ(result, (std::vector<std::string>{"A", "_foo_-", "", "B"}));
194+
result = AssociatedPhrasesV2::SplitReadings("-_foo_-");
195+
EXPECT_EQ(result, (std::vector<std::string>{"", "_foo_-"}));
196+
result = AssociatedPhrasesV2::SplitReadings("_--_foo_-");
197+
EXPECT_EQ(result, (std::vector<std::string>{"_-", "_foo_-"}));
198+
199+
// Edge cases: _punctuation__ needs to be split correctly
200+
result = AssociatedPhrasesV2::SplitReadings("foo__-");
201+
EXPECT_EQ(result, (std::vector<std::string>{"foo__", ""}));
202+
result = AssociatedPhrasesV2::SplitReadings("_foo__-_bar_-");
203+
EXPECT_EQ(result, (std::vector<std::string>{"_foo__", "_bar_-"}));
204+
result = AssociatedPhrasesV2::SplitReadings("A-_foo__-B");
205+
EXPECT_EQ(result, (std::vector<std::string>{"A", "_foo__", "B"}));
206+
result = AssociatedPhrasesV2::SplitReadings("A-_foo__--B");
207+
EXPECT_EQ(result, (std::vector<std::string>{"A", "_foo__", "", "B"}));
208+
result = AssociatedPhrasesV2::SplitReadings("_foo_--_foo__-B");
209+
EXPECT_EQ(result, (std::vector<std::string>{"_foo_-", "_foo__", "B"}));
210+
result = AssociatedPhrasesV2::SplitReadings("_foo__-_foo_--B");
211+
EXPECT_EQ(result, (std::vector<std::string>{"_foo__", "_foo_-", "B"}));
212+
result = AssociatedPhrasesV2::SplitReadings("__-_foo_-");
213+
EXPECT_EQ(result, (std::vector<std::string>{"__", "_foo_-"}));
214+
result = AssociatedPhrasesV2::SplitReadings("__--_foo_-");
215+
EXPECT_EQ(result, (std::vector<std::string>{"__", "", "_foo_-"}));
216+
217+
// This is actually malformed, but still good to test.
218+
result = AssociatedPhrasesV2::SplitReadings("_foo_-_foo_--B");
219+
EXPECT_EQ(result, (std::vector<std::string>{"_foo_-_foo_-", "B"}));
170220
}
171221

172222
TEST(AssociatedPhrasesV2Test, ReturnsDeduplicatedResults) {

0 commit comments

Comments
 (0)