//
// Copyright 2024 The Abseil Authors.
//
// 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 "absl/log/internal/structured_proto.h"

#include <cstddef>
#include <cstdint>
#include <string>
#include <utility>
#include <vector>

#include "gtest/gtest.h"
#include "absl/base/config.h"
#include "absl/strings/string_view.h"
#include "absl/types/span.h"

namespace absl {
ABSL_NAMESPACE_BEGIN
namespace log_internal {
namespace {

using ::testing::TestWithParam;

struct StructuredProtoTestCase {
  std::string test_name;
  StructuredProtoField field;
  std::vector<char> expected_encoded_field;
};

using StructuredProtoTest = TestWithParam<StructuredProtoTestCase>;

TEST_P(StructuredProtoTest, Encoding) {
  const StructuredProtoTestCase& test_case = GetParam();

  // Greater than or equal to since BufferSizeForStructuredProtoField() is just
  // an estimate of the data size and not an exact measurement.
  ASSERT_GE(BufferSizeForStructuredProtoField(test_case.field),
            test_case.expected_encoded_field.size());

  std::vector<char> buf;
  buf.resize(1024);

  absl::Span<char> buf_span(buf);
  EXPECT_TRUE(EncodeStructuredProtoField(test_case.field, buf_span));
  size_t encoded_field_size = buf.size() - buf_span.size();

  ASSERT_EQ(encoded_field_size, test_case.expected_encoded_field.size());
  buf.resize(encoded_field_size);
  EXPECT_EQ(buf, test_case.expected_encoded_field);
}

INSTANTIATE_TEST_SUITE_P(
    StructuredProtoTestSuiteInstantiation,
    StructuredProtoTest,  // This is the name of your parameterized test
    testing::ValuesIn<StructuredProtoTestCase>({
        {
            "Varint",
            {
                42,
                StructuredProtoField::Value{
                    std::in_place_type<StructuredProtoField::Varint>,
                    int32_t{23},
                },
            },
            {'\xD0', '\x02', '\x17'},
        },
        {
            "I64",
            {
                42,
                StructuredProtoField::Value{
                    std::in_place_type<StructuredProtoField::I64>,
                    int64_t{23},
                },
            },
            {'\xD1', '\x02', '\x17', '\x00', '\x00', '\x00', '\x00', '\x00',
             '\x00', '\x00'},
        },
        {
            "LengthDelimited",
            {
                42,
                // Use a string_view so the terminating NUL is excluded.
                absl::string_view("Hello"),
            },
            {'\xD2', '\x02', '\x05', 'H', 'e', 'l', 'l', 'o'},
        },
        {
            "I32",
            {
                42,
                StructuredProtoField::Value{
                    std::in_place_type<StructuredProtoField::I32>,
                    int32_t{23},
                },
            },
            {'\xD5', '\x02', '\x17', '\x00', '\x00', '\x00'},
        },
    }),
    [](const testing::TestParamInfo<StructuredProtoTest::ParamType>& info) {
      return info.param.test_name;
    });

}  // namespace
}  // namespace log_internal
ABSL_NAMESPACE_END
}  // namespace absl
