12a7ed8fcSSiva Chandra Reddy //===-- Unittests for ArrayRef --------------------------------------------===//
22a7ed8fcSSiva Chandra Reddy //
32a7ed8fcSSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42a7ed8fcSSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
52a7ed8fcSSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62a7ed8fcSSiva Chandra Reddy //
72a7ed8fcSSiva Chandra Reddy //===----------------------------------------------------------------------===//
82a7ed8fcSSiva Chandra Reddy
92a7ed8fcSSiva Chandra Reddy #include "src/__support/CPP/ArrayRef.h"
102a7ed8fcSSiva Chandra Reddy #include "utils/UnitTest/Test.h"
112a7ed8fcSSiva Chandra Reddy
122a7ed8fcSSiva Chandra Reddy namespace __llvm_libc {
132a7ed8fcSSiva Chandra Reddy namespace cpp {
142a7ed8fcSSiva Chandra Reddy
152a7ed8fcSSiva Chandra Reddy // The following tests run on both 'ArrayRef' and 'MutableArrayRef'.
162a7ed8fcSSiva Chandra Reddy using Types = testing::TypeList<ArrayRef<int>, MutableArrayRef<int>>;
172a7ed8fcSSiva Chandra Reddy
TYPED_TEST(LlvmLibcArrayRefTest,ConstructFromElement,Types)182a7ed8fcSSiva Chandra Reddy TYPED_TEST(LlvmLibcArrayRefTest, ConstructFromElement, Types) {
192a7ed8fcSSiva Chandra Reddy using value_type = typename ParamType::value_type;
202a7ed8fcSSiva Chandra Reddy using const_pointer = typename ParamType::const_pointer;
212a7ed8fcSSiva Chandra Reddy value_type element = 5;
222a7ed8fcSSiva Chandra Reddy ParamType arrayref(element);
232a7ed8fcSSiva Chandra Reddy EXPECT_FALSE(arrayref.empty());
242a7ed8fcSSiva Chandra Reddy EXPECT_EQ(arrayref.size(), size_t(1));
252a7ed8fcSSiva Chandra Reddy EXPECT_EQ(arrayref[0], 5);
262a7ed8fcSSiva Chandra Reddy EXPECT_EQ((const_pointer)arrayref.data(), (const_pointer)&element);
272a7ed8fcSSiva Chandra Reddy }
282a7ed8fcSSiva Chandra Reddy
TYPED_TEST(LlvmLibcArrayRefTest,ConstructFromPointerAndSize,Types)292a7ed8fcSSiva Chandra Reddy TYPED_TEST(LlvmLibcArrayRefTest, ConstructFromPointerAndSize, Types) {
302a7ed8fcSSiva Chandra Reddy using value_type = typename ParamType::value_type;
312a7ed8fcSSiva Chandra Reddy using const_pointer = typename ParamType::const_pointer;
322a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2};
332a7ed8fcSSiva Chandra Reddy ParamType arrayref(values, 2);
342a7ed8fcSSiva Chandra Reddy EXPECT_FALSE(arrayref.empty());
352a7ed8fcSSiva Chandra Reddy EXPECT_EQ(arrayref.size(), size_t(2));
362a7ed8fcSSiva Chandra Reddy EXPECT_EQ(arrayref[0], 1);
372a7ed8fcSSiva Chandra Reddy EXPECT_EQ(arrayref[1], 2);
382a7ed8fcSSiva Chandra Reddy EXPECT_EQ((const_pointer)arrayref.data(), (const_pointer)values);
392a7ed8fcSSiva Chandra Reddy }
402a7ed8fcSSiva Chandra Reddy
TYPED_TEST(LlvmLibcArrayRefTest,ConstructFromIterator,Types)412a7ed8fcSSiva Chandra Reddy TYPED_TEST(LlvmLibcArrayRefTest, ConstructFromIterator, Types) {
422a7ed8fcSSiva Chandra Reddy using value_type = typename ParamType::value_type;
432a7ed8fcSSiva Chandra Reddy using const_pointer = typename ParamType::const_pointer;
442a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2};
452a7ed8fcSSiva Chandra Reddy ParamType arrayref(&values[0], &values[2]);
462a7ed8fcSSiva Chandra Reddy EXPECT_FALSE(arrayref.empty());
472a7ed8fcSSiva Chandra Reddy EXPECT_EQ(arrayref.size(), size_t(2));
482a7ed8fcSSiva Chandra Reddy EXPECT_EQ(arrayref[0], 1);
492a7ed8fcSSiva Chandra Reddy EXPECT_EQ(arrayref[1], 2);
502a7ed8fcSSiva Chandra Reddy EXPECT_EQ((const_pointer)arrayref.data(), (const_pointer)&values[0]);
512a7ed8fcSSiva Chandra Reddy }
522a7ed8fcSSiva Chandra Reddy
TYPED_TEST(LlvmLibcArrayRefTest,ConstructFromCArray,Types)532a7ed8fcSSiva Chandra Reddy TYPED_TEST(LlvmLibcArrayRefTest, ConstructFromCArray, Types) {
542a7ed8fcSSiva Chandra Reddy using value_type = typename ParamType::value_type;
552a7ed8fcSSiva Chandra Reddy using const_pointer = typename ParamType::const_pointer;
562a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2};
572a7ed8fcSSiva Chandra Reddy ParamType arrayref(values);
582a7ed8fcSSiva Chandra Reddy EXPECT_FALSE(arrayref.empty());
592a7ed8fcSSiva Chandra Reddy EXPECT_EQ(arrayref.size(), size_t(2));
602a7ed8fcSSiva Chandra Reddy EXPECT_EQ(arrayref[0], 1);
612a7ed8fcSSiva Chandra Reddy EXPECT_EQ(arrayref[1], 2);
622a7ed8fcSSiva Chandra Reddy EXPECT_EQ((const_pointer)arrayref.data(), (const_pointer)values);
632a7ed8fcSSiva Chandra Reddy }
642a7ed8fcSSiva Chandra Reddy
TYPED_TEST(LlvmLibcArrayRefTest,ConstructFromLibcArray,Types)652a7ed8fcSSiva Chandra Reddy TYPED_TEST(LlvmLibcArrayRefTest, ConstructFromLibcArray, Types) {
662a7ed8fcSSiva Chandra Reddy using value_type = typename ParamType::value_type;
672a7ed8fcSSiva Chandra Reddy using const_pointer = typename ParamType::const_pointer;
682a7ed8fcSSiva Chandra Reddy Array<value_type, 2> values = {1, 2};
692a7ed8fcSSiva Chandra Reddy ParamType arrayref(values);
702a7ed8fcSSiva Chandra Reddy EXPECT_FALSE(arrayref.empty());
712a7ed8fcSSiva Chandra Reddy EXPECT_EQ(arrayref.size(), size_t(2));
722a7ed8fcSSiva Chandra Reddy EXPECT_EQ(arrayref[0], 1);
732a7ed8fcSSiva Chandra Reddy EXPECT_EQ(arrayref[1], 2);
742a7ed8fcSSiva Chandra Reddy EXPECT_EQ((const_pointer)arrayref.data(), (const_pointer)values.data());
752a7ed8fcSSiva Chandra Reddy }
762a7ed8fcSSiva Chandra Reddy
TYPED_TEST(LlvmLibcArrayRefTest,Equals,Types)772a7ed8fcSSiva Chandra Reddy TYPED_TEST(LlvmLibcArrayRefTest, Equals, Types) {
782a7ed8fcSSiva Chandra Reddy using value_type = typename ParamType::value_type;
792a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2, 3};
802a7ed8fcSSiva Chandra Reddy ParamType initial(values);
812a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(initial.equals(initial));
822a7ed8fcSSiva Chandra Reddy ParamType shallow_copy(values);
832a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(initial.equals(shallow_copy));
842a7ed8fcSSiva Chandra Reddy value_type same_values[] = {1, 2, 3};
852a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(initial.equals(same_values));
862a7ed8fcSSiva Chandra Reddy value_type different_values[] = {1, 2, 4};
872a7ed8fcSSiva Chandra Reddy EXPECT_FALSE(initial.equals(different_values));
882a7ed8fcSSiva Chandra Reddy }
892a7ed8fcSSiva Chandra Reddy
TYPED_TEST(LlvmLibcArrayRefTest,SliceUnary,Types)902a7ed8fcSSiva Chandra Reddy TYPED_TEST(LlvmLibcArrayRefTest, SliceUnary, Types) {
912a7ed8fcSSiva Chandra Reddy using value_type = typename ParamType::value_type;
922a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2, 3};
932a7ed8fcSSiva Chandra Reddy ParamType arrayref(values);
942a7ed8fcSSiva Chandra Reddy {
952a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2, 3};
962a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.slice(0).equals(values));
972a7ed8fcSSiva Chandra Reddy }
982a7ed8fcSSiva Chandra Reddy {
992a7ed8fcSSiva Chandra Reddy value_type values[] = {2, 3};
1002a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.slice(1).equals(values));
1012a7ed8fcSSiva Chandra Reddy }
1022a7ed8fcSSiva Chandra Reddy {
1032a7ed8fcSSiva Chandra Reddy value_type values[] = {3};
1042a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.slice(2).equals(values));
1052a7ed8fcSSiva Chandra Reddy }
1062a7ed8fcSSiva Chandra Reddy { EXPECT_TRUE(arrayref.slice(3).empty()); }
1072a7ed8fcSSiva Chandra Reddy }
1082a7ed8fcSSiva Chandra Reddy
TYPED_TEST(LlvmLibcArrayRefTest,SliceBinary,Types)1092a7ed8fcSSiva Chandra Reddy TYPED_TEST(LlvmLibcArrayRefTest, SliceBinary, Types) {
1102a7ed8fcSSiva Chandra Reddy using value_type = typename ParamType::value_type;
1112a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2, 3};
1122a7ed8fcSSiva Chandra Reddy ParamType arrayref(values);
1132a7ed8fcSSiva Chandra Reddy {
1142a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.slice(0, 0).empty());
1152a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.slice(1, 0).empty());
1162a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.slice(2, 0).empty());
1172a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.slice(3, 0).empty());
1182a7ed8fcSSiva Chandra Reddy }
1192a7ed8fcSSiva Chandra Reddy {
1202a7ed8fcSSiva Chandra Reddy value_type values[] = {1};
1212a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.slice(0, 1).equals(values));
1222a7ed8fcSSiva Chandra Reddy }
1232a7ed8fcSSiva Chandra Reddy {
1242a7ed8fcSSiva Chandra Reddy value_type values[] = {2};
1252a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.slice(1, 1).equals(values));
1262a7ed8fcSSiva Chandra Reddy }
1272a7ed8fcSSiva Chandra Reddy {
1282a7ed8fcSSiva Chandra Reddy value_type values[] = {3};
1292a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.slice(2, 1).equals(values));
1302a7ed8fcSSiva Chandra Reddy }
1312a7ed8fcSSiva Chandra Reddy {
1322a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2};
1332a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.slice(0, 2).equals(values));
1342a7ed8fcSSiva Chandra Reddy }
1352a7ed8fcSSiva Chandra Reddy {
1362a7ed8fcSSiva Chandra Reddy value_type values[] = {2, 3};
1372a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.slice(1, 2).equals(values));
1382a7ed8fcSSiva Chandra Reddy }
1392a7ed8fcSSiva Chandra Reddy {
1402a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2, 3};
1412a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.slice(0, 3).equals(values));
1422a7ed8fcSSiva Chandra Reddy }
1432a7ed8fcSSiva Chandra Reddy }
1442a7ed8fcSSiva Chandra Reddy
TYPED_TEST(LlvmLibcArrayRefTest,DropFront,Types)1452a7ed8fcSSiva Chandra Reddy TYPED_TEST(LlvmLibcArrayRefTest, DropFront, Types) {
1462a7ed8fcSSiva Chandra Reddy using value_type = typename ParamType::value_type;
1472a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2, 3};
1482a7ed8fcSSiva Chandra Reddy ParamType arrayref(values);
1492a7ed8fcSSiva Chandra Reddy {
1502a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2, 3};
1512a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.drop_front(0).equals(values));
1522a7ed8fcSSiva Chandra Reddy }
1532a7ed8fcSSiva Chandra Reddy {
1542a7ed8fcSSiva Chandra Reddy value_type values[] = {2, 3};
1552a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.drop_front(1).equals(values));
1562a7ed8fcSSiva Chandra Reddy }
1572a7ed8fcSSiva Chandra Reddy {
1582a7ed8fcSSiva Chandra Reddy value_type values[] = {3};
1592a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.drop_front(2).equals(values));
1602a7ed8fcSSiva Chandra Reddy }
1612a7ed8fcSSiva Chandra Reddy { EXPECT_TRUE(arrayref.drop_front(3).empty()); }
1622a7ed8fcSSiva Chandra Reddy }
1632a7ed8fcSSiva Chandra Reddy
TYPED_TEST(LlvmLibcArrayRefTest,DropBack,Types)1642a7ed8fcSSiva Chandra Reddy TYPED_TEST(LlvmLibcArrayRefTest, DropBack, Types) {
1652a7ed8fcSSiva Chandra Reddy using value_type = typename ParamType::value_type;
1662a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2, 3};
1672a7ed8fcSSiva Chandra Reddy ParamType arrayref(values);
1682a7ed8fcSSiva Chandra Reddy {
1692a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2, 3};
1702a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.drop_back(0).equals(values));
1712a7ed8fcSSiva Chandra Reddy }
1722a7ed8fcSSiva Chandra Reddy {
1732a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2};
1742a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.drop_back(1).equals(values));
1752a7ed8fcSSiva Chandra Reddy }
1762a7ed8fcSSiva Chandra Reddy {
1772a7ed8fcSSiva Chandra Reddy value_type values[] = {1};
1782a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.drop_back(2).equals(values));
1792a7ed8fcSSiva Chandra Reddy }
1802a7ed8fcSSiva Chandra Reddy { EXPECT_TRUE(arrayref.drop_back(3).empty()); }
1812a7ed8fcSSiva Chandra Reddy }
1822a7ed8fcSSiva Chandra Reddy
TYPED_TEST(LlvmLibcArrayRefTest,TakeFront,Types)1832a7ed8fcSSiva Chandra Reddy TYPED_TEST(LlvmLibcArrayRefTest, TakeFront, Types) {
1842a7ed8fcSSiva Chandra Reddy using value_type = typename ParamType::value_type;
1852a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2, 3};
1862a7ed8fcSSiva Chandra Reddy ParamType arrayref(values);
1872a7ed8fcSSiva Chandra Reddy { EXPECT_TRUE(arrayref.take_front(0).empty()); }
1882a7ed8fcSSiva Chandra Reddy {
1892a7ed8fcSSiva Chandra Reddy value_type values[] = {1};
1902a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.take_front(1).equals(values));
1912a7ed8fcSSiva Chandra Reddy }
1922a7ed8fcSSiva Chandra Reddy {
1932a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2};
1942a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.take_front(2).equals(values));
1952a7ed8fcSSiva Chandra Reddy }
1962a7ed8fcSSiva Chandra Reddy {
1972a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2, 3};
1982a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.take_front(3).equals(values));
1992a7ed8fcSSiva Chandra Reddy }
2002a7ed8fcSSiva Chandra Reddy }
2012a7ed8fcSSiva Chandra Reddy
TYPED_TEST(LlvmLibcArrayRefTest,TakeBack,Types)2022a7ed8fcSSiva Chandra Reddy TYPED_TEST(LlvmLibcArrayRefTest, TakeBack, Types) {
2032a7ed8fcSSiva Chandra Reddy using value_type = typename ParamType::value_type;
2042a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2, 3};
2052a7ed8fcSSiva Chandra Reddy ParamType arrayref(values);
2062a7ed8fcSSiva Chandra Reddy { EXPECT_TRUE(arrayref.take_back(0).empty()); }
2072a7ed8fcSSiva Chandra Reddy {
2082a7ed8fcSSiva Chandra Reddy value_type values[] = {3};
2092a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.take_back(1).equals(values));
2102a7ed8fcSSiva Chandra Reddy }
2112a7ed8fcSSiva Chandra Reddy {
2122a7ed8fcSSiva Chandra Reddy value_type values[] = {2, 3};
2132a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.take_back(2).equals(values));
2142a7ed8fcSSiva Chandra Reddy }
2152a7ed8fcSSiva Chandra Reddy {
2162a7ed8fcSSiva Chandra Reddy value_type values[] = {1, 2, 3};
2172a7ed8fcSSiva Chandra Reddy EXPECT_TRUE(arrayref.take_back(3).equals(values));
2182a7ed8fcSSiva Chandra Reddy }
2192a7ed8fcSSiva Chandra Reddy }
2202a7ed8fcSSiva Chandra Reddy
TEST(LlvmLibcArrayRefTest,ConstructFromVoidPtr)221*19b4e9d7SSiva Chandra Reddy TEST(LlvmLibcArrayRefTest, ConstructFromVoidPtr) {
222*19b4e9d7SSiva Chandra Reddy unsigned data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
223*19b4e9d7SSiva Chandra Reddy void *ptr = data;
224*19b4e9d7SSiva Chandra Reddy const void *const_ptr = data;
225*19b4e9d7SSiva Chandra Reddy ArrayRef<unsigned> ref(const_ptr, sizeof(data));
226*19b4e9d7SSiva Chandra Reddy MutableArrayRef<unsigned> mutable_ref(ptr, sizeof(data));
227*19b4e9d7SSiva Chandra Reddy ASSERT_EQ(ref.size(), sizeof(data) / sizeof(unsigned));
228*19b4e9d7SSiva Chandra Reddy ASSERT_EQ(mutable_ref.size(), sizeof(data) / sizeof(unsigned));
229*19b4e9d7SSiva Chandra Reddy
230*19b4e9d7SSiva Chandra Reddy unsigned val = 123;
231*19b4e9d7SSiva Chandra Reddy for (size_t i = 0; i < sizeof(data) / sizeof(unsigned); ++i)
232*19b4e9d7SSiva Chandra Reddy mutable_ref[i] = val;
233*19b4e9d7SSiva Chandra Reddy
234*19b4e9d7SSiva Chandra Reddy for (size_t i = 0; i < sizeof(data) / sizeof(unsigned); ++i)
235*19b4e9d7SSiva Chandra Reddy ASSERT_EQ(ref[i], val);
236*19b4e9d7SSiva Chandra Reddy }
237*19b4e9d7SSiva Chandra Reddy
2382a7ed8fcSSiva Chandra Reddy } // namespace cpp
2392a7ed8fcSSiva Chandra Reddy } // namespace __llvm_libc
240