1 //===-- adt_test.cpp ------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file is a part of the ORC runtime. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "adt.h" 14 #include "gtest/gtest.h" 15 16 #include <sstream> 17 #include <string> 18 19 using namespace __orc_rt; 20 21 TEST(ADTTest, SpanDefaultConstruction) { 22 span<int> S; 23 EXPECT_TRUE(S.empty()) << "Default constructed span not empty"; 24 EXPECT_EQ(S.size(), 0U) << "Default constructed span size not zero"; 25 EXPECT_EQ(S.begin(), S.end()) << "Default constructed span begin != end"; 26 } 27 28 TEST(ADTTest, SpanConstructFromFixedArray) { 29 int A[] = {1, 2, 3, 4, 5}; 30 span<int> S(A); 31 EXPECT_FALSE(S.empty()) << "Span should be non-empty"; 32 EXPECT_EQ(S.size(), 5U) << "Span has unexpected size"; 33 EXPECT_EQ(std::distance(S.begin(), S.end()), 5U) 34 << "Unexpected iterator range size"; 35 EXPECT_EQ(S.data(), &A[0]) << "Span data has unexpected value"; 36 for (unsigned I = 0; I != S.size(); ++I) 37 EXPECT_EQ(S[I], A[I]) << "Unexpected span element value"; 38 } 39 40 TEST(ADTTest, SpanConstructFromIteratorAndSize) { 41 int A[] = {1, 2, 3, 4, 5}; 42 span<int> S(&A[0], 5); 43 EXPECT_FALSE(S.empty()) << "Span should be non-empty"; 44 EXPECT_EQ(S.size(), 5U) << "Span has unexpected size"; 45 EXPECT_EQ(std::distance(S.begin(), S.end()), 5U) 46 << "Unexpected iterator range size"; 47 EXPECT_EQ(S.data(), &A[0]) << "Span data has unexpected value"; 48 for (unsigned I = 0; I != S.size(); ++I) 49 EXPECT_EQ(S[I], A[I]) << "Unexpected span element value"; 50 } 51 52 TEST(ADTTest, StringViewDefaultConstruction) { 53 string_view S; 54 EXPECT_TRUE(S.empty()) << "Default constructed span not empty"; 55 EXPECT_EQ(S.size(), 0U) << "Default constructed span size not zero"; 56 EXPECT_EQ(S.begin(), S.end()) << "Default constructed span begin != end"; 57 } 58 59 TEST(ADTTest, StringViewConstructFromCharPtrAndSize) { 60 const char *Str = "abcdefg"; 61 string_view S(Str, 5); 62 EXPECT_FALSE(S.empty()) << "string_view should be non-empty"; 63 EXPECT_EQ(S.size(), 5U) << "string_view has unexpected size"; 64 EXPECT_EQ(std::distance(S.begin(), S.end()), 5U) 65 << "Unexpected iterator range size"; 66 EXPECT_EQ(S.data(), &Str[0]) << "string_view data has unexpected value"; 67 for (unsigned I = 0; I != S.size(); ++I) 68 EXPECT_EQ(S[I], Str[I]) << "Unexpected string_view element value"; 69 } 70 71 TEST(ADTTest, StringViewConstructFromCharPtr) { 72 const char *Str = "abcdefg"; 73 size_t StrLen = strlen(Str); 74 string_view S(Str); 75 76 EXPECT_FALSE(S.empty()) << "string_view should be non-empty"; 77 EXPECT_EQ(S.size(), StrLen) << "string_view has unexpected size"; 78 EXPECT_EQ(static_cast<size_t>(std::distance(S.begin(), S.end())), StrLen) 79 << "Unexpected iterator range size"; 80 EXPECT_EQ(S.data(), &Str[0]) << "string_view data has unexpected value"; 81 for (unsigned I = 0; I != S.size(); ++I) 82 EXPECT_EQ(S[I], Str[I]) << "Unexpected string_view element value"; 83 } 84 85 TEST(ADTTest, StringViewConstructFromStdString) { 86 std::string Str("abcdefg"); 87 string_view S(Str); 88 89 EXPECT_FALSE(S.empty()) << "string_view should be non-empty"; 90 EXPECT_EQ(S.size(), Str.size()) << "string_view has unexpected size"; 91 EXPECT_EQ(static_cast<size_t>(std::distance(S.begin(), S.end())), Str.size()) 92 << "Unexpected iterator range size"; 93 EXPECT_EQ(S.data(), &Str[0]) << "string_view data has unexpected value"; 94 for (unsigned I = 0; I != S.size(); ++I) 95 EXPECT_EQ(S[I], Str[I]) << "Unexpected string_view element value"; 96 } 97 98 TEST(ADTTest, StringViewCopyConstructionAndAssignment) { 99 // Check that string_views are copy-constructible and copy-assignable. 100 std::string Str("abcdefg"); 101 string_view Orig(Str); 102 string_view CopyConstructed(Orig); 103 string_view CopyAssigned = Orig; 104 105 EXPECT_EQ(Orig, CopyConstructed); 106 EXPECT_EQ(Orig, CopyAssigned); 107 } 108 109 TEST(ADTTest, StringViewEquality) { 110 EXPECT_EQ("", string_view()); 111 EXPECT_FALSE(string_view("aab") == string_view("aac")); 112 EXPECT_FALSE(string_view("aab") != string_view("aab")); 113 EXPECT_NE(string_view("aab"), string_view("aac")); 114 } 115 116 TEST(ADTTest, StringViewOStreamOperator) { 117 std::string Str("abcdefg"); 118 string_view S(Str); 119 std::ostringstream OSS; 120 OSS << S; 121 122 EXPECT_EQ(OSS.str(), Str); 123 } 124 125 TEST(ADTTest, StringViewHashable) { 126 std::string Str("abcdefg"); 127 string_view S(Str); 128 129 EXPECT_EQ(std::hash<std::string>()(Str), std::hash<string_view>()(S)); 130 } 131