// Copyright 2014 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.

#include <sstream>

#include "mojo/public/cpp/bindings/string.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace mojo {
namespace test {

TEST(StringTest, DefaultIsNull) {
  String s;
  EXPECT_TRUE(s.is_null());
}

TEST(StringTest, ConstructedWithNull) {
  String s(nullptr);
  EXPECT_TRUE(s.is_null());
}

TEST(StringTest, ConstructedWithNullCharPointer) {
  const char* null = nullptr;
  String s(null);
  EXPECT_TRUE(s.is_null());
}

TEST(StringTest, AssignedNull) {
  String s("");
  EXPECT_FALSE(s.is_null());
  s = nullptr;
  EXPECT_TRUE(s.is_null());
}

TEST(StringTest, AssignedNullCharPointer) {
  String s("");
  EXPECT_FALSE(s.is_null());
  const char* null = nullptr;
  s = null;
  EXPECT_TRUE(s.is_null());
}

TEST(StringTest, Empty) {
  String s("");
  EXPECT_FALSE(s.is_null());
  EXPECT_TRUE(s.get().empty());
}

TEST(StringTest, Basic) {
  String s("hello world");
  EXPECT_EQ(std::string("hello world"), s.get());
}

TEST(StringTest, Assignment) {
  String s("hello world");
  String t = s;  // Makes a copy.
  EXPECT_FALSE(t.is_null());
  EXPECT_EQ(std::string("hello world"), t.get());
  EXPECT_FALSE(s.is_null());
}

TEST(StringTest, ConstAt) {
  const String s("abc");
  EXPECT_EQ('a', s.at(0));
  EXPECT_EQ('b', s.at(1));
  EXPECT_EQ('c', s.at(2));
}

TEST(StringTest, NonConstAt) {
  String s("abc");
  EXPECT_EQ('a', s.at(0));
  EXPECT_EQ('b', s.at(1));
  s.at(0) = 'x';
  s.at(1) = 'y';
  EXPECT_EQ('x', s.at(0));
  EXPECT_EQ('y', s.at(1));
  EXPECT_EQ('c', s.at(2));
}

TEST(StringTest, ConstArraySubscript) {
  const String s("abc");
  EXPECT_EQ('a', s[0]);
  EXPECT_EQ('b', s[1]);
  EXPECT_EQ('c', s[2]);
}

TEST(StringTest, NonConstArraySubscript) {
  String s("abc");
  EXPECT_EQ('a', s[0]);
  EXPECT_EQ('b', s[1]);
  s[0] = 'x';
  s[1] = 'y';
  EXPECT_EQ('x', s[0]);
  EXPECT_EQ('y', s[1]);
  EXPECT_EQ('c', s[2]);
}

TEST(StringTest, Equality) {
  String s("hello world");
  String t("hello world");
  EXPECT_EQ(s, t);
  EXPECT_TRUE(s == t);
  EXPECT_TRUE("hello world" == s);
  EXPECT_TRUE(s == "hello world");
  EXPECT_TRUE("not" != s);
  EXPECT_TRUE(s != "not");
}

TEST(StringTest, LessThanNullness) {
  String null;
  String null2;
  EXPECT_FALSE(null < null2);
  EXPECT_FALSE(null2 < null);

  String real("real");
  EXPECT_TRUE(null < real);
  EXPECT_FALSE(real < null);
}

TEST(StringTest, OutputFormatting) {
  String s("abc");
  String null;

  std::ostringstream so;
  so << "s=" << s << ", null=" << null;
  EXPECT_EQ("s=abc, null=", so.str());
}

}  // namespace test
}  // namespace mojo
