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
12 namespace {
13
14 constexpr char kFakeStringData[] = "hello";
15 constexpr size_t kFakeStringLength = fbl::count_of(kFakeStringData);
16
17 struct SimpleFakeString {
data__anon1803a1f60111::SimpleFakeString18 const char* data() const { return kFakeStringData; }
length__anon1803a1f60111::SimpleFakeString19 size_t length() const { return kFakeStringLength; }
20 };
21
22 struct OverloadedFakeString {
data__anon1803a1f60111::OverloadedFakeString23 const char* data() const { return kFakeStringData; }
length__anon1803a1f60111::OverloadedFakeString24 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
32 struct EmptyStructBadString {};
33
34 struct DataOnlyBadString {
35 const char* data();
36 };
37
38 struct LengthOnlyBadString {
39 size_t length();
40 };
41
42 struct WrongDataTypeBadString {
43 char* data() const;
44 size_t length() const;
45 };
46
47 struct WrongLengthTypeBadString {
48 const char* data() const;
49 int32_t length() const;
50 };
51
52 static_assert(fbl::is_string_like<fbl::String>::value, "ok - string");
53 static_assert(fbl::is_string_like<fbl::StringPiece>::value, "ok - string piece");
54 static_assert(fbl::is_string_like<SimpleFakeString>::value, "ok - simple");
55 static_assert(fbl::is_string_like<OverloadedFakeString>::value, "ok - overloaded");
56 static_assert(!fbl::is_string_like<decltype(nullptr)>::value, "bad - null");
57 static_assert(!fbl::is_string_like<int>::value, "bad - int");
58 static_assert(!fbl::is_string_like<EmptyStructBadString>::value, "bad - empty struct");
59 static_assert(!fbl::is_string_like<DataOnlyBadString>::value, "bad - data only");
60 static_assert(!fbl::is_string_like<LengthOnlyBadString>::value, "bad - length only");
61 static_assert(!fbl::is_string_like<WrongDataTypeBadString>::value, "bad - wrong data type");
62 static_assert(!fbl::is_string_like<WrongLengthTypeBadString>::value, "bad - wrong length type");
63
string_accessors_test()64 bool 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
84 BEGIN_TEST_CASE(string_traits_tests)
85 RUN_TEST(string_accessors_test)
86 END_TEST_CASE(string_traits_tests)
87