// 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.
//

#ifndef THIRD_PARTY_CREDENTIO_TESTING_PROTO_TEST_UTILS_H_
#define THIRD_PARTY_CREDENTIO_TESTING_PROTO_TEST_UTILS_H_

#include "absl/log/check.h"
#include "absl/strings/string_view.h"
#include "gmock/gmock.h"
#include "google/protobuf/text_format.h"
#include "google/protobuf/util/message_differencer.h"

namespace credentio_testing {

MATCHER_P(EqualsProto, expected, "") {
  return google::protobuf::util::MessageDifferencer::Equals(arg, expected);
}

MATCHER_P(PartiallyEqualsProto, expected, "") {
  google::protobuf::util::MessageDifferencer differencer;
  differencer.set_scope(google::protobuf::util::MessageDifferencer::PARTIAL);
  return differencer.Compare(expected, arg);
}

template <typename T>
T ParseTextProtoOrDie(absl::string_view text_proto) {
  T proto;
  CHECK(google::protobuf::TextFormat::ParseFromString(text_proto, &proto));
  return proto;
}

}  // namespace credentio_testing

#endif  // THIRD_PARTY_CREDENTIO_TESTING_PROTO_TEST_UTILS_H_
