#include "lldb/Expression/DiagnosticManager.h"
#include "gtest/gtest.h"
using namespace lldb_private;
static const uint32_t custom_diag_id = 42;
namespace {
class FixItDiag : public Diagnostic {
bool m_has_fixits;
public:
FixItDiag(llvm::StringRef msg, bool has_fixits)
: Diagnostic(msg, lldb::eSeverityError,
DiagnosticOrigin::eDiagnosticOriginLLDB, custom_diag_id),
m_has_fixits(has_fixits) {}
bool HasFixIts() const override { return m_has_fixits; }
};
}
namespace {
class TextDiag : public Diagnostic {
public:
TextDiag(llvm::StringRef msg, lldb::Severity severity)
: Diagnostic(msg, severity, DiagnosticOrigin::eDiagnosticOriginLLDB,
custom_diag_id) {}
};
}
TEST(DiagnosticManagerTest, AddDiagnostic) {
DiagnosticManager mgr;
EXPECT_EQ(0U, mgr.Diagnostics().size());
std::string msg = "foo bar has happened";
lldb::Severity severity = lldb::eSeverityError;
DiagnosticOrigin origin = DiagnosticOrigin::eDiagnosticOriginLLDB;
auto diag =
std::make_unique<Diagnostic>(msg, severity, origin, custom_diag_id);
mgr.AddDiagnostic(std::move(diag));
EXPECT_EQ(1U, mgr.Diagnostics().size());
const Diagnostic *got = mgr.Diagnostics().front().get();
EXPECT_EQ(DiagnosticOrigin::eDiagnosticOriginLLDB, got->getKind());
EXPECT_EQ(msg, got->GetMessage());
EXPECT_EQ(severity, got->GetSeverity());
EXPECT_EQ(custom_diag_id, got->GetCompilerID());
EXPECT_EQ(false, got->HasFixIts());
}
TEST(DiagnosticManagerTest, HasFixits) {
DiagnosticManager mgr;
EXPECT_FALSE(mgr.HasFixIts());
mgr.AddDiagnostic(std::make_unique<FixItDiag>("no fixit", false));
EXPECT_FALSE(mgr.HasFixIts());
mgr.AddDiagnostic(std::make_unique<FixItDiag>("fixit", true));
EXPECT_TRUE(mgr.HasFixIts());
mgr.AddDiagnostic(std::make_unique<FixItDiag>("no fixit", false));
EXPECT_TRUE(mgr.HasFixIts());
mgr.AddDiagnostic(std::make_unique<FixItDiag>("fixit", true));
EXPECT_TRUE(mgr.HasFixIts());
}
TEST(DiagnosticManagerTest, GetStringNoDiags) {
DiagnosticManager mgr;
EXPECT_EQ("", mgr.GetString());
std::unique_ptr<Diagnostic> empty;
mgr.AddDiagnostic(std::move(empty));
EXPECT_EQ("", mgr.GetString());
}
TEST(DiagnosticManagerTest, GetStringBasic) {
DiagnosticManager mgr;
mgr.AddDiagnostic(std::make_unique<TextDiag>("abc", lldb::eSeverityError));
EXPECT_EQ("error: abc\n", mgr.GetString());
}
TEST(DiagnosticManagerTest, GetStringMultiline) {
DiagnosticManager mgr;
mgr.AddDiagnostic(std::make_unique<TextDiag>("b\nc", lldb::eSeverityError));
EXPECT_EQ("error: b\nc\n", mgr.GetString());
}
TEST(DiagnosticManagerTest, GetStringMultipleDiags) {
DiagnosticManager mgr;
mgr.AddDiagnostic(std::make_unique<TextDiag>("abc", lldb::eSeverityError));
EXPECT_EQ("error: abc\n", mgr.GetString());
mgr.AddDiagnostic(std::make_unique<TextDiag>("def", lldb::eSeverityError));
EXPECT_EQ("error: abc\nerror: def\n", mgr.GetString());
}
TEST(DiagnosticManagerTest, GetStringSeverityLabels) {
DiagnosticManager mgr;
mgr.AddDiagnostic(std::make_unique<TextDiag>("foo", lldb::eSeverityError));
mgr.AddDiagnostic(std::make_unique<TextDiag>("bar", lldb::eSeverityWarning));
mgr.AddDiagnostic(std::make_unique<TextDiag>("baz", lldb::eSeverityInfo));
EXPECT_EQ("error: foo\nwarning: bar\nbaz\n", mgr.GetString());
}
TEST(DiagnosticManagerTest, GetStringPreserveOrder) {
DiagnosticManager mgr;
mgr.AddDiagnostic(std::make_unique<TextDiag>("baz", lldb::eSeverityInfo));
mgr.AddDiagnostic(std::make_unique<TextDiag>("bar", lldb::eSeverityWarning));
mgr.AddDiagnostic(std::make_unique<TextDiag>("foo", lldb::eSeverityError));
EXPECT_EQ("baz\nwarning: bar\nerror: foo\n", mgr.GetString());
}
TEST(DiagnosticManagerTest, AppendMessageNoDiag) {
DiagnosticManager mgr;
mgr.AppendMessageToDiagnostic("no diag has been pushed yet");
EXPECT_EQ(0U, mgr.Diagnostics().size());
}
TEST(DiagnosticManagerTest, AppendMessageAttachToLastDiag) {
DiagnosticManager mgr;
mgr.AddDiagnostic(std::make_unique<TextDiag>("foo", lldb::eSeverityError));
mgr.AddDiagnostic(std::make_unique<TextDiag>("bar", lldb::eSeverityError));
mgr.AppendMessageToDiagnostic("message text");
EXPECT_EQ("error: foo\nerror: bar\nmessage text\n", mgr.GetString());
}
TEST(DiagnosticManagerTest, AppendMessageSubsequentDiags) {
DiagnosticManager mgr;
mgr.AddDiagnostic(std::make_unique<TextDiag>("bar", lldb::eSeverityError));
mgr.AppendMessageToDiagnostic("message text");
mgr.AddDiagnostic(std::make_unique<TextDiag>("foo", lldb::eSeverityError));
EXPECT_EQ("error: bar\nmessage text\nerror: foo\n", mgr.GetString());
}
TEST(DiagnosticManagerTest, PutString) {
DiagnosticManager mgr;
mgr.PutString(lldb::eSeverityError, "foo");
EXPECT_EQ(1U, mgr.Diagnostics().size());
EXPECT_EQ(eDiagnosticOriginLLDB, mgr.Diagnostics().front()->getKind());
EXPECT_EQ("error: foo\n", mgr.GetString());
}
TEST(DiagnosticManagerTest, PutStringMultiple) {
DiagnosticManager mgr;
mgr.PutString(lldb::eSeverityError, "foo");
mgr.PutString(lldb::eSeverityError, "bar");
EXPECT_EQ(2U, mgr.Diagnostics().size());
EXPECT_EQ("error: foo\nerror: bar\n", mgr.GetString());
}
TEST(DiagnosticManagerTest, PutStringSeverities) {
DiagnosticManager mgr;
mgr.PutString(lldb::eSeverityError, "foo");
mgr.PutString(lldb::eSeverityWarning, "bar");
EXPECT_EQ(2U, mgr.Diagnostics().size());
EXPECT_EQ("error: foo\nwarning: bar\n", mgr.GetString());
}
TEST(DiagnosticManagerTest, FixedExpression) {
DiagnosticManager mgr;
EXPECT_EQ("", mgr.GetFixedExpression());
mgr.SetFixedExpression("foo");
EXPECT_EQ("foo", mgr.GetFixedExpression());
mgr.SetFixedExpression("bar");
EXPECT_EQ("bar", mgr.GetFixedExpression());
}