error_test.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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 "executable_semantics/common/error.h"
  5. #include <gtest/gtest.h>
  6. namespace Carbon::Testing {
  7. namespace {
  8. auto MakeSuccess() -> ErrorOr<Success> { return Success(); }
  9. auto MakeError(std::string_view message) -> ErrorOr<Success> {
  10. return Error(message);
  11. }
  12. auto MakeInt(int value) -> ErrorOr<int> { return value; }
  13. auto MakeFailedInt(std::string_view message) -> ErrorOr<int> {
  14. return Error(message);
  15. }
  16. auto ErrorToString(const Error& e) -> std::string { return e.message(); }
  17. template <typename V>
  18. auto ErrorToString(const ErrorOr<V>& e) -> std::string {
  19. return e.error().message();
  20. }
  21. TEST(ErrorTest, FatalProgramError) {
  22. EXPECT_EQ(ErrorToString(FATAL_PROGRAM_ERROR_NO_LINE() << "test"),
  23. "PROGRAM ERROR: test");
  24. }
  25. TEST(ErrorTest, FatalRuntimeError) {
  26. EXPECT_EQ(ErrorToString(FATAL_RUNTIME_ERROR_NO_LINE() << "test"),
  27. "RUNTIME ERROR: test");
  28. }
  29. TEST(ErrorTest, FatalCompilationError) {
  30. EXPECT_EQ(ErrorToString(FATAL_COMPILATION_ERROR_NO_LINE() << "test"),
  31. "COMPILATION ERROR: test");
  32. }
  33. TEST(ErrorTest, FatalProgramErrorLine) {
  34. EXPECT_EQ(ErrorToString(FATAL_PROGRAM_ERROR(1) << "test"),
  35. "PROGRAM ERROR: 1: test");
  36. }
  37. TEST(ErrorTest, ReturnIfErrorNoError) {
  38. auto result = []() -> ErrorOr<Success> {
  39. RETURN_IF_ERROR(MakeSuccess());
  40. RETURN_IF_ERROR(MakeSuccess());
  41. return Success();
  42. }();
  43. EXPECT_TRUE(result.ok());
  44. }
  45. TEST(ErrorTest, ReturnIfErrorHasError) {
  46. auto result = []() -> ErrorOr<Success> {
  47. RETURN_IF_ERROR(MakeSuccess());
  48. RETURN_IF_ERROR(MakeError("error"));
  49. return Success();
  50. }();
  51. ASSERT_FALSE(result.ok());
  52. EXPECT_EQ(ErrorToString(result), "error");
  53. }
  54. TEST(ErrorTest, AssignOrReturnNoError) {
  55. auto result = []() -> ErrorOr<int> {
  56. RETURN_IF_ERROR(MakeSuccess());
  57. ASSIGN_OR_RETURN(int a, MakeInt(1));
  58. ASSIGN_OR_RETURN(const int b, MakeInt(2));
  59. int c = 0;
  60. ASSIGN_OR_RETURN(c, MakeInt(3));
  61. return a + b + c;
  62. }();
  63. ASSERT_TRUE(result.ok());
  64. EXPECT_EQ(6, *result);
  65. }
  66. TEST(ErrorTest, AssignOrReturnHasDirectError) {
  67. auto result = []() -> ErrorOr<int> {
  68. RETURN_IF_ERROR(MakeError("error"));
  69. return 0;
  70. }();
  71. ASSERT_FALSE(result.ok());
  72. }
  73. TEST(ErrorTest, AssignOrReturnHasErrorInExpected) {
  74. auto result = []() -> ErrorOr<int> {
  75. ASSIGN_OR_RETURN(int a, MakeFailedInt("error"));
  76. return a;
  77. }();
  78. ASSERT_FALSE(result.ok());
  79. EXPECT_EQ(ErrorToString(result), "error");
  80. }
  81. } // namespace
  82. } // namespace Carbon::Testing