blob: 9e0d938f052451745f1b2db132d01ea80ed04285 [file] [log] [blame]
// 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