diff --git a/server/MetasequoiaImeEngine b/server/MetasequoiaImeEngine index 76d3c775..12b65317 160000 --- a/server/MetasequoiaImeEngine +++ b/server/MetasequoiaImeEngine @@ -1 +1 @@ -Subproject commit 76d3c77546d776a1f04f93f4469667e452a71102 +Subproject commit 12b65317ccd30ae2f074206c197723e6b20e208f diff --git a/server/tests/src/test_engine_shuangpin_session.cpp b/server/tests/src/test_engine_shuangpin_session.cpp index 892d93a2..dd02b0b2 100644 --- a/server/tests/src/test_engine_shuangpin_session.cpp +++ b/server/tests/src/test_engine_shuangpin_session.cpp @@ -97,6 +97,31 @@ TEST_CASE(EngineShuangpinSessionContinuesCompositionWithSingleHelpcode) REQUIRE_EQ(session.get_pinyin_sequence(), std::string("tele")); } +TEST_CASE(EngineShuangpinUppercaseSingleHelpcodePrefersSecondCodeMatches) +{ + REQUIRE(HelpcodeUtils::select_helpcode_schema("lantian")); + EngineInputSession session(SchemeType::Shuangpin); + InputLetters(session, "nid"); + session.reset_state(); + InputLetters(session, "niD"); + + const auto &candidates = session.get_candidates(); + const auto index_of = [&](const std::string &word) { + const auto found = std::find_if(candidates.begin(), candidates.end(), + [&](const IInputSession::WordItem &item) { return item.word == word; }); + return static_cast(std::distance(candidates.begin(), found)); + }; + + const size_t ni = index_of("泥"); + const size_t ni_second_code = index_of("溺"); + const size_t ni_other_second_code = index_of("腻"); + REQUIRE(ni < candidates.size()); + REQUIRE(ni_second_code < candidates.size()); + REQUIRE(ni_other_second_code < candidates.size()); + REQUIRE(ni_second_code < ni); + REQUIRE(ni_other_second_code < ni); +} + TEST_CASE(EngineShuangpinSessionContinuesCompositionWithDoubleHelpcode) { EngineInputSession session(SchemeType::Shuangpin); diff --git a/server/tests/src/test_shuangpin_query.cpp b/server/tests/src/test_shuangpin_query.cpp index 6e35b5de..6ddea5c9 100644 --- a/server/tests/src/test_shuangpin_query.cpp +++ b/server/tests/src/test_shuangpin_query.cpp @@ -12,6 +12,16 @@ TEST_CASE(ApplySegmentationCasesPreservesUppercaseMarkers) TEST_CASE(IsFullHelpModeRecognizesDoubleHelpcodePattern) { REQUIRE(ShuangpinUtil::IsFullHelpMode("xiteleaA")); + REQUIRE(ShuangpinUtil::IsFullHelpMode("xiteleAa")); + REQUIRE(ShuangpinUtil::IsFullHelpMode("xiteleAA")); + REQUIRE(!ShuangpinUtil::IsFullHelpMode("xiteleaa")); REQUIRE(!ShuangpinUtil::IsFullHelpMode("xitelea")); REQUIRE(!ShuangpinUtil::IsFullHelpMode("xi")); } + +TEST_CASE(FullHelpCodesUseFirstUppercaseMarkerForReverseOrder) +{ + REQUIRE_EQ(ShuangpinUtil::GetFullHelpCodes("xiteleaB"), std::string("ab")); + REQUIRE_EQ(ShuangpinUtil::GetFullHelpCodes("xiteleAb"), std::string("ba")); + REQUIRE_EQ(ShuangpinUtil::GetFullHelpCodes("xiteleAB"), std::string("ba")); +}