xref: /llvm-project/libc/test/src/__support/fixedvector_test.cpp (revision 54ca5a800d12bf76dabc957163df02c3ea005627)
1 //===-- Unittests for FixedVector -----------------------------------------===//
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 #include "src/__support/CPP/array.h"
10 #include "src/__support/fixedvector.h"
11 #include "test/UnitTest/Test.h"
12 
TEST(LlvmLibcFixedVectorTest,PushAndPop)13 TEST(LlvmLibcFixedVectorTest, PushAndPop) {
14   LIBC_NAMESPACE::FixedVector<int, 20> fixed_vector;
15   ASSERT_TRUE(fixed_vector.empty());
16   for (int i = 0; i < 20; i++)
17     ASSERT_TRUE(fixed_vector.push_back(i));
18   ASSERT_FALSE(fixed_vector.empty());
19   ASSERT_FALSE(fixed_vector.push_back(123));
20   for (int i = 20; i > 0; --i) {
21     ASSERT_EQ(fixed_vector.back(), i - 1);
22     ASSERT_TRUE(fixed_vector.pop_back());
23   }
24   ASSERT_FALSE(fixed_vector.pop_back());
25   ASSERT_TRUE(fixed_vector.empty());
26 }
27 
TEST(LlvmLibcFixedVectorTest,Reset)28 TEST(LlvmLibcFixedVectorTest, Reset) {
29   LIBC_NAMESPACE::FixedVector<int, 20> fixed_vector;
30   ASSERT_TRUE(fixed_vector.empty());
31   for (int i = 0; i < 20; i++)
32     ASSERT_TRUE(fixed_vector.push_back(i));
33   ASSERT_FALSE(fixed_vector.empty());
34   fixed_vector.reset();
35   ASSERT_TRUE(fixed_vector.empty());
36 }
37 
TEST(LlvmLibcFixedVectorTest,Destroy)38 TEST(LlvmLibcFixedVectorTest, Destroy) {
39   LIBC_NAMESPACE::FixedVector<int, 20> fixed_vector;
40   ASSERT_TRUE(fixed_vector.empty());
41   for (int i = 0; i < 20; i++)
42     ASSERT_TRUE(fixed_vector.push_back(i));
43   ASSERT_FALSE(fixed_vector.empty());
44   LIBC_NAMESPACE::FixedVector<int, 20>::destroy(&fixed_vector);
45   ASSERT_TRUE(fixed_vector.empty());
46 }
47 
TEST(LlvmLibcFixedVectorTest,Iteration)48 TEST(LlvmLibcFixedVectorTest, Iteration) {
49   LIBC_NAMESPACE::FixedVector<int, 20> v;
50   for (int i = 0; i < 3; i++)
51     v.push_back(i);
52   auto it = v.rbegin();
53   ASSERT_EQ(*it, 2);
54   ASSERT_EQ(*++it, 1);
55   ASSERT_EQ(*++it, 0);
56   // TODO: need an overload of Test::test for iterators?
57   // ASSERT_EQ(++it, v.rend());
58   // ASSERT_EQ(v.rbegin(), v.rbegin());
59   ASSERT_TRUE(++it == v.rend());
60   for (auto it = v.rbegin(), e = v.rend(); it != e; ++it)
61     ASSERT_GT(*it, -1);
62 
63   auto forward_it = v.begin();
64   ASSERT_EQ(*forward_it, 0);
65   ASSERT_EQ(*++forward_it, 1);
66   ASSERT_EQ(*++forward_it, 2);
67   ASSERT_TRUE(++forward_it == v.end());
68   for (auto it = v.begin(), e = v.end(); it != e; ++it)
69     ASSERT_GT(*it, -1);
70   for (int &x : v)
71     ASSERT_GE(x, 0);
72 }
73 
TEST(LlvmLibcFixedVectorTest,ConstructionFromIterators)74 TEST(LlvmLibcFixedVectorTest, ConstructionFromIterators) {
75   LIBC_NAMESPACE::cpp::array<int, 4> arr{1, 2, 3, 4};
76   LIBC_NAMESPACE::FixedVector<int, 5> vec(arr.begin(), arr.end());
77   ASSERT_EQ(vec.size(), arr.size());
78   for (size_t i = 0; i < arr.size(); ++i)
79     ASSERT_EQ(vec[i], arr[i]);
80 }
81 
TEST(LlvmLibcFixedVectorTest,ConstructionFromCountAndValue)82 TEST(LlvmLibcFixedVectorTest, ConstructionFromCountAndValue) {
83   constexpr int kVal = 10;
84   LIBC_NAMESPACE::FixedVector<int, 5> vec(4, kVal);
85   ASSERT_EQ(vec.size(), size_t(4));
86   for (size_t i = 0; i < vec.size(); ++i)
87     ASSERT_EQ(vec[i], kVal);
88 }
89 
TEST(LlvmLibcFixedVectorTest,ForwardIteration)90 TEST(LlvmLibcFixedVectorTest, ForwardIteration) {
91   LIBC_NAMESPACE::cpp::array<int, 4> arr{1, 2, 3, 4};
92   LIBC_NAMESPACE::FixedVector<int, 5> vec(arr.begin(), arr.end());
93   ASSERT_EQ(vec.size(), arr.size());
94   for (auto it = vec.begin(); it != vec.end(); ++it) {
95     auto idx = it - vec.begin();
96     ASSERT_EQ(*it, arr[idx]);
97   }
98 }
99 
TEST(LlvmLibcFixedVectorTest,ConstForwardIteration)100 TEST(LlvmLibcFixedVectorTest, ConstForwardIteration) {
101   const LIBC_NAMESPACE::cpp::array<int, 4> arr{1, 2, 3, 4};
102   const LIBC_NAMESPACE::FixedVector<int, 5> vec(arr.begin(), arr.end());
103   ASSERT_EQ(vec.size(), arr.size());
104   for (auto it = vec.begin(); it != vec.end(); ++it) {
105     auto idx = it - vec.begin();
106     ASSERT_EQ(*it, arr[idx]);
107   }
108 }
109