// Copyright 2020 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_kvs/key.h"

#include <string_view>

#include "pw_unit_test/framework.h"

namespace pw::kvs {

namespace {

constexpr const char kTestString[] = "test_string";
constexpr std::string_view kTestStringView{kTestString};

// kTestString2 starts with same string as kTestString.
constexpr const char kTestString2[] = "test_string2";

}  // namespace

TEST(Key, ConstructorEmpty) {
  Key key;
  EXPECT_EQ(key.size(), 0u);
  EXPECT_TRUE(key.empty());
  EXPECT_EQ(key.data(), nullptr);
  EXPECT_EQ(key.begin(), key.end());
}

TEST(Key, ConstructorString) {
  std::string str{kTestStringView};
  Key key{str};
  EXPECT_EQ(key.size(), kTestStringView.size());
  EXPECT_FALSE(key.empty());
  EXPECT_EQ(key.data(), str.data());
  EXPECT_EQ(key.front(), kTestStringView.front());
  EXPECT_EQ(key.back(), kTestStringView.back());
}

TEST(Key, ConstructorStringView) {
  Key key{kTestStringView};
  EXPECT_EQ(key.size(), kTestStringView.size());
  EXPECT_FALSE(key.empty());
  EXPECT_EQ(key.data(), kTestStringView.data());
  EXPECT_EQ(key.front(), kTestStringView.front());
  EXPECT_EQ(key.back(), kTestStringView.back());
}

TEST(Key, ConstructorNullTermString) {
  Key key{kTestString};
  EXPECT_EQ(key.size(), kTestStringView.size());
  EXPECT_FALSE(key.empty());
  EXPECT_EQ(key.data(), kTestString);
  EXPECT_EQ(key.front(), kTestStringView.front());
  EXPECT_EQ(key.back(), kTestStringView.back());
}

TEST(Key, ConstructorCharPtrLength) {
  Key key{kTestString, kTestStringView.size() + 1};  // include null terminator
  EXPECT_EQ(key.size(), kTestStringView.size() + 1);
  EXPECT_FALSE(key.empty());
  EXPECT_EQ(key.data(), kTestStringView.data());
  EXPECT_EQ(key.front(), kTestStringView.front());
  EXPECT_EQ(key.back(), '\0');
}

TEST(Key, ConstructorCopy) {
  Key key1{kTestString};
  Key key{key1};
  EXPECT_EQ(key.size(), kTestStringView.size());
  EXPECT_FALSE(key.empty());
  EXPECT_EQ(key.data(), kTestStringView.data());
  EXPECT_EQ(key.front(), kTestStringView.front());
  EXPECT_EQ(key.back(), kTestStringView.back());
}

TEST(Key, Access) {
  Key key{kTestStringView};
  for (size_t i = 0; i < key.size(); i++) {
    EXPECT_EQ(key[i], kTestStringView[i]);
    EXPECT_EQ(key.at(i), kTestStringView.at(i));
  }
}

TEST(Key, Iterator) {
  size_t i = 0;
  for (auto c : Key{kTestString}) {
    EXPECT_EQ(c, kTestString[i++]);
  }
}

TEST(Key, Same) {
  // Since start of two test strings are the same, verify those are equal.
  EXPECT_TRUE((Key{kTestString} == Key{kTestString2, kTestStringView.size()}));
  EXPECT_FALSE((Key{kTestString} != Key{kTestString2, kTestStringView.size()}));
}

TEST(Key, Different) {
  EXPECT_FALSE(Key{kTestString} == Key{kTestString2});
  EXPECT_TRUE(Key{kTestString} != Key{kTestString2});
}

TEST(Key, DifferentWithSameLength) {
  // Start second test string offset by one.
  EXPECT_FALSE(
      (Key{kTestString} == Key{kTestString2 + 1, kTestStringView.size()}));
  EXPECT_TRUE(
      (Key{kTestString} != Key{kTestString2 + 1, kTestStringView.size()}));
}

TEST(Key, ConvertToStringView) {
  std::string_view view = Key{kTestString};
  EXPECT_TRUE(view == kTestStringView);
}

}  // namespace pw::kvs
