Files
carbon-lang/toolchain/diagnostics/diagnostic_emitter_test.cpp
T
Jon Ross-PerkinsandChandler Carruth 04d3901b7f Switch Diagnostic structure to use DiagnosticMessage to avoid pointers (#2502)
Followup for #2490 

The switch of DiagnosticMessage to have DiagnosticMessage means we don't need to use unique_ptr. This means that copy constructors are implicit again and don't need to be avoided, but per discussion still keeping with moves. Comments on HandleDiagnostic try to capture the use of moves there.

I'm keeping DiagnosticLevel at the top-level, and adding some checking that notes are actually Notes.

Also, adding MakeMessage to unify some of the logic (this has particularly been bugging me around format_fn, and I ran into it here because of the Diagnostic -> DiagnosticMessage change). The addition of NoTypeDeduction is intended to avoid some duplicative comments that'd been piling up.

Co-authored-by: Chandler Carruth <chandlerc@gmail.com>
2022-12-28 16:47:33 -08:00

73 lines
2.7 KiB
C++

// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "toolchain/diagnostics/diagnostic_emitter.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/FormatVariadic.h"
#include "toolchain/diagnostics/mocks.h"
namespace Carbon::Testing {
namespace {
struct FakeDiagnosticLocationTranslator : DiagnosticLocationTranslator<int> {
auto GetLocation(int n) -> DiagnosticLocation override {
return {.line_number = 1, .column_number = n};
}
};
class DiagnosticEmitterTest : public ::testing::Test {
protected:
DiagnosticEmitterTest() : emitter_(translator_, consumer_) {}
FakeDiagnosticLocationTranslator translator_;
Testing::MockDiagnosticConsumer consumer_;
DiagnosticEmitter<int> emitter_;
};
TEST_F(DiagnosticEmitterTest, EmitSimpleError) {
CARBON_DIAGNOSTIC(TestDiagnostic, Error, "simple error");
EXPECT_CALL(consumer_, HandleDiagnostic(IsDiagnostic(
DiagnosticKind::TestDiagnostic,
DiagnosticLevel::Error, 1, 1, "simple error")));
EXPECT_CALL(consumer_, HandleDiagnostic(IsDiagnostic(
DiagnosticKind::TestDiagnostic,
DiagnosticLevel::Error, 1, 2, "simple error")));
emitter_.Emit(1, TestDiagnostic);
emitter_.Emit(2, TestDiagnostic);
}
TEST_F(DiagnosticEmitterTest, EmitSimpleWarning) {
CARBON_DIAGNOSTIC(TestDiagnostic, Warning, "simple warning");
EXPECT_CALL(consumer_,
HandleDiagnostic(IsDiagnostic(DiagnosticKind::TestDiagnostic,
DiagnosticLevel::Warning, 1, 1,
"simple warning")));
emitter_.Emit(1, TestDiagnostic);
}
TEST_F(DiagnosticEmitterTest, EmitOneArgDiagnostic) {
CARBON_DIAGNOSTIC(TestDiagnostic, Error, "arg: `{0}`", llvm::StringRef);
EXPECT_CALL(consumer_, HandleDiagnostic(IsDiagnostic(
DiagnosticKind::TestDiagnostic,
DiagnosticLevel::Error, 1, 1, "arg: `str`")));
emitter_.Emit(1, TestDiagnostic, "str");
}
TEST_F(DiagnosticEmitterTest, EmitNote) {
CARBON_DIAGNOSTIC(TestDiagnostic, Warning, "simple warning");
CARBON_DIAGNOSTIC(TestDiagnosticNote, Note, "note");
EXPECT_CALL(consumer_,
HandleDiagnostic(IsDiagnostic(DiagnosticKind::TestDiagnostic,
DiagnosticLevel::Warning, 1, 1,
"simple warning")));
emitter_.Build(1, TestDiagnostic).Note(2, TestDiagnosticNote).Emit();
}
} // namespace
} // namespace Carbon::Testing