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