// Copyright 2018 The Fuchsia 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 "src/developer/debug/zxdb/client/setting_value.h"

#include <gtest/gtest.h>

namespace zxdb {

TEST(SettingValue, Boolean) {
  SettingValue setting(false);
  ASSERT_TRUE(setting.is_bool());
  EXPECT_FALSE(setting.get_bool());

  setting = SettingValue(true);
  EXPECT_TRUE(setting.get_bool());

  setting.set_bool(false);
  EXPECT_FALSE(setting.get_bool());
}

TEST(SettingValue, Int) {
  SettingValue setting(0);
  ASSERT_TRUE(setting.is_int());
  EXPECT_EQ(setting.get_int(), 0);

  constexpr int kTestInt = 43;
  setting = SettingValue(kTestInt);
  EXPECT_EQ(setting.get_int(), kTestInt);

  constexpr int kTestInt2 = 10;
  setting.set_int(kTestInt2);
  EXPECT_EQ(setting.get_int(), kTestInt2);
}

const char kTestString[] = "test_string";
const char kTestString2[] = "test_string2";
const char kTestString3[] = "test_string3";

TEST(SettingValue, String) {
  SettingValue setting(std::string{});
  ASSERT_TRUE(setting.is_string());
  EXPECT_TRUE(setting.get_string().empty());

  setting = SettingValue(kTestString);
  EXPECT_EQ(setting.get_string(), kTestString);

  setting = SettingValue(std::string(kTestString2));
  EXPECT_EQ(setting.get_string(), kTestString2);

  setting.set_string(kTestString3);
  EXPECT_EQ(setting.get_string(), kTestString3);
}

TEST(SettingValue, List) {
  SettingValue setting(std::vector<std::string>{});
  ASSERT_TRUE(setting.is_list());
  EXPECT_TRUE(setting.get_list().empty());

  setting = SettingValue(std::vector<std::string>{kTestString});
  ASSERT_EQ(setting.get_list().size(), 1u);

  setting.set_list({kTestString, kTestString2});
  ASSERT_EQ(setting.get_list().size(), 2u);

  auto it = setting.get_list().begin();
  EXPECT_EQ(*it++, kTestString);
  EXPECT_EQ(*it++, kTestString2);
  EXPECT_EQ(it, setting.get_list().end());
}

}  // namespace zxdb
