| // Protocol Buffers - Google's data interchange format |
| // Copyright 2025 Google LLC. All rights reserved. |
| // |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file or at |
| // https://developers.google.com/open-source/licenses/bsd |
| |
| #include "hpb/status.h" |
| |
| #include <memory> |
| #include <type_traits> |
| #include <utility> |
| |
| #include <gtest/gtest.h> |
| #include "absl/status/statusor.h" |
| #include "hpb_generator/tests/test_model.hpb.h" |
| #include "hpb/ptr.h" |
| #include "upb/wire/decode.h" |
| #include "upb/wire/encode.h" |
| |
| namespace hpb::testing { |
| |
| namespace { |
| using ::hpb_unittest::protos::TestModel; |
| |
| TEST(StatusTest, RawPtrSize) { |
| using type = hpb::StatusOr<int*>; |
| EXPECT_LE(sizeof(type), 16); |
| } |
| |
| TEST(StatusTest, HpbPtrSize) { |
| using type = hpb::StatusOr<hpb::Ptr<TestModel>>; |
| EXPECT_LE(sizeof(type), 24); |
| } |
| |
| TEST(StatusTest, GuaranteedTraits) { |
| using type = hpb::StatusOr<int>; |
| EXPECT_TRUE(std::is_trivially_copy_constructible<type>::value); |
| EXPECT_TRUE(std::is_trivially_copy_assignable<type>::value); |
| EXPECT_TRUE(std::is_trivially_destructible<type>::value); |
| } |
| |
| TEST(StatusTest, Moves) { |
| std::unique_ptr<int> i = std::make_unique<int>(100); |
| hpb::StatusOr<std::unique_ptr<int>> status(std::move(i)); |
| EXPECT_TRUE(status.ok()); |
| EXPECT_EQ(*status.value(), 100); |
| |
| hpb::StatusOr<std::unique_ptr<int>> move(std::move(status)); |
| EXPECT_TRUE(move.ok()); |
| EXPECT_EQ(*move.value(), 100); |
| } |
| |
| TEST(StatusTest, StatusOr) { |
| auto basic = hpb::StatusOr<int>(100); |
| EXPECT_TRUE(basic.ok()); |
| EXPECT_EQ(basic.value(), 100); |
| } |
| |
| TEST(StatusTest, DecodeError) { |
| auto statusOr = |
| hpb::StatusOr<int>(internal::backend::Error(kUpb_DecodeStatus_BadUtf8)); |
| EXPECT_FALSE(statusOr.ok()); |
| EXPECT_EQ(statusOr.error(), "String field had bad UTF-8"); |
| ASSERT_DEATH(statusOr.value(), "Cannot fetch hpb::value for errors."); |
| } |
| |
| TEST(StatusTest, EncodeError) { |
| auto statusOr = hpb::StatusOr<int>( |
| internal::backend::Error(kUpb_EncodeStatus_MaxDepthExceeded)); |
| EXPECT_FALSE(statusOr.ok()); |
| EXPECT_EQ(statusOr.error(), "Max depth exceeded"); |
| ASSERT_DEATH(statusOr.value(), "Cannot fetch hpb::value for errors."); |
| } |
| |
| TEST(StatusTest, AbslStatusOrOK) { |
| absl::StatusOr<int> absl_convert = hpb::StatusOr<int>(100).ToAbslStatusOr(); |
| EXPECT_TRUE(absl_convert.ok()); |
| EXPECT_EQ(absl_convert.value(), 100); |
| } |
| |
| TEST(StatusTest, AblStatusOrError) { |
| absl::StatusOr<int> absl_convert = |
| hpb::StatusOr<int>( |
| internal::backend::Error(kUpb_EncodeStatus_MaxDepthExceeded)) |
| .ToAbslStatusOr(); |
| EXPECT_FALSE(absl_convert.ok()); |
| EXPECT_EQ(absl_convert.status().message(), "Max depth exceeded"); |
| } |
| |
| } // namespace |
| } // namespace hpb::testing |