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