// Copyright 2017 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 <iterator>

#include <fbl/algorithm.h>
#include <fbl/string.h>
#include <fbl/string_traits.h>
#include <zxtest/zxtest.h>

namespace {

constexpr char kFakeStringData[] = "hello";
constexpr size_t kFakeStringLength = std::size(kFakeStringData);

struct SimpleFakeString {
  const char* data() const { return kFakeStringData; }
  size_t length() const { return kFakeStringLength; }
};

struct OverloadedFakeString {
  const char* data() const { return kFakeStringData; }
  size_t length() const { return kFakeStringLength; }

  // These are decoys to verify that the conversion operator only considers
  // the const overloads of these members.
  void data();
  void length();
};

struct EmptyStructBadString {};

struct DataOnlyBadString {
  const char* data();
};

struct LengthOnlyBadString {
  size_t length();
};

struct WrongDataTypeBadString {
  char* data() const;
  size_t length() const;
};

struct WrongLengthTypeBadString {
  const char* data() const;
  int32_t length() const;
};

static_assert(fbl::is_string_like_v<fbl::String>, "ok - string");
static_assert(fbl::is_string_like_v<std::string_view>, "ok - string piece");
static_assert(fbl::is_string_like_v<SimpleFakeString>, "ok - simple");
static_assert(fbl::is_string_like_v<OverloadedFakeString>, "ok - overloaded");
static_assert(!fbl::is_string_like_v<decltype(nullptr)>, "bad - null");
static_assert(!fbl::is_string_like_v<int>, "bad - int");
static_assert(!fbl::is_string_like_v<EmptyStructBadString>, "bad - empty struct");
static_assert(!fbl::is_string_like_v<DataOnlyBadString>, "bad - data only");
static_assert(!fbl::is_string_like_v<LengthOnlyBadString>, "bad - length only");
static_assert(!fbl::is_string_like_v<WrongDataTypeBadString>, "bad - wrong data type");
static_assert(!fbl::is_string_like_v<WrongLengthTypeBadString>, "bad - wrong length type");

TEST(StringTraitsTest, Accessor) {
  {
    SimpleFakeString str;
    EXPECT_EQ(kFakeStringData, fbl::GetStringData(str));
    EXPECT_EQ(kFakeStringLength, fbl::GetStringLength(str));
  }

  {
    OverloadedFakeString str;
    EXPECT_EQ(kFakeStringData, fbl::GetStringData(str));
    EXPECT_EQ(kFakeStringLength, fbl::GetStringLength(str));
  }
}

}  // namespace
