// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/sync/protocol/proto_enum_conversions.h"

#include <string>

#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace syncer {
namespace {

// WARNING: Keep this file in sync with the .proto files in this directory.

using ::testing::Not;
using ::testing::StrEq;

// Iterates through the enum values, checking their string version is non-empty.
// The T##_IsValid() check is needed because some enums have deprecated values,
// so they have gaps in their numeric range.
#define TestEnumStringsNonEmpty(T)                                       \
  for (int i = T##_MIN; i <= T##_MAX; ++i) {                             \
    if (T##_IsValid(i)) {                                                \
      EXPECT_THAT(ProtoEnumToString(static_cast<T>(i)), Not(StrEq(""))); \
    }                                                                    \
  }

TEST(ProtoEnumConversionsTest, GetAppListItemTypeString) {
  TestEnumStringsNonEmpty(sync_pb::AppListSpecifics::AppListItemType);
}

TEST(ProtoEnumConversionsTest, GetSegmentationPlatformTypeTypeString) {
  TestEnumStringsNonEmpty(
      sync_pb::SegmentationSpecifics::DeviceMetadata::PlatformType);
}

TEST(ProtoEnumConversionsTest, GetBrowserTypeString) {
  TestEnumStringsNonEmpty(sync_pb::SyncEnums::BrowserType);
}

TEST(ProtoEnumConversionsTest, GetPageTransitionString) {
  TestEnumStringsNonEmpty(sync_pb::SyncEnums::PageTransition);
}

TEST(ProtoEnumConversionsTest, GetPageTransitionQualifierString) {
  TestEnumStringsNonEmpty(sync_pb::SyncEnums::PageTransitionRedirectType);
}

TEST(ProtoEnumConversionsTest, GetWifiConfigurationSecurityTypeString) {
  TestEnumStringsNonEmpty(sync_pb::WifiConfigurationSpecifics::SecurityType);
}

TEST(ProtoEnumConversionsTest,
     GetWifiConfigurationAutomaticallyConnectOptionString) {
  TestEnumStringsNonEmpty(
      sync_pb::WifiConfigurationSpecifics::AutomaticallyConnectOption);
}

TEST(ProtoEnumConversionsTest, GetWifiConfigurationIsPreferredOptionString) {
  TestEnumStringsNonEmpty(
      sync_pb::WifiConfigurationSpecifics::IsPreferredOption);
}

TEST(ProtoEnumConversionsTest, GetWifiConfigurationMeteredOptionString) {
  TestEnumStringsNonEmpty(sync_pb::WifiConfigurationSpecifics::MeteredOption);
}

TEST(ProtoEnumConversionsTest, GetWifiConfigurationProxyOptionString) {
  TestEnumStringsNonEmpty(
      sync_pb::WifiConfigurationSpecifics::ProxyConfiguration::ProxyOption);
}

TEST(ProtoEnumConversionsTest, GetUpdatesSourceString) {
  TestEnumStringsNonEmpty(sync_pb::GetUpdatesCallerInfo::GetUpdatesSource);
}

TEST(ProtoEnumConversionsTest, GetUpdatesOriginString) {
  TestEnumStringsNonEmpty(sync_pb::SyncEnums::GetUpdatesOrigin);
}

TEST(ProtoEnumConversionsTest, GetResponseTypeString) {
  TestEnumStringsNonEmpty(sync_pb::CommitResponse::ResponseType);
}

TEST(ProtoEnumConversionsTest, GetErrorTypeString) {
  TestEnumStringsNonEmpty(sync_pb::SyncEnums::ErrorType);
}

TEST(ProtoEnumConversionsTest, GetActionString) {
  TestEnumStringsNonEmpty(sync_pb::SyncEnums::Action);
}

TEST(ProtoEnumConversionsTest, GetConsentStatusString) {
  TestEnumStringsNonEmpty(sync_pb::UserConsentTypes::ConsentStatus);
}

TEST(ProtoEnumConversionsTest, GetVirtualCardEnrollmentTypeString) {
  TestEnumStringsNonEmpty(
      sync_pb::WalletMaskedCreditCard::VirtualCardEnrollmentType);
}

TEST(ProtoEnumConversionsTest, GetSavedTabGroupColorString) {
  TestEnumStringsNonEmpty(sync_pb::SavedTabGroup::SavedTabGroupColor);
}

TEST(ProtoEnumConversionsTest, GetIssuerString) {
  TestEnumStringsNonEmpty(sync_pb::CardIssuer::Issuer);
}

TEST(ProtoEnumConversionsTest, GetPowerBookmakrPowerTypeString) {
  TestEnumStringsNonEmpty(sync_pb::PowerBookmarkSpecifics::PowerType);
}

TEST(ProtoEnumConversionsTest, GetNoteTargetTypeString) {
  TestEnumStringsNonEmpty(sync_pb::NoteEntity::TargetType);
}

TEST(ProtoEnumConversionsTest, GetInitialSyncStateString) {
  TestEnumStringsNonEmpty(sync_pb::ModelTypeState::InitialSyncState);
}

}  // namespace
}  // namespace syncer