| // Copyright 2026 Google LLC | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // https://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| // | |
| #include "cbor/cbor.h" | |
| #include <memory> | |
| #include "absl/status/status.h" | |
| #include "absl/status/status_macros.h" // IWYU pragma: keep | |
| #include "absl/status/status_matchers.h" | |
| #include "absl/status/statusor.h" | |
| #include "cppbor/cppbor.h" | |
| #include "gmock/gmock.h" | |
| #include "gtest/gtest.h" | |
| namespace cbor { | |
| namespace { | |
| using ::testing::Eq; | |
| TEST(ItemViewTest, BoolType) { | |
| auto item = std::make_unique<cppbor::Bool>(true); | |
| ItemView view(item.get()); | |
| EXPECT_EQ(view.type(), ItemView::Type::kBool); | |
| auto val = view.GetBool(); | |
| ABSL_ASSERT_OK(val); | |
| EXPECT_TRUE(*val); | |
| } | |
| TEST(ItemViewTest, FloatType) { | |
| auto item = std::make_unique<cppbor::Float>(1.5f); | |
| ItemView view(item.get()); | |
| EXPECT_EQ(view.type(), ItemView::Type::kFloat); | |
| auto val = view.GetFloat(); | |
| ABSL_ASSERT_OK(val); | |
| EXPECT_FLOAT_EQ(*val, 1.5f); | |
| } | |
| TEST(ItemViewTest, DoubleType) { | |
| auto item = std::make_unique<cppbor::Double>(2.5); | |
| ItemView view(item.get()); | |
| EXPECT_EQ(view.type(), ItemView::Type::kDouble); | |
| auto val = view.GetDouble(); | |
| ABSL_ASSERT_OK(val); | |
| EXPECT_DOUBLE_EQ(*val, 2.5); | |
| } | |
| TEST(ItemViewTest, Int64Type) { | |
| auto item = std::make_unique<cppbor::Nint>(-42); | |
| ItemView view(item.get()); | |
| EXPECT_EQ(view.type(), ItemView::Type::kInt64); | |
| auto val = view.GetInt64(); | |
| ABSL_ASSERT_OK(val); | |
| EXPECT_EQ(*val, -42); | |
| } | |
| TEST(ItemViewTest, Uint64Type) { | |
| auto item = std::make_unique<cppbor::Uint>(42); | |
| ItemView view(item.get()); | |
| EXPECT_EQ(view.type(), ItemView::Type::kUint64); | |
| auto val = view.GetUint64(); | |
| ABSL_ASSERT_OK(val); | |
| EXPECT_EQ(*val, 42); | |
| } | |
| TEST(ItemViewTest, StringType) { | |
| auto item = std::make_unique<cppbor::Tstr>("hello"); | |
| ItemView view(item.get()); | |
| EXPECT_EQ(view.type(), ItemView::Type::kString); | |
| auto val = view.GetString(); | |
| ABSL_ASSERT_OK(val); | |
| EXPECT_EQ(*val, "hello"); | |
| } | |
| TEST(ItemViewTest, ByteStringType) { | |
| auto item = std::make_unique<cppbor::Bstr>("world"); | |
| ItemView view(item.get()); | |
| EXPECT_EQ(view.type(), ItemView::Type::kByteString); | |
| auto val = view.GetByteString(); | |
| ABSL_ASSERT_OK(val); | |
| EXPECT_EQ(*val, "world"); | |
| } | |
| TEST(ItemViewTest, MapType) { | |
| auto item = std::make_unique<cppbor::Map>(); | |
| ItemView view(item.get()); | |
| EXPECT_EQ(view.type(), ItemView::Type::kMap); | |
| auto val = view.GetMap(); | |
| ABSL_ASSERT_OK(val); | |
| } | |
| TEST(ItemViewTest, ArrayType) { | |
| auto item = std::make_unique<cppbor::Array>(); | |
| ItemView view(item.get()); | |
| EXPECT_EQ(view.type(), ItemView::Type::kArray); | |
| auto val = view.GetArray(); | |
| ABSL_ASSERT_OK(val); | |
| } | |
| TEST(ItemViewTest, IsNull) { | |
| auto item = std::make_unique<cppbor::Null>(); | |
| ItemView view(item.get()); | |
| EXPECT_TRUE(view.IsNull()); | |
| } | |
| TEST(ItemViewTest, Failures) { | |
| auto item = std::make_unique<cppbor::Uint>(42); | |
| ItemView view(item.get()); | |
| EXPECT_THAT(view.GetBool().status().code(), | |
| Eq(absl::StatusCode::kInvalidArgument)); | |
| EXPECT_THAT(view.GetFloat().status().code(), | |
| Eq(absl::StatusCode::kInvalidArgument)); | |
| EXPECT_THAT(view.GetDouble().status().code(), | |
| Eq(absl::StatusCode::kInvalidArgument)); | |
| EXPECT_THAT(view.GetString().status().code(), | |
| Eq(absl::StatusCode::kInvalidArgument)); | |
| EXPECT_THAT(view.GetByteString().status().code(), | |
| Eq(absl::StatusCode::kInvalidArgument)); | |
| EXPECT_THAT(view.GetMap().status().code(), | |
| Eq(absl::StatusCode::kInvalidArgument)); | |
| EXPECT_THAT(view.GetArray().status().code(), | |
| Eq(absl::StatusCode::kInvalidArgument)); | |
| } | |
| TEST(MapViewTest, GetMethods) { | |
| auto map = std::make_unique<cppbor::Map>(); | |
| map->add("bool", cppbor::Bool(true)); | |
| map->add("int", cppbor::Uint(42)); | |
| map->add("string", cppbor::Tstr("value")); | |
| map->add(42, cppbor::Uint(24)); | |
| MapView view(map.get()); | |
| auto bool_val = view.GetBool("bool"); | |
| ABSL_ASSERT_OK(bool_val); | |
| EXPECT_TRUE(*bool_val); | |
| auto int_val = view.GetUint64("int"); | |
| ABSL_ASSERT_OK(int_val); | |
| EXPECT_EQ(*int_val, 42); | |
| auto str_val = view.GetString("string"); | |
| ABSL_ASSERT_OK(str_val); | |
| EXPECT_EQ(*str_val, "value"); | |
| auto int_key_val = view.GetInt64(42); | |
| ABSL_ASSERT_OK(int_key_val); | |
| EXPECT_EQ(*int_key_val, 24); | |
| } | |
| TEST(MapViewTest, GetOptional) { | |
| auto map = std::make_unique<cppbor::Map>(); | |
| map->add("bool", cppbor::Bool(true)); | |
| MapView view(map.get()); | |
| EXPECT_TRUE(view.GetOptionalBool("bool").has_value()); | |
| EXPECT_TRUE(view.GetOptionalBool("bool").value()); | |
| EXPECT_FALSE(view.GetOptionalBool("nonexistent").has_value()); | |
| } | |
| TEST(MapViewTest, Failures) { | |
| auto map = std::make_unique<cppbor::Map>(); | |
| MapView view(map.get()); | |
| EXPECT_THAT(view.GetBool("nonexistent").status().code(), | |
| Eq(absl::StatusCode::kInvalidArgument)); | |
| } | |
| TEST(ArrayViewTest, GetMethods) { | |
| auto array = std::make_unique<cppbor::Array>(); | |
| array->add(cppbor::Bool(true)); | |
| array->add(cppbor::Uint(42)); | |
| ArrayView view(array.get()); | |
| EXPECT_EQ(view.size(), 2); | |
| EXPECT_FALSE(view.empty()); | |
| auto bool_val = view.GetBool(0); | |
| ABSL_ASSERT_OK(bool_val); | |
| EXPECT_TRUE(*bool_val); | |
| auto int_val = view.GetUint64(1); | |
| ABSL_ASSERT_OK(int_val); | |
| EXPECT_EQ(*int_val, 42); | |
| } | |
| TEST(ArrayViewTest, Failures) { | |
| auto array = std::make_unique<cppbor::Array>(); | |
| ArrayView view(array.get()); | |
| EXPECT_THAT(view.GetBool(0).status().code(), | |
| Eq(absl::StatusCode::kInvalidArgument)); | |
| EXPECT_EQ(view.value_type(0), ItemView::Type::kUnknown); | |
| EXPECT_EQ(view.value_type(1), ItemView::Type::kUnknown); | |
| array->add(cppbor::Uint(42)); | |
| EXPECT_EQ(view.value_type(0), ItemView::Type::kUint64); | |
| EXPECT_EQ(view.value_type(1), ItemView::Type::kUnknown); | |
| } | |
| } // namespace | |
| } // namespace cbor |