// Copyright 2018 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 "base/strings/string16.h"
#include "base/rand_util.h"
#include "base/strings/utf_string_conversions.h"
#include "mojo/common/string16.mojom.h"
#include "mojo/common/string16_struct_traits.h"
#include "mojo/public/cpp/base/big_buffer_struct_traits.h"
#include "mojo/public/cpp/test_support/test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace mojo {
namespace common {
namespace string16_unittest {

TEST(String16Test, Empty) {
  base::string16 in;
  base::string16 out;
  ASSERT_TRUE(test::SerializeAndDeserialize<mojom::String16>(&in, &out));
  EXPECT_EQ(in, out);
}

TEST(String16Test, NonEmpty) {
  base::string16 in = base::ASCIIToUTF16("hello world");
  base::string16 out;
  ASSERT_TRUE(test::SerializeAndDeserialize<mojom::String16>(&in, &out));
  EXPECT_EQ(in, out);
}

TEST(BigString16Test, Empty) {
  base::string16 in;
  base::string16 out;
  ASSERT_TRUE(test::SerializeAndDeserialize<mojom::BigString16>(&in, &out));
  EXPECT_EQ(in, out);
}

TEST(BigString16Test, Short) {
  base::string16 in = base::ASCIIToUTF16("hello world");
  base::string16 out;
  ASSERT_TRUE(test::SerializeAndDeserialize<mojom::BigString16>(&in, &out));
  EXPECT_EQ(in, out);
}

TEST(BigString16Test, Long) {
  constexpr size_t kLargeStringSize = 1024 * 1024;

  base::string16 in(kLargeStringSize, 0);
  base::RandBytes(&in[0], kLargeStringSize);

  base::string16 out;
  ASSERT_TRUE(test::SerializeAndDeserialize<mojom::BigString16>(&in, &out));
  EXPECT_EQ(in, out);
}

}  // namespace string16_unittest
}  // namespace common
}  // namespace mojo
