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

// Keep this file in sync with entry_kernel.h.

#include "sync/syncable/syncable_enum_conversions.h"

#include <string>

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

namespace syncer {
namespace syncable {
namespace {

class SyncableEnumConversionsTest : public testing::Test {
};

template <class T>
void TestEnumStringFunction(const char* (*enum_string_fn)(T),
                            int enum_min, int enum_max) {
  EXPECT_LE(enum_min, enum_max);
  for (int i = enum_min; i <= enum_max; ++i) {
    const std::string& str = enum_string_fn(static_cast<T>(i));
    EXPECT_FALSE(str.empty());
  }
}

TEST_F(SyncableEnumConversionsTest, GetMetahandleFieldString) {
  TestEnumStringFunction(
      GetMetahandleFieldString, INT64_FIELDS_BEGIN, META_HANDLE);
}

TEST_F(SyncableEnumConversionsTest, GetBaseVersionString) {
  TestEnumStringFunction(
      GetBaseVersionString, META_HANDLE + 1, BASE_VERSION);
}

TEST_F(SyncableEnumConversionsTest, GetInt64FieldString) {
  TestEnumStringFunction(
      GetInt64FieldString, BASE_VERSION + 1, INT64_FIELDS_END - 1);
}

TEST_F(SyncableEnumConversionsTest, GetTimeFieldString) {
  TestEnumStringFunction(
      GetTimeFieldString, TIME_FIELDS_BEGIN, TIME_FIELDS_END - 1);
}

TEST_F(SyncableEnumConversionsTest, GetIdFieldString) {
  TestEnumStringFunction(
      GetIdFieldString, ID_FIELDS_BEGIN, ID_FIELDS_END - 1);
}

TEST_F(SyncableEnumConversionsTest, GetIndexedBitFieldString) {
  TestEnumStringFunction(
      GetIndexedBitFieldString, BIT_FIELDS_BEGIN, INDEXED_BIT_FIELDS_END - 1);
}

TEST_F(SyncableEnumConversionsTest, GetIsDelFieldString) {
  TestEnumStringFunction(
      GetIsDelFieldString, INDEXED_BIT_FIELDS_END, IS_DEL);
}

TEST_F(SyncableEnumConversionsTest, GetBitFieldString) {
  TestEnumStringFunction(
      GetBitFieldString, IS_DEL + 1, BIT_FIELDS_END - 1);
}

TEST_F(SyncableEnumConversionsTest, GetStringFieldString) {
  TestEnumStringFunction(
      GetStringFieldString, STRING_FIELDS_BEGIN, STRING_FIELDS_END - 1);
}

TEST_F(SyncableEnumConversionsTest, GetProtoFieldString) {
  TestEnumStringFunction(
      GetProtoFieldString, PROTO_FIELDS_BEGIN, PROTO_FIELDS_END - 1);
}

TEST_F(SyncableEnumConversionsTest, GetUniquePositionFieldString) {
  TestEnumStringFunction(
      GetUniquePositionFieldString,
      UNIQUE_POSITION_FIELDS_BEGIN, UNIQUE_POSITION_FIELDS_END - 1);
}

TEST_F(SyncableEnumConversionsTest, GetAttachmentMetadataFieldString) {
  TestEnumStringFunction(
      GetAttachmentMetadataFieldString,
      ATTACHMENT_METADATA_FIELDS_BEGIN, ATTACHMENT_METADATA_FIELDS_END - 1);
}

TEST_F(SyncableEnumConversionsTest, GetBitTempString) {
  TestEnumStringFunction(
      GetBitTempString, BIT_TEMPS_BEGIN, BIT_TEMPS_END - 1);
}

}  // namespace
}  // namespace syncable
}  // namespace syncer
