summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/lldb/unittests/Utility/CompletionRequestTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/llvm/lldb/unittests/Utility/CompletionRequestTest.cpp')
-rw-r--r--gnu/llvm/lldb/unittests/Utility/CompletionRequestTest.cpp272
1 files changed, 272 insertions, 0 deletions
diff --git a/gnu/llvm/lldb/unittests/Utility/CompletionRequestTest.cpp b/gnu/llvm/lldb/unittests/Utility/CompletionRequestTest.cpp
new file mode 100644
index 00000000000..f1971711a50
--- /dev/null
+++ b/gnu/llvm/lldb/unittests/Utility/CompletionRequestTest.cpp
@@ -0,0 +1,272 @@
+//===-- CompletionRequestTest.cpp -------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "gtest/gtest.h"
+
+#include "lldb/Utility/CompletionRequest.h"
+using namespace lldb_private;
+
+TEST(CompletionRequest, Constructor) {
+ std::string command = "a bad c";
+ const unsigned cursor_pos = 3;
+ const size_t arg_index = 1;
+ StringList matches;
+ CompletionResult result;
+
+ CompletionRequest request(command, cursor_pos, 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.GetParsedLine().GetArgumentCount(), 2u);
+ EXPECT_EQ(request.GetCursorArgumentPrefix().str(), "b");
+}
+
+TEST(CompletionRequest, FakeLastArg) {
+ // We insert an empty fake argument into the argument list when the
+ // cursor is after a space.
+ std::string command = "a bad c ";
+ const unsigned cursor_pos = command.size();
+ CompletionResult result;
+
+ CompletionRequest request(command, cursor_pos, result);
+
+ EXPECT_STREQ(request.GetRawLine().str().c_str(), command.c_str());
+ EXPECT_EQ(request.GetRawCursorPos(), cursor_pos);
+ EXPECT_EQ(request.GetCursorIndex(), 3U);
+
+ EXPECT_EQ(request.GetParsedLine().GetArgumentCount(), 4U);
+ EXPECT_EQ(request.GetCursorArgumentPrefix().str(), "");
+}
+
+TEST(CompletionRequest, TryCompleteCurrentArgGood) {
+ std::string command = "a bad c";
+ StringList matches, descriptions;
+ CompletionResult result;
+
+ CompletionRequest request(command, 3, result);
+ request.TryCompleteCurrentArg("boo", "car");
+ result.GetMatches(matches);
+ result.GetDescriptions(descriptions);
+
+ EXPECT_EQ(1U, result.GetResults().size());
+ EXPECT_STREQ("boo", matches.GetStringAtIndex(0U));
+ EXPECT_EQ(1U, descriptions.GetSize());
+ EXPECT_STREQ("car", descriptions.GetStringAtIndex(0U));
+}
+
+TEST(CompletionRequest, TryCompleteCurrentArgBad) {
+ std::string command = "a bad c";
+ CompletionResult result;
+
+ CompletionRequest request(command, 3, result);
+ request.TryCompleteCurrentArg("car", "card");
+
+ EXPECT_EQ(0U, result.GetResults().size());
+}
+
+TEST(CompletionRequest, TryCompleteCurrentArgMode) {
+ std::string command = "a bad c";
+ CompletionResult result;
+
+ CompletionRequest request(command, 3, result);
+ request.TryCompleteCurrentArg<CompletionMode::Partial>("bar", "bard");
+
+ EXPECT_EQ(1U, result.GetResults().size());
+ EXPECT_EQ(CompletionMode::Partial, result.GetResults()[0].GetMode());
+}
+
+TEST(CompletionRequest, ShiftArguments) {
+ std::string command = "a bad c";
+ const unsigned cursor_pos = 3;
+ const size_t arg_index = 1;
+ StringList matches;
+ CompletionResult result;
+
+ CompletionRequest request(command, cursor_pos, 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.GetParsedLine().GetArgumentCount(), 2u);
+ EXPECT_STREQ(request.GetParsedLine().GetArgumentAtIndex(1), "b");
+
+ // Shift away the 'a' argument.
+ request.ShiftArguments();
+
+ // The raw line/cursor stays identical.
+ EXPECT_STREQ(request.GetRawLine().str().c_str(), command.c_str());
+ EXPECT_EQ(request.GetRawCursorPos(), cursor_pos);
+
+ // Partially parsed line and cursor should be updated.
+ EXPECT_EQ(request.GetCursorIndex(), arg_index - 1U);
+ EXPECT_EQ(request.GetParsedLine().GetArgumentCount(), 1u);
+ EXPECT_EQ(request.GetCursorArgumentPrefix().str(), "b");
+}
+
+TEST(CompletionRequest, DuplicateFiltering) {
+ std::string command = "a bad c";
+ const unsigned cursor_pos = 3;
+ StringList matches;
+
+ CompletionResult result;
+ CompletionRequest request(command, cursor_pos, result);
+ result.GetMatches(matches);
+
+ EXPECT_EQ(0U, result.GetNumberOfResults());
+
+ // Add foo twice
+ request.AddCompletion("foo");
+ result.GetMatches(matches);
+
+ EXPECT_EQ(1U, result.GetNumberOfResults());
+ EXPECT_EQ(1U, matches.GetSize());
+ EXPECT_STREQ("foo", matches.GetStringAtIndex(0));
+
+ request.AddCompletion("foo");
+ result.GetMatches(matches);
+
+ EXPECT_EQ(1U, result.GetNumberOfResults());
+ EXPECT_EQ(1U, matches.GetSize());
+ EXPECT_STREQ("foo", matches.GetStringAtIndex(0));
+
+ // Add bar twice
+ request.AddCompletion("bar");
+ result.GetMatches(matches);
+
+ EXPECT_EQ(2U, result.GetNumberOfResults());
+ 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, result.GetNumberOfResults());
+ 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, result.GetNumberOfResults());
+ 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, result.GetNumberOfResults());
+ 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, result);
+ result.GetMatches(matches);
+ result.GetDescriptions(descriptions);
+
+ EXPECT_EQ(0U, result.GetNumberOfResults());
+
+ // Add foo twice with same comment
+ request.AddCompletion("foo", "comment");
+ result.GetMatches(matches);
+ result.GetDescriptions(descriptions);
+
+ EXPECT_EQ(1U, result.GetNumberOfResults());
+ 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, result.GetNumberOfResults());
+ 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, result.GetNumberOfResults());
+ 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, result.GetNumberOfResults());
+ 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, result.GetNumberOfResults());
+ 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));
+}
+
+TEST(CompletionRequest, TestCompletionOwnership) {
+ std::string command = "a bad c";
+ const unsigned cursor_pos = 3;
+ StringList matches;
+
+ CompletionResult result;
+ CompletionRequest request(command, cursor_pos, 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, result.GetNumberOfResults());
+ EXPECT_STREQ("bar", matches.GetStringAtIndex(0));
+}