1// Copyright 2017 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <fbl/string_traits.h>
6
7#include <fbl/algorithm.h>
8#include <fbl/string.h>
9#include <fbl/string_piece.h>
10#include <unittest/unittest.h>
11
12namespace {
13
14constexpr char kFakeStringData[] = "hello";
15constexpr size_t kFakeStringLength = fbl::count_of(kFakeStringData);
16
17struct SimpleFakeString {
18    const char* data() const { return kFakeStringData; }
19    size_t length() const { return kFakeStringLength; }
20};
21
22struct OverloadedFakeString {
23    const char* data() const { return kFakeStringData; }
24    size_t length() const { return kFakeStringLength; }
25
26    // These are decoys to verify that the conversion operator only considers
27    // the const overloads of these members.
28    void data();
29    void length();
30};
31
32struct EmptyStructBadString {};
33
34struct DataOnlyBadString {
35    const char* data();
36};
37
38struct LengthOnlyBadString {
39    size_t length();
40};
41
42struct WrongDataTypeBadString {
43    char* data() const;
44    size_t length() const;
45};
46
47struct WrongLengthTypeBadString {
48    const char* data() const;
49    int32_t length() const;
50};
51
52static_assert(fbl::is_string_like<fbl::String>::value, "ok - string");
53static_assert(fbl::is_string_like<fbl::StringPiece>::value, "ok - string piece");
54static_assert(fbl::is_string_like<SimpleFakeString>::value, "ok - simple");
55static_assert(fbl::is_string_like<OverloadedFakeString>::value, "ok - overloaded");
56static_assert(!fbl::is_string_like<decltype(nullptr)>::value, "bad - null");
57static_assert(!fbl::is_string_like<int>::value, "bad - int");
58static_assert(!fbl::is_string_like<EmptyStructBadString>::value, "bad - empty struct");
59static_assert(!fbl::is_string_like<DataOnlyBadString>::value, "bad - data only");
60static_assert(!fbl::is_string_like<LengthOnlyBadString>::value, "bad - length only");
61static_assert(!fbl::is_string_like<WrongDataTypeBadString>::value, "bad - wrong data type");
62static_assert(!fbl::is_string_like<WrongLengthTypeBadString>::value, "bad - wrong length type");
63
64bool string_accessors_test() {
65    BEGIN_TEST;
66
67    {
68        SimpleFakeString str;
69        EXPECT_EQ(kFakeStringData, fbl::GetStringData(str));
70        EXPECT_EQ(kFakeStringLength, fbl::GetStringLength(str));
71    }
72
73    {
74        OverloadedFakeString str;
75        EXPECT_EQ(kFakeStringData, fbl::GetStringData(str));
76        EXPECT_EQ(kFakeStringLength, fbl::GetStringLength(str));
77    }
78
79    END_TEST;
80}
81
82} // namespace
83
84BEGIN_TEST_CASE(string_traits_tests)
85RUN_TEST(string_accessors_test)
86END_TEST_CASE(string_traits_tests)
87