assignment.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include <catch2/catch.hpp>
  2. #include <tl/expected.hpp>
  3. TEST_CASE("Simple assignment", "[assignment.simple]") {
  4. tl::expected<int, int> e1 = 42;
  5. tl::expected<int, int> e2 = 17;
  6. tl::expected<int, int> e3 = 21;
  7. tl::expected<int, int> e4 = tl::make_unexpected(42);
  8. tl::expected<int, int> e5 = tl::make_unexpected(17);
  9. tl::expected<int, int> e6 = tl::make_unexpected(21);
  10. e1 = e2;
  11. REQUIRE(e1);
  12. REQUIRE(*e1 == 17);
  13. REQUIRE(e2);
  14. REQUIRE(*e2 == 17);
  15. e1 = std::move(e2);
  16. REQUIRE(e1);
  17. REQUIRE(*e1 == 17);
  18. REQUIRE(e2);
  19. REQUIRE(*e2 == 17);
  20. e1 = 42;
  21. REQUIRE(e1);
  22. REQUIRE(*e1 == 42);
  23. auto unex = tl::make_unexpected(12);
  24. e1 = unex;
  25. REQUIRE(!e1);
  26. REQUIRE(e1.error() == 12);
  27. e1 = tl::make_unexpected(42);
  28. REQUIRE(!e1);
  29. REQUIRE(e1.error() == 42);
  30. e1 = e3;
  31. REQUIRE(e1);
  32. REQUIRE(*e1 == 21);
  33. e4 = e5;
  34. REQUIRE(!e4);
  35. REQUIRE(e4.error() == 17);
  36. e4 = std::move(e6);
  37. REQUIRE(!e4);
  38. REQUIRE(e4.error() == 21);
  39. e4 = e1;
  40. REQUIRE(e4);
  41. REQUIRE(*e4 == 21);
  42. }
  43. TEST_CASE("Assignment deletion", "[assignment.deletion]") {
  44. struct has_all {
  45. has_all() = default;
  46. has_all(const has_all &) = default;
  47. has_all(has_all &&) noexcept = default;
  48. has_all &operator=(const has_all &) = default;
  49. };
  50. tl::expected<has_all, has_all> e1 = {};
  51. tl::expected<has_all, has_all> e2 = {};
  52. e1 = e2;
  53. struct except_move {
  54. except_move() = default;
  55. except_move(const except_move &) = default;
  56. except_move(except_move &&) noexcept(false){};
  57. except_move &operator=(const except_move &) = default;
  58. };
  59. tl::expected<except_move, except_move> e3 = {};
  60. tl::expected<except_move, except_move> e4 = {};
  61. // e3 = e4; should not compile
  62. }