TEST(CompletionRequest, Constructor) { std::string command = "a bad c"; const unsigned cursor_pos = 3; const int arg_index = 1; const int arg_cursor_pos = 1; const int match_start = 2345; const int match_max_return = 12345; StringList matches; CompletionResult result; CompletionRequest request(command, cursor_pos, match_start, match_max_return, result); result.GetMatches(matches); EXPECT_STREQ(request.GetRawLine().str().c_str(), command.c_str()); EXPECT_EQ(request.GetRawCursorPos(), cursor_pos); EXPECT_EQ(request.GetCursorIndex(), arg_index); EXPECT_EQ(request.GetCursorCharPosition(), arg_cursor_pos); EXPECT_EQ(request.GetMatchStartPoint(), match_start); EXPECT_EQ(request.GetMaxReturnElements(), match_max_return); EXPECT_EQ(request.GetWordComplete(), false); EXPECT_EQ(request.GetPartialParsedLine().GetArgumentCount(), 2u); EXPECT_STREQ(request.GetPartialParsedLine().GetArgumentAtIndex(1), "b"); }
void Session::CompletePath(const Path &path, CompletionResult &result) { std::string filePrefix; mtp::u32 parent = ResolvePath(path, filePrefix); std::string dir = GetDirname(path); auto objectList = _session->GetObjectHandles(_cs, mtp::Session::AllFormats, parent); for(auto object : objectList.ObjectHandles) { std::string name = _session->GetObjectStringProperty(object, mtp::ObjectProperty::ObjectFilename); if (BeginsWith(name, filePrefix)) { if (!dir.empty()) name = dir + '/' + name; mtp::ObjectFormat format = (mtp::ObjectFormat)_session->GetObjectIntegerProperty(object, mtp::ObjectProperty::ObjectFormat); if (format == mtp::ObjectFormat::Association) name += '/'; if (name.find(' ') != name.npos) result.push_back('"' + name +'"'); else result.push_back(name); } } }
CompletionResult CompleteCommandNames(Str::StringRef prefix) { CommandMap& commands = GetCommandMap(); CompletionResult res; for (auto& entry: commands) { if (Str::IsIPrefix(prefix, entry.first)) { res.push_back({entry.first, entry.second.description}); } } return res; }
void AddToCompletion(CompletionResult& res, Str::StringRef prefix, std::initializer_list<CompletionItem> list) { for (auto item: list) { if (Str::IsIPrefix(prefix, item.first)) { res.push_back({item.first, item.second}); } } }
TEST(CompletionRequest, TestCompletionOwnership) { std::string command = "a bad c"; const unsigned cursor_pos = 3; StringList matches; CompletionResult result; CompletionRequest request(command, cursor_pos, 0, 0, result); std::string Temporary = "bar"; request.AddCompletion(Temporary); // Manipulate our completion. The request should have taken a copy, so that // shouldn't influence anything. Temporary[0] = 'f'; result.GetMatches(matches); EXPECT_EQ(1U, request.GetNumberOfMatches()); EXPECT_STREQ("bar", matches.GetStringAtIndex(0)); }
TEST(CompletionRequest, DuplicateFiltering) { std::string command = "a bad c"; const unsigned cursor_pos = 3; StringList matches; CompletionResult result; CompletionRequest request(command, cursor_pos, 0, 0, result); result.GetMatches(matches); EXPECT_EQ(0U, request.GetNumberOfMatches()); // Add foo twice request.AddCompletion("foo"); result.GetMatches(matches); EXPECT_EQ(1U, request.GetNumberOfMatches()); EXPECT_EQ(1U, matches.GetSize()); EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); request.AddCompletion("foo"); result.GetMatches(matches); EXPECT_EQ(1U, request.GetNumberOfMatches()); EXPECT_EQ(1U, matches.GetSize()); EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); // Add bar twice request.AddCompletion("bar"); result.GetMatches(matches); EXPECT_EQ(2U, request.GetNumberOfMatches()); EXPECT_EQ(2U, matches.GetSize()); EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); EXPECT_STREQ("bar", matches.GetStringAtIndex(1)); request.AddCompletion("bar"); result.GetMatches(matches); EXPECT_EQ(2U, request.GetNumberOfMatches()); EXPECT_EQ(2U, matches.GetSize()); EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); EXPECT_STREQ("bar", matches.GetStringAtIndex(1)); // Add foo again. request.AddCompletion("foo"); result.GetMatches(matches); EXPECT_EQ(2U, request.GetNumberOfMatches()); EXPECT_EQ(2U, matches.GetSize()); EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); EXPECT_STREQ("bar", matches.GetStringAtIndex(1)); // Add something with an existing prefix request.AddCompletion("foobar"); result.GetMatches(matches); EXPECT_EQ(3U, request.GetNumberOfMatches()); EXPECT_EQ(3U, matches.GetSize()); EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); EXPECT_STREQ("bar", matches.GetStringAtIndex(1)); EXPECT_STREQ("foobar", matches.GetStringAtIndex(2)); }
TEST(CompletionRequest, DuplicateFilteringWithComments) { std::string command = "a bad c"; const unsigned cursor_pos = 3; StringList matches, descriptions; CompletionResult result; CompletionRequest request(command, cursor_pos, 0, 0, result); result.GetMatches(matches); result.GetDescriptions(descriptions); EXPECT_EQ(0U, request.GetNumberOfMatches()); // Add foo twice with same comment request.AddCompletion("foo", "comment"); result.GetMatches(matches); result.GetDescriptions(descriptions); EXPECT_EQ(1U, request.GetNumberOfMatches()); EXPECT_EQ(1U, matches.GetSize()); EXPECT_EQ(1U, descriptions.GetSize()); EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); EXPECT_STREQ("comment", descriptions.GetStringAtIndex(0)); request.AddCompletion("foo", "comment"); result.GetMatches(matches); result.GetDescriptions(descriptions); EXPECT_EQ(1U, request.GetNumberOfMatches()); EXPECT_EQ(1U, matches.GetSize()); EXPECT_EQ(1U, descriptions.GetSize()); EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); EXPECT_STREQ("comment", descriptions.GetStringAtIndex(0)); // Add bar twice with different comments request.AddCompletion("bar", "comment"); result.GetMatches(matches); result.GetDescriptions(descriptions); EXPECT_EQ(2U, request.GetNumberOfMatches()); EXPECT_EQ(2U, matches.GetSize()); EXPECT_EQ(2U, descriptions.GetSize()); EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); EXPECT_STREQ("bar", matches.GetStringAtIndex(1)); request.AddCompletion("bar", "another comment"); result.GetMatches(matches); result.GetDescriptions(descriptions); EXPECT_EQ(3U, request.GetNumberOfMatches()); EXPECT_EQ(3U, matches.GetSize()); EXPECT_EQ(3U, descriptions.GetSize()); EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); EXPECT_STREQ("comment", descriptions.GetStringAtIndex(0)); EXPECT_STREQ("bar", matches.GetStringAtIndex(1)); EXPECT_STREQ("comment", descriptions.GetStringAtIndex(1)); EXPECT_STREQ("bar", matches.GetStringAtIndex(2)); EXPECT_STREQ("another comment", descriptions.GetStringAtIndex(2)); // Add foo again with no comment request.AddCompletion("foo"); result.GetMatches(matches); result.GetDescriptions(descriptions); EXPECT_EQ(4U, request.GetNumberOfMatches()); EXPECT_EQ(4U, matches.GetSize()); EXPECT_EQ(4U, descriptions.GetSize()); EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); EXPECT_STREQ("comment", descriptions.GetStringAtIndex(0)); EXPECT_STREQ("bar", matches.GetStringAtIndex(1)); EXPECT_STREQ("comment", descriptions.GetStringAtIndex(1)); EXPECT_STREQ("bar", matches.GetStringAtIndex(2)); EXPECT_STREQ("another comment", descriptions.GetStringAtIndex(2)); EXPECT_STREQ("foo", matches.GetStringAtIndex(3)); EXPECT_STREQ("", descriptions.GetStringAtIndex(3)); }