// 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 "lib/fidl/cpp/string.h"
#include "gtest/gtest.h"

namespace fidl {
namespace {

TEST(StringPtr, Control) {
  StringPtr string;
  EXPECT_TRUE(string.is_null());
  EXPECT_FALSE(string);
  string->append("abc");
  EXPECT_FALSE(string.is_null());
  EXPECT_TRUE(string);

  string.reset("hello, world");
  EXPECT_FALSE(string.is_null());
  EXPECT_TRUE(string);
  EXPECT_EQ("hello, world", *string);
  EXPECT_EQ("hello, world", string.get());
  EXPECT_EQ(12u, string->size());

  StringPtr other(std::move(string));
  EXPECT_EQ("hello, world", *other);

  StringPtr other2 = other;
  EXPECT_EQ("hello, world", *other);
  EXPECT_EQ("hello, world", *other2);
  EXPECT_EQ(other, other2);

  other2.reset();
  EXPECT_TRUE(other2.is_null());

  other2.swap(other);
  EXPECT_TRUE(other.is_null());
  EXPECT_EQ("hello, world", *other2);
  EXPECT_NE(other, other2);
}

TEST(StringPtr, Conversions) {
  StringPtr hello = "hello";
  EXPECT_FALSE(hello.is_null());
  EXPECT_EQ("hello", *hello);

  StringPtr world("world", 5);
  EXPECT_FALSE(world.is_null());
  EXPECT_EQ("world", *world);

  StringPtr null = nullptr;
  EXPECT_TRUE(null.is_null());
  EXPECT_EQ("", *null);

  std::string helloStr = hello;
  EXPECT_EQ("hello", helloStr);

  std::string nullStr = null;
  EXPECT_EQ("", nullStr);
}

TEST(StringPtr, Map) {
  std::map<StringPtr, int> map;
  StringPtr a = "a";
  StringPtr b = "b";
  StringPtr null;

  map[a] = 1;
  map[b] = 2;
  map[null] = 3;

  EXPECT_EQ(1, map[a]);
  EXPECT_EQ(2, map[b]);
  EXPECT_EQ(3, map[null]);
}

}  // namespace
}  // namespace fidl
