xref: /llvm-project/compiler-rt/lib/sanitizer_common/tests/sanitizer_array_ref_test.cpp (revision a37bd137447b7af02d49fc66423846c3fc5c28bf)
1f35d0608SVitaly Buka //===- sanitizer_array_ref.cpp - ArrayRef unit tests ----------------------===//
2f35d0608SVitaly Buka //
3f35d0608SVitaly Buka // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f35d0608SVitaly Buka // See https://llvm.org/LICENSE.txt for license information.
5f35d0608SVitaly Buka // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f35d0608SVitaly Buka //
7f35d0608SVitaly Buka //===----------------------------------------------------------------------===//
8f35d0608SVitaly Buka 
9f35d0608SVitaly Buka #include "sanitizer_common/sanitizer_array_ref.h"
10f35d0608SVitaly Buka 
11f35d0608SVitaly Buka #include <vector>
12f35d0608SVitaly Buka 
13f35d0608SVitaly Buka #include "gtest/gtest.h"
14f35d0608SVitaly Buka #include "sanitizer_internal_defs.h"
15f35d0608SVitaly Buka 
16f35d0608SVitaly Buka using namespace __sanitizer;
17f35d0608SVitaly Buka namespace {
18f35d0608SVitaly Buka 
TEST(ArrayRefTest,Constructors)19f35d0608SVitaly Buka TEST(ArrayRefTest, Constructors) {
20f35d0608SVitaly Buka   ArrayRef<int> ar0;
21f35d0608SVitaly Buka   EXPECT_TRUE(ar0.empty());
22f35d0608SVitaly Buka   EXPECT_EQ(ar0.size(), 0u);
23f35d0608SVitaly Buka 
24f35d0608SVitaly Buka   static const int kTheNumbers[] = {4, 8, 15, 16, 23, 42};
25f35d0608SVitaly Buka   ArrayRef<int> ar1(kTheNumbers);
26f35d0608SVitaly Buka   EXPECT_FALSE(ar1.empty());
27f35d0608SVitaly Buka   EXPECT_EQ(ar1.size(), ARRAY_SIZE(kTheNumbers));
28f35d0608SVitaly Buka 
29f35d0608SVitaly Buka   ArrayRef<int> ar2(&kTheNumbers[0], &kTheNumbers[2]);
30f35d0608SVitaly Buka   EXPECT_FALSE(ar2.empty());
31f35d0608SVitaly Buka   EXPECT_EQ(ar2.size(), 2u);
32f35d0608SVitaly Buka 
33f35d0608SVitaly Buka   ArrayRef<int> ar3(&kTheNumbers[0], 3);
34f35d0608SVitaly Buka   EXPECT_FALSE(ar3.empty());
35f35d0608SVitaly Buka   EXPECT_EQ(ar3.size(), 3u);
36f35d0608SVitaly Buka 
37f35d0608SVitaly Buka   std::vector<int> v(4, 1);
38f35d0608SVitaly Buka   ArrayRef<int> ar4(v);
39f35d0608SVitaly Buka   EXPECT_FALSE(ar4.empty());
40f35d0608SVitaly Buka   EXPECT_EQ(ar4.size(), 4u);
41f35d0608SVitaly Buka 
42f35d0608SVitaly Buka   int n;
43f35d0608SVitaly Buka   ArrayRef<int> ar5(n);
44f35d0608SVitaly Buka   EXPECT_FALSE(ar5.empty());
45f35d0608SVitaly Buka   EXPECT_EQ(ar5.size(), 1u);
46f35d0608SVitaly Buka }
47f35d0608SVitaly Buka 
TEST(ArrayRefTest,DropBack)48f35d0608SVitaly Buka TEST(ArrayRefTest, DropBack) {
49f35d0608SVitaly Buka   static const int kTheNumbers[] = {4, 8, 15, 16, 23, 42};
50f35d0608SVitaly Buka   ArrayRef<int> ar1(kTheNumbers);
51f35d0608SVitaly Buka   ArrayRef<int> ar2(kTheNumbers, ar1.size() - 1);
52f35d0608SVitaly Buka   EXPECT_TRUE(ar1.drop_back().equals(ar2));
53f35d0608SVitaly Buka }
54f35d0608SVitaly Buka 
TEST(ArrayRefTest,DropFront)55f35d0608SVitaly Buka TEST(ArrayRefTest, DropFront) {
56f35d0608SVitaly Buka   static const int kTheNumbers[] = {4, 8, 15, 16, 23, 42};
57f35d0608SVitaly Buka   ArrayRef<int> ar1(kTheNumbers);
58f35d0608SVitaly Buka   ArrayRef<int> ar2(&kTheNumbers[2], ar1.size() - 2);
59f35d0608SVitaly Buka   EXPECT_TRUE(ar1.drop_front(2).equals(ar2));
60f35d0608SVitaly Buka }
61f35d0608SVitaly Buka 
TEST(ArrayRefTest,TakeBack)62f35d0608SVitaly Buka TEST(ArrayRefTest, TakeBack) {
63f35d0608SVitaly Buka   static const int kTheNumbers[] = {4, 8, 15, 16, 23, 42};
64f35d0608SVitaly Buka   ArrayRef<int> ar1(kTheNumbers);
65f35d0608SVitaly Buka   ArrayRef<int> ar2(ar1.end() - 1, 1);
66f35d0608SVitaly Buka   EXPECT_TRUE(ar1.take_back().equals(ar2));
67f35d0608SVitaly Buka }
68f35d0608SVitaly Buka 
TEST(ArrayRefTest,TakeFront)69f35d0608SVitaly Buka TEST(ArrayRefTest, TakeFront) {
70f35d0608SVitaly Buka   static const int kTheNumbers[] = {4, 8, 15, 16, 23, 42};
71f35d0608SVitaly Buka   ArrayRef<int> ar1(kTheNumbers);
72f35d0608SVitaly Buka   ArrayRef<int> ar2(ar1.data(), 2);
73f35d0608SVitaly Buka   EXPECT_TRUE(ar1.take_front(2).equals(ar2));
74f35d0608SVitaly Buka }
75f35d0608SVitaly Buka 
TEST(ArrayRefTest,Equals)76f35d0608SVitaly Buka TEST(ArrayRefTest, Equals) {
77f35d0608SVitaly Buka   static const int kA1[] = {1, 2, 3, 4, 5, 6, 7, 8};
78f35d0608SVitaly Buka   ArrayRef<int> ar1(kA1);
79f35d0608SVitaly Buka   EXPECT_TRUE(ar1.equals(std::vector<int>({1, 2, 3, 4, 5, 6, 7, 8})));
80f35d0608SVitaly Buka   EXPECT_FALSE(ar1.equals(std::vector<int>({8, 1, 2, 4, 5, 6, 6, 7})));
81f35d0608SVitaly Buka   EXPECT_FALSE(ar1.equals(std::vector<int>({2, 4, 5, 6, 6, 7, 8, 1})));
82f35d0608SVitaly Buka   EXPECT_FALSE(ar1.equals(std::vector<int>({0, 1, 2, 4, 5, 6, 6, 7})));
83f35d0608SVitaly Buka   EXPECT_FALSE(ar1.equals(std::vector<int>({1, 2, 42, 4, 5, 6, 7, 8})));
84f35d0608SVitaly Buka   EXPECT_FALSE(ar1.equals(std::vector<int>({42, 2, 3, 4, 5, 6, 7, 8})));
85f35d0608SVitaly Buka   EXPECT_FALSE(ar1.equals(std::vector<int>({1, 2, 3, 4, 5, 6, 7, 42})));
86f35d0608SVitaly Buka   EXPECT_FALSE(ar1.equals(std::vector<int>({1, 2, 3, 4, 5, 6, 7})));
87f35d0608SVitaly Buka   EXPECT_FALSE(ar1.equals(std::vector<int>({1, 2, 3, 4, 5, 6, 7, 8, 9})));
88f35d0608SVitaly Buka 
89f35d0608SVitaly Buka   ArrayRef<int> ar1_a = ar1.drop_back();
90f35d0608SVitaly Buka   EXPECT_TRUE(ar1_a.equals(std::vector<int>({1, 2, 3, 4, 5, 6, 7})));
91f35d0608SVitaly Buka   EXPECT_FALSE(ar1_a.equals(std::vector<int>({1, 2, 3, 4, 5, 6, 7, 8})));
92f35d0608SVitaly Buka 
93f35d0608SVitaly Buka   ArrayRef<int> ar1_b = ar1_a.slice(2, 4);
94f35d0608SVitaly Buka   EXPECT_TRUE(ar1_b.equals(std::vector<int>({3, 4, 5, 6})));
95f35d0608SVitaly Buka   EXPECT_FALSE(ar1_b.equals(std::vector<int>({2, 3, 4, 5, 6})));
96f35d0608SVitaly Buka   EXPECT_FALSE(ar1_b.equals(std::vector<int>({3, 4, 5, 6, 7})));
97f35d0608SVitaly Buka }
98f35d0608SVitaly Buka 
TEST(ArrayRefTest,EmptyEquals)99f35d0608SVitaly Buka TEST(ArrayRefTest, EmptyEquals) {
100f35d0608SVitaly Buka   EXPECT_TRUE(ArrayRef<unsigned>() == ArrayRef<unsigned>());
101f35d0608SVitaly Buka }
102f35d0608SVitaly Buka 
TEST(ArrayRefTest,ConstConvert)103f35d0608SVitaly Buka TEST(ArrayRefTest, ConstConvert) {
104f35d0608SVitaly Buka   int buf[4];
105f35d0608SVitaly Buka   for (int i = 0; i < 4; ++i) buf[i] = i;
106f35d0608SVitaly Buka 
107f35d0608SVitaly Buka   static int *ptrs[] = {&buf[0], &buf[1], &buf[2], &buf[3]};
108f35d0608SVitaly Buka   ArrayRef<const int *> a((ArrayRef<int *>(ptrs)));
109f35d0608SVitaly Buka   a = ArrayRef<int *>(ptrs);
110f35d0608SVitaly Buka }
111f35d0608SVitaly Buka 
TEST(ArrayRefTest,ArrayRef)112f35d0608SVitaly Buka TEST(ArrayRefTest, ArrayRef) {
113f35d0608SVitaly Buka   static const int kA1[] = {1, 2, 3, 4, 5, 6, 7, 8};
114f35d0608SVitaly Buka 
115f35d0608SVitaly Buka   // A copy is expected for non-const ArrayRef (thin copy)
116f35d0608SVitaly Buka   ArrayRef<int> ar1(kA1);
1175360258bSVitaly Buka   const ArrayRef<int> &ar1_ref = ArrayRef<int>(ar1);
118f35d0608SVitaly Buka   EXPECT_NE(&ar1, &ar1_ref);
119f35d0608SVitaly Buka   EXPECT_TRUE(ar1.equals(ar1_ref));
120f35d0608SVitaly Buka 
121f35d0608SVitaly Buka   // A copy is expected for non-const ArrayRef (thin copy)
122f35d0608SVitaly Buka   const ArrayRef<int> ar2(kA1);
123*a37bd137SVitaly Buka   const ArrayRef<int> &ar2_ref = ArrayRef<int>(ar2);
124f35d0608SVitaly Buka   EXPECT_NE(&ar2_ref, &ar2);
125f35d0608SVitaly Buka   EXPECT_TRUE(ar2.equals(ar2_ref));
126f35d0608SVitaly Buka }
127f35d0608SVitaly Buka 
128f35d0608SVitaly Buka static_assert(std::is_trivially_copyable_v<ArrayRef<int>>,
129f35d0608SVitaly Buka               "trivially copyable");
130f35d0608SVitaly Buka 
131f35d0608SVitaly Buka }  // namespace
132