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

#include "settingsd/key.h"

#include <gtest/gtest.h>

#include "settingsd/test_helpers.h"

namespace settingsd {

TEST(KeyTest, IsValidKey) {
  EXPECT_TRUE(Key::IsValidKey(""));
  EXPECT_FALSE(Key::IsValidKey("."));
  EXPECT_TRUE(Key::IsValidKey("A"));
  EXPECT_FALSE(Key::IsValidKey(".A"));
  EXPECT_FALSE(Key::IsValidKey("A."));
  EXPECT_TRUE(Key::IsValidKey("A.B"));
  EXPECT_FALSE(Key::IsValidKey("A..B"));
  EXPECT_FALSE(Key::IsValidKey("A.!.B"));
}

TEST(KeyTest, GetParent) {
  EXPECT_EQ(Key().GetParent(), Key());
  EXPECT_EQ(Key("A"), Key("A.B").GetParent());
}

TEST(KeyTest, Append) {
  EXPECT_EQ(Key("A"), Key().Append(Key("A")));
  EXPECT_EQ(Key("A.B"), Key("A").Append(Key("B")));
}

TEST(KeyTest, Extend) {
  EXPECT_EQ(Key("A"), Key().Extend({"A"}));
  EXPECT_EQ(Key("A.B"), Key("A").Extend({"B"}));
  EXPECT_EQ(Key("A.B.C"), Key("A").Extend({"B", "C"}));
}

TEST(KeyTest, Split) {
  Key suffix;
  EXPECT_EQ(Key(), Key().Split(nullptr));
  EXPECT_EQ(Key(), Key().Split(&suffix));
  EXPECT_EQ(Key(), suffix);
  EXPECT_EQ(Key("A"), Key("A").Split(nullptr));
  EXPECT_EQ(Key("A"), Key("A").Split(&suffix));
  EXPECT_EQ(Key(), suffix);
  EXPECT_EQ(Key("A"), Key("A.B").Split(nullptr));
  EXPECT_EQ(Key("A"), Key("A.B").Split(&suffix));
  EXPECT_EQ(Key("B"), suffix);
  EXPECT_EQ(Key("A"), Key("A.B.C").Split(nullptr));
  EXPECT_EQ(Key("A"), Key("A.B.C").Split(&suffix));
  EXPECT_EQ(Key("B.C"), suffix);
}

TEST(KeyTest, CommonPrefix) {
  EXPECT_EQ(Key(), Key().CommonPrefix(Key()));
  EXPECT_EQ(Key(), Key("A").CommonPrefix(Key()));
  EXPECT_EQ(Key(), Key().CommonPrefix(Key("A")));
  EXPECT_EQ(Key("A"), Key("A").CommonPrefix(Key("A")));
  EXPECT_EQ(Key("A"), Key("A.B").CommonPrefix(Key("A")));
  EXPECT_EQ(Key("A"), Key("A").CommonPrefix(Key("A.B")));
  EXPECT_EQ(Key("A"), Key("A.BA.C").CommonPrefix(Key("A.B.C")));
  EXPECT_EQ(Key(), Key("A.B").CommonPrefix(Key("B")));
}

TEST(KeyTest, Suffix) {
  Key suffix;
  EXPECT_TRUE(Key().Suffix(Key(), &suffix));
  EXPECT_EQ(Key(), suffix);
  EXPECT_FALSE(Key().Suffix(Key("A"), &suffix));
  EXPECT_EQ(Key(), suffix);
  EXPECT_TRUE(Key("A").Suffix(Key(""), &suffix));
  EXPECT_EQ(Key("A"), suffix);
  EXPECT_TRUE(Key("A").Suffix(Key("A"), &suffix));
  EXPECT_EQ(Key(""), suffix);
  EXPECT_TRUE(Key("A.B").Suffix(Key("A"), &suffix));
  EXPECT_EQ(Key("B"), suffix);
}

TEST(KeyTest, IsPrefixOf) {
  EXPECT_TRUE(Key().IsPrefixOf(Key()));
  EXPECT_TRUE(Key().IsPrefixOf(Key("A")));
  EXPECT_TRUE(Key("A").IsPrefixOf(Key("A")));
  EXPECT_FALSE(Key("A").IsPrefixOf(Key()));
  EXPECT_TRUE(Key("A.B").IsPrefixOf(Key("A.B.C")));
  EXPECT_FALSE(Key("A.C").IsPrefixOf(Key("A.B.C")));
  EXPECT_FALSE(Key("A.B").IsPrefixOf(Key("A.BC")));
}

}  // namespace settingsd
