diff options
Diffstat (limited to 'gnu/llvm/lldb/unittests/Utility/CompletionRequestTest.cpp')
-rw-r--r-- | gnu/llvm/lldb/unittests/Utility/CompletionRequestTest.cpp | 272 |
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)); +} |