// Copyright 2022 The Pigweed 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 "pw_protobuf_compiler/pwpb_test_protos/pwpb_test.pwpb.h"
#include "pw_string/string.h"
#include "pw_unit_test/framework.h"

namespace pw::protobuf_compiler {
namespace {

TEST(Pwpb, CompilesProtobufs) {
  pwpb_test_protos::pwpb::Point::Message point = {4, 8, "point"};
  EXPECT_EQ(point.x, 4u);
  EXPECT_EQ(point.y, 8u);
  EXPECT_EQ(point.name.size(), 5u);
  EXPECT_EQ(point.name, "point");
}

TEST(Pwpb, OptionsFilesAreApplied) {
  pwpb_test_protos::pwpb::OptionsFileExample::Message string_options_comparison;

  static_assert(
      std::is_same_v<decltype(string_options_comparison.thirty_two_chars),
                     pw::InlineString<32>>,
      "Field `thirty_two_chars` should be a `pw::InlineString<32>`.");

  static_assert(
      std::is_same_v<decltype(string_options_comparison.forty_two_chars),
                     pw::InlineString<42>>,
      "Field `forty_two_chars` should be a `pw::InlineString<42>`.");

  static_assert(
      std::is_same_v<
          decltype(string_options_comparison.unspecified_length),
          pw::protobuf::Callback<
              pwpb_test_protos::pwpb::OptionsFileExample::StreamEncoder,
              pwpb_test_protos::pwpb::OptionsFileExample::StreamDecoder>>,
      "The field `unspecified_length` should be a `pw::protobuf::Callback`.");
}

TEST(Pwpb, InlineOptionsAppliedAndOverridden) {
  pw::protobuf_compiler::pwpb_test_protos::pwpb::InlineOptionsExample::Message
      inline_options_example;

  static_assert(
      std::is_same_v<decltype(inline_options_example.ten_chars_inline),
                     pw::InlineString<10>>,
      "Field `ten_chars_inline` should be a `pw::InlineString<10>`.");
}

}  // namespace
}  // namespace pw::protobuf_compiler
