summaryrefslogtreecommitdiffstats
path: root/lldb/unittests/Interpreter/TestCompletion.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/unittests/Interpreter/TestCompletion.cpp')
-rw-r--r--lldb/unittests/Interpreter/TestCompletion.cpp71
1 files changed, 69 insertions, 2 deletions
diff --git a/lldb/unittests/Interpreter/TestCompletion.cpp b/lldb/unittests/Interpreter/TestCompletion.cpp
index 4b06b7f8fad..12cb69a8245 100644
--- a/lldb/unittests/Interpreter/TestCompletion.cpp
+++ b/lldb/unittests/Interpreter/TestCompletion.cpp
@@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
#include "gtest/gtest.h"
+
#include "lldb/Interpreter/CommandCompletions.h"
#include "lldb/Utility/StringList.h"
#include "lldb/Utility/TildeExpressionResolver.h"
@@ -17,8 +18,6 @@
#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
-#include "unittests/Utility/Mocks/MockTildeExpressionResolver.h"
-
namespace fs = llvm::sys::fs;
namespace path = llvm::sys::path;
using namespace llvm;
@@ -37,6 +36,74 @@ using namespace lldb_private;
namespace {
+class MockTildeExpressionResolver : public TildeExpressionResolver {
+ StringRef CurrentUser;
+ StringMap<StringRef> UserDirectories;
+
+public:
+ explicit MockTildeExpressionResolver(StringRef CurrentUser, StringRef HomeDir)
+ : CurrentUser(CurrentUser) {
+ UserDirectories.insert(std::make_pair(CurrentUser, HomeDir));
+ }
+
+ void AddKnownUser(StringRef User, StringRef HomeDir) {
+ assert(UserDirectories.find(User) == UserDirectories.end());
+ UserDirectories.insert(std::make_pair(User, HomeDir));
+ }
+
+ void Clear() {
+ CurrentUser = StringRef();
+ UserDirectories.clear();
+ }
+
+ void SetCurrentUser(StringRef User) {
+ assert(UserDirectories.find(User) != UserDirectories.end());
+ CurrentUser = User;
+ }
+
+ bool ResolveExact(StringRef Expr, SmallVectorImpl<char> &Output) override {
+ Output.clear();
+
+ assert(!llvm::any_of(
+ Expr, [](char c) { return llvm::sys::path::is_separator(c); }));
+ assert(Expr.empty() || Expr[0] == '~');
+ Expr = Expr.drop_front();
+ if (Expr.empty()) {
+ auto Dir = UserDirectories[CurrentUser];
+ Output.append(Dir.begin(), Dir.end());
+ return true;
+ }
+
+ for (const auto &User : UserDirectories) {
+ if (User.getKey() != Expr)
+ continue;
+ Output.append(User.getValue().begin(), User.getValue().end());
+ return true;
+ }
+ return false;
+ }
+
+ bool ResolvePartial(StringRef Expr, StringSet<> &Output) override {
+ Output.clear();
+
+ assert(!llvm::any_of(
+ Expr, [](char c) { return llvm::sys::path::is_separator(c); }));
+ assert(Expr.empty() || Expr[0] == '~');
+ Expr = Expr.drop_front();
+
+ SmallString<16> QualifiedName("~");
+ for (const auto &User : UserDirectories) {
+ if (!User.getKey().startswith(Expr))
+ continue;
+ QualifiedName.resize(1);
+ QualifiedName.append(User.getKey().begin(), User.getKey().end());
+ Output.insert(QualifiedName);
+ }
+
+ return !Output.empty();
+ }
+};
+
class CompletionTest : public testing::Test {
protected:
/// Unique temporary directory in which all created filesystem entities must
OpenPOWER on IntegriCloud