diagnostic_emitter_test.cpp 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. #include "toolchain/diagnostics/diagnostic_emitter.h"
  5. #include <gmock/gmock.h>
  6. #include <gtest/gtest.h>
  7. #include "llvm/ADT/StringRef.h"
  8. #include "toolchain/diagnostics/mocks.h"
  9. namespace Carbon::Testing {
  10. namespace {
  11. using ::Carbon::Testing::IsDiagnostic;
  12. using ::Carbon::Testing::IsSingleDiagnostic;
  13. using testing::ElementsAre;
  14. struct FakeDiagnosticConverter : DiagnosticConverter<int> {
  15. auto ConvertLoc(int n, ContextFnT /*context_fn*/) const
  16. -> DiagnosticLoc override {
  17. return {.line_number = 1, .column_number = n};
  18. }
  19. };
  20. class DiagnosticEmitterTest : public ::testing::Test {
  21. public:
  22. DiagnosticEmitterTest() : emitter_(converter_, consumer_) {}
  23. FakeDiagnosticConverter converter_;
  24. Testing::MockDiagnosticConsumer consumer_;
  25. DiagnosticEmitter<int> emitter_;
  26. };
  27. TEST_F(DiagnosticEmitterTest, EmitSimpleError) {
  28. CARBON_DIAGNOSTIC(TestDiagnostic, Error, "simple error");
  29. EXPECT_CALL(consumer_, HandleDiagnostic(IsSingleDiagnostic(
  30. DiagnosticKind::TestDiagnostic,
  31. DiagnosticLevel::Error, 1, 1, "simple error")));
  32. EXPECT_CALL(consumer_, HandleDiagnostic(IsSingleDiagnostic(
  33. DiagnosticKind::TestDiagnostic,
  34. DiagnosticLevel::Error, 1, 2, "simple error")));
  35. emitter_.Emit(1, TestDiagnostic);
  36. emitter_.Emit(2, TestDiagnostic);
  37. }
  38. TEST_F(DiagnosticEmitterTest, EmitSimpleWarning) {
  39. CARBON_DIAGNOSTIC(TestDiagnostic, Warning, "simple warning");
  40. EXPECT_CALL(consumer_,
  41. HandleDiagnostic(IsSingleDiagnostic(
  42. DiagnosticKind::TestDiagnostic, DiagnosticLevel::Warning, 1,
  43. 1, "simple warning")));
  44. emitter_.Emit(1, TestDiagnostic);
  45. }
  46. TEST_F(DiagnosticEmitterTest, EmitOneArgDiagnostic) {
  47. CARBON_DIAGNOSTIC(TestDiagnostic, Error, "arg: `{0}`", std::string);
  48. EXPECT_CALL(consumer_, HandleDiagnostic(IsSingleDiagnostic(
  49. DiagnosticKind::TestDiagnostic,
  50. DiagnosticLevel::Error, 1, 1, "arg: `str`")));
  51. emitter_.Emit(1, TestDiagnostic, "str");
  52. }
  53. TEST_F(DiagnosticEmitterTest, EmitNote) {
  54. CARBON_DIAGNOSTIC(TestDiagnostic, Warning, "simple warning");
  55. CARBON_DIAGNOSTIC(TestDiagnosticNote, Note, "note");
  56. EXPECT_CALL(
  57. consumer_,
  58. HandleDiagnostic(IsDiagnostic(
  59. DiagnosticLevel::Warning,
  60. ElementsAre(
  61. IsDiagnosticMessage(DiagnosticKind::TestDiagnostic,
  62. DiagnosticLevel::Warning, 1, 1,
  63. "simple warning"),
  64. IsDiagnosticMessage(DiagnosticKind::TestDiagnosticNote,
  65. DiagnosticLevel::Note, 1, 2, "note")))));
  66. emitter_.Build(1, TestDiagnostic).Note(2, TestDiagnosticNote).Emit();
  67. }
  68. } // namespace
  69. } // namespace Carbon::Testing