1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include <gtest/gtest.h> 17 18 #include <base/containers/array_view.h> 19 #include <base/containers/string.h> 20 21 using namespace BASE_NS; 22 using namespace testing::ext; 23 24 class ArrayViewTest : public testing::Test { 25 public: SetUpTestSuite()26 static void SetUpTestSuite() {} TearDownTestSuite()27 static void TearDownTestSuite() {} SetUp()28 void SetUp() override {} TearDown()29 void TearDown() override {} 30 }; 31 32 HWTEST_F(ArrayViewTest, empty, TestSize.Level1) 33 { 34 BASE_NS::array_view<int> intAv({}); 35 ASSERT_TRUE(intAv.size() == 0); 36 ASSERT_TRUE(intAv.size_bytes() == 0); 37 ASSERT_TRUE(intAv.empty()); 38 39 BASE_NS::array_view<bool> boolAv({}); 40 ASSERT_TRUE(boolAv.size() == 0); 41 ASSERT_TRUE(boolAv.size_bytes() == 0); 42 ASSERT_TRUE(boolAv.empty()); 43 44 BASE_NS::array_view<uint32_t> uintAv({}); 45 ASSERT_TRUE(uintAv.size() == 0); 46 ASSERT_TRUE(uintAv.size_bytes() == 0); 47 ASSERT_TRUE(uintAv.empty()); 48 49 BASE_NS::array_view<char> charAv({}); 50 ASSERT_TRUE(charAv.size() == 0); 51 ASSERT_TRUE(charAv.size_bytes() == 0); 52 ASSERT_TRUE(charAv.empty()); 53 54 BASE_NS::array_view<int*> pAv({}); 55 ASSERT_TRUE(pAv.size() == 0); 56 ASSERT_TRUE(pAv.size_bytes() == 0); 57 ASSERT_TRUE(pAv.empty()); 58 59 BASE_NS::array_view<array_view<int>> avAv({}); 60 ASSERT_TRUE(avAv.size() == 0); 61 ASSERT_TRUE(avAv.size_bytes() == 0); 62 ASSERT_TRUE(avAv.empty()); 63 } 64 65 HWTEST_F(ArrayViewTest, dataAccess, TestSize.Level1) 66 { 67 int intData[] = { 3, 2, 1, 0 }; 68 BASE_NS::array_view<int> intAv(intData); 69 ASSERT_TRUE(intAv.size() == 4); 70 ASSERT_TRUE(intAv.size_bytes() == 4 * sizeof(int)); 71 ASSERT_FALSE(intAv.empty()); 72 73 ASSERT_TRUE(intAv.data() == intData); 74 ASSERT_TRUE(*intAv.begin() == intData[0]); 75 ASSERT_TRUE(*intAv.cbegin() == intData[0]); 76 ASSERT_TRUE(intAv[1] == intData[1]); 77 ASSERT_TRUE(intAv.at(2) == intData[2]); 78 ASSERT_TRUE(*(intAv.end() - 1) == intData[3]); 79 ASSERT_TRUE(*(intAv.cend() - 1) == intData[3]); 80 81 const BASE_NS::array_view<int> cintAv(intData); 82 83 ASSERT_TRUE(cintAv.size() == 4); 84 ASSERT_TRUE(cintAv.size_bytes() == 4 * sizeof(int)); 85 ASSERT_FALSE(cintAv.empty()); 86 87 ASSERT_TRUE(cintAv.data() == intData); 88 ASSERT_TRUE(*cintAv.begin() == intData[0]); 89 ASSERT_TRUE(*cintAv.cbegin() == intData[0]); 90 ASSERT_TRUE(cintAv[1] == intData[1]); 91 ASSERT_TRUE(cintAv.at(2) == intData[2]); 92 ASSERT_TRUE(*(cintAv.end() - 1) == intData[3]); 93 ASSERT_TRUE(*(cintAv.cend() - 1) == intData[3]); 94 95 bool boolData[] = { true, false }; 96 BASE_NS::array_view<bool> boolAv(boolData); 97 ASSERT_TRUE(boolAv.size() == 2); 98 ASSERT_TRUE(boolAv.size_bytes() == 2 * sizeof(bool)); 99 ASSERT_FALSE(boolAv.empty()); 100 101 ASSERT_TRUE(boolAv[0] == boolData[0]); 102 ASSERT_TRUE(boolAv[1] == boolData[1]); 103 } 104 105 HWTEST_F(ArrayViewTest, constructors001, TestSize.Level1) 106 { 107 int intData[] = { 3, 2, 1, 0 }; 108 { 109 BASE_NS::array_view<int> intAv = BASE_NS::array_view<int>(); 110 ASSERT_TRUE(intAv.size() == 0); 111 ASSERT_TRUE(intAv.empty()); 112 } 113 { 114 BASE_NS::array_view<int> intAv = BASE_NS::array_view<int>(intData); 115 ASSERT_TRUE(intAv.size() == 4); 116 ASSERT_TRUE(intAv[0] == intData[0]); 117 ASSERT_TRUE(intAv[1] == intData[1]); 118 ASSERT_TRUE(intAv[2] == intData[2]); 119 ASSERT_TRUE(intAv[3] == intData[3]); 120 } 121 { 122 BASE_NS::array_view<int> intAv = BASE_NS::array_view<int>(&intData[0], &intData[3]); 123 ASSERT_TRUE(intAv.size() == 3); 124 ASSERT_TRUE(intAv[0] == intData[0]); 125 ASSERT_TRUE(intAv[1] == intData[1]); 126 ASSERT_TRUE(intAv[2] == intData[2]); 127 } 128 { 129 BASE_NS::array_view<int> intAv = BASE_NS::array_view<int>(&intData[0], 4); 130 ASSERT_TRUE(intAv.size() == 4); 131 ASSERT_TRUE(intAv[0] == intData[0]); 132 ASSERT_TRUE(intAv[1] == intData[1]); 133 ASSERT_TRUE(intAv[2] == intData[2]); 134 ASSERT_TRUE(intAv[3] == intData[3]); 135 } 136 } 137 138 HWTEST_F(ArrayViewTest, constructors002, TestSize.Level1) 139 { 140 int intData[] = { 3, 2, 1, 0 }; 141 { 142 BASE_NS::array_view<int> intAv = BASE_NS::array_view<int>(intData); 143 BASE_NS::array_view<int> intAv2 = BASE_NS::array_view<int>(intAv); 144 ASSERT_TRUE(intAv2.size() == 4); 145 ASSERT_TRUE(intAv2[0] == intData[0]); 146 ASSERT_TRUE(intAv2[1] == intData[1]); 147 ASSERT_TRUE(intAv2[2] == intData[2]); 148 ASSERT_TRUE(intAv2[3] == intData[3]); 149 } 150 { 151 const BASE_NS::array_view<int> intAv = BASE_NS::array_view<int>(intData); 152 BASE_NS::array_view<const int> intAv2 = BASE_NS::array_view<const int>(intAv); 153 ASSERT_TRUE(intAv2.size() == 4); 154 ASSERT_TRUE(intAv2[0] == intData[0]); 155 ASSERT_TRUE(intAv2[1] == intData[1]); 156 ASSERT_TRUE(intAv2[2] == intData[2]); 157 ASSERT_TRUE(intAv2[3] == intData[3]); 158 } 159 { 160 BASE_NS::array_view<int> intAv = BASE_NS::arrayview<int, 4>(intData); 161 ASSERT_TRUE(intAv.size() == 4); 162 ASSERT_TRUE(intAv[0] == intData[0]); 163 ASSERT_TRUE(intAv[1] == intData[1]); 164 ASSERT_TRUE(intAv[2] == intData[2]); 165 ASSERT_TRUE(intAv[3] == intData[3]); 166 } 167 } 168 169 HWTEST_F(ArrayViewTest, constructors003, TestSize.Level1) 170 { 171 { 172 uint8_t* uint8Data = new uint8_t[4](); 173 uint8Data[0] = 3; 174 uint8Data[1] = 2; 175 uint8Data[2] = 1; 176 uint8Data[3] = 0; 177 BASE_NS::array_view<const uint8_t> uintAv = BASE_NS::arrayviewU8<uint8_t>(*uint8Data); 178 ASSERT_TRUE(uintAv.size() == 1); // pointer size is 1 -> data is the same but size is always 1 179 ASSERT_TRUE(uintAv[0] == uint8Data[0]); 180 delete[] uint8Data; 181 } 182 { 183 uint8_t uint8Data[4] = { 3, 2, 1, 0 }; 184 BASE_NS::array_view<const uint8_t> uintAv = BASE_NS::arrayviewU8<uint8_t>(*uint8Data); 185 ASSERT_TRUE(uintAv.size() == 1); // pointer size is 1 -> data is the same but size is always 1 186 ASSERT_TRUE(uintAv[0] == uint8Data[0]); 187 } 188 { 189 uint8_t uint8Data[4] = { 3, 2, 1, 0 }; 190 BASE_NS::array_view<const uint8_t> uintAv = BASE_NS::arrayviewU8(uint8Data); 191 ASSERT_TRUE(uintAv.size() == 4); // array as input 192 ASSERT_TRUE(uintAv[0] == uint8Data[0]); 193 ASSERT_TRUE(uintAv[1] == uint8Data[1]); 194 ASSERT_TRUE(uintAv[2] == uint8Data[2]); 195 ASSERT_TRUE(uintAv[3] == uint8Data[3]); 196 } 197 { __anon517a075b0102(BASE_NS::array_view<const int> intAv) 198 auto fun = [](BASE_NS::array_view<const int> intAv) { 199 ASSERT_TRUE(intAv.size() == 4); 200 ASSERT_TRUE(intAv[0] == 3); 201 ASSERT_TRUE(intAv[1] == 2); 202 ASSERT_TRUE(intAv[2] == 1); 203 ASSERT_TRUE(intAv[3] == 0); 204 }; 205 fun((BASE_NS::array_view<const int>){ 3, 2, 1, 0 }); 206 } 207 { __anon517a075b0202(BASE_NS::array_view<const BASE_NS::string> stringAv) 208 auto fun = [](BASE_NS::array_view<const BASE_NS::string> stringAv) { 209 ASSERT_TRUE(stringAv.size() == 2); 210 ASSERT_TRUE(stringAv[0] == "foo"); 211 ASSERT_TRUE(stringAv[1] == "A really, really, really long string."); 212 }; 213 fun((BASE_NS::array_view<const BASE_NS::string>) { 214 BASE_NS::string("foo"), BASE_NS::string("A really, really, really long string.")}); 215 } 216 } 217 218 HWTEST_F(ArrayViewTest, hash, TestSize.Level1) 219 { 220 static constexpr const int data[] = { 1, 2, 3, 4 }; 221 auto h1 = FNV1aHash(data); 222 auto h2 = hash(array_view(data)); 223 EXPECT_EQ(h1, h2); 224 }