Branch data Line data Source code
1 : : /******************************************************************************
2 : : * Top contributors (to current version):
3 : : * Aina Niemetz, Andres Noetzli, Morgan Deters
4 : : *
5 : : * This file is part of the cvc5 project.
6 : : *
7 : : * Copyright (c) 2009-2024 by the authors listed in the file AUTHORS
8 : : * in the top-level source directory and their institutional affiliations.
9 : : * All rights reserved. See the file COPYING in the top-level source
10 : : * directory for licensing information.
11 : : * ****************************************************************************
12 : : *
13 : : * Black box testing of cvc5::context::CDList<>.
14 : : */
15 : :
16 : : #include <limits.h>
17 : :
18 : : #include <iostream>
19 : : #include <vector>
20 : :
21 : : #include "base/exception.h"
22 : : #include "context/cdlist.h"
23 : : #include "test_context.h"
24 : :
25 : : namespace cvc5::internal {
26 : :
27 : : using namespace context;
28 : :
29 : : namespace test {
30 : :
31 : : class TestObject
32 : : {
33 : : public:
34 : : // Test support for elements without default constructor
35 : : TestObject() = delete;
36 : :
37 : 5 : TestObject(bool* cleanupCalled) : d_cleanupCalled(cleanupCalled) {}
38 : :
39 : : bool* d_cleanupCalled;
40 : : };
41 : :
42 : : class TestCleanup
43 : : {
44 : : public:
45 : 2 : TestCleanup() {}
46 : 3 : void operator()(TestObject& o) { (*o.d_cleanupCalled) = true; }
47 : : };
48 : :
49 : : class TestContextBlackCDList : public TestContext
50 : : {
51 : : protected:
52 : 6 : void list_test(int n)
53 : : {
54 : 6 : list_test(n, true);
55 : 6 : list_test(n, false);
56 : 6 : }
57 : :
58 : 12 : void list_test(int32_t n, bool callDestructor)
59 : : {
60 : 12 : CDList<int32_t> list(d_context.get(), callDestructor);
61 : :
62 [ - + ]: 12 : ASSERT_TRUE(list.empty());
63 [ + + ]: 470 : for (int32_t i = 0; i < n; ++i)
64 : : {
65 [ - + ]: 458 : ASSERT_EQ(list.size(), (uint32_t)i);
66 : 458 : list.push_back(i);
67 [ - + ]: 458 : ASSERT_FALSE(list.empty());
68 [ - + ]: 458 : ASSERT_EQ(list.back(), i);
69 : 458 : int32_t i2 = 0;
70 [ + + ]: 14938 : for (CDList<int32_t>::const_iterator j = list.begin(); j != list.end();
71 : 14480 : ++j)
72 : : {
73 [ - + ]: 14480 : ASSERT_EQ(*j, i2++);
74 : : }
75 : : }
76 [ - + ]: 12 : ASSERT_EQ(list.size(), (uint32_t)n);
77 : :
78 [ + + ]: 470 : for (int32_t i = 0; i < n; ++i)
79 : : {
80 [ - + ]: 458 : ASSERT_EQ(list[i], i);
81 : : }
82 : : }
83 : : };
84 : :
85 : 2 : TEST_F(TestContextBlackCDList, CDList10) { list_test(10); }
86 : :
87 : 2 : TEST_F(TestContextBlackCDList, CDList15) { list_test(15); }
88 : :
89 : 2 : TEST_F(TestContextBlackCDList, CDList20) { list_test(20); }
90 : :
91 : 2 : TEST_F(TestContextBlackCDList, CDList35) { list_test(35); }
92 : :
93 : 2 : TEST_F(TestContextBlackCDList, CDList50) { list_test(50); }
94 : :
95 : 2 : TEST_F(TestContextBlackCDList, CDList99) { list_test(99); }
96 : :
97 : 2 : TEST_F(TestContextBlackCDList, destructor_called)
98 : : {
99 : 1 : bool shouldRemainFalse = false;
100 : 1 : bool shouldFlipToTrue = false;
101 : 1 : bool alsoFlipToTrue = false;
102 : 1 : bool shouldAlsoRemainFalse = false;
103 : 1 : bool aThirdFalse = false;
104 : :
105 : 1 : CDList<TestObject, TestCleanup> listT(d_context.get(), true, TestCleanup());
106 : 1 : CDList<TestObject, TestCleanup> listF(d_context.get(), false, TestCleanup());
107 : :
108 : 1 : TestObject shouldRemainFalseDSO(&shouldRemainFalse);
109 : 1 : TestObject shouldFlipToTrueDSO(&shouldFlipToTrue);
110 : 1 : TestObject alsoFlipToTrueDSO(&alsoFlipToTrue);
111 : 1 : TestObject shouldAlsoRemainFalseDSO(&shouldAlsoRemainFalse);
112 : 1 : TestObject aThirdFalseDSO(&aThirdFalse);
113 : :
114 : 1 : listT.push_back(shouldAlsoRemainFalseDSO);
115 : 1 : listF.push_back(shouldAlsoRemainFalseDSO);
116 : :
117 : 1 : d_context->push();
118 : :
119 : 1 : listT.push_back(shouldFlipToTrueDSO);
120 : 1 : listT.push_back(alsoFlipToTrueDSO);
121 : :
122 : 1 : listF.push_back(shouldRemainFalseDSO);
123 : 1 : listF.push_back(shouldAlsoRemainFalseDSO);
124 : 1 : listF.push_back(aThirdFalseDSO);
125 : :
126 [ - + ]: 1 : ASSERT_EQ(shouldRemainFalse, false);
127 [ - + ]: 1 : ASSERT_EQ(shouldFlipToTrue, false);
128 [ - + ]: 1 : ASSERT_EQ(alsoFlipToTrue, false);
129 [ - + ]: 1 : ASSERT_EQ(shouldAlsoRemainFalse, false);
130 [ - + ]: 1 : ASSERT_EQ(aThirdFalse, false);
131 : :
132 : 1 : d_context->pop();
133 : :
134 [ - + ]: 1 : ASSERT_EQ(shouldRemainFalse, false);
135 [ - + ]: 1 : ASSERT_EQ(shouldFlipToTrue, true);
136 [ - + ]: 1 : ASSERT_EQ(alsoFlipToTrue, true);
137 [ - + ]: 1 : ASSERT_EQ(shouldAlsoRemainFalse, false);
138 [ - + ]: 1 : ASSERT_EQ(aThirdFalse, false);
139 : : }
140 : :
141 : 2 : TEST_F(TestContextBlackCDList, empty_iterator)
142 : : {
143 : 1 : CDList<int>* list = new (true) CDList<int>(d_context.get());
144 [ - + ]: 1 : ASSERT_EQ(list->begin(), list->end());
145 : 1 : list->deleteSelf();
146 : : }
147 : :
148 : 2 : TEST_F(TestContextBlackCDList, pop_below_level_created)
149 : : {
150 : 1 : d_context->push();
151 : 1 : CDList<int32_t> list(d_context.get());
152 : 1 : d_context->popto(0);
153 : 1 : list.push_back(42);
154 : 1 : }
155 : :
156 : 2 : TEST_F(TestContextBlackCDList, emplace_back)
157 : : {
158 : 1 : int32_t n = 10;
159 : 1 : int32_t start = 42;
160 : 1 : CDList<std::unique_ptr<int32_t>> list(d_context.get());
161 : :
162 [ + + ]: 11 : for (int32_t i = 0; i < n; i++)
163 : : {
164 : 10 : list.emplace_back(new int32_t(start + i));
165 : : }
166 [ + + ]: 11 : for (int32_t i = 0; i < n; i++)
167 : : {
168 [ - + ]: 10 : ASSERT_EQ(*list[i], start + i);
169 : : }
170 [ - + ]: 1 : ASSERT_EQ(list.size(), n);
171 : :
172 : 1 : d_context->push();
173 [ + + ]: 11 : for (int32_t i = 0; i < n; i++)
174 : : {
175 : 10 : list.emplace_back(new int32_t(start + n + i));
176 : : }
177 [ + + ]: 21 : for (int32_t i = 0; i < n * 2; i++)
178 : : {
179 [ - + ]: 20 : ASSERT_EQ(*list[i], start + i);
180 : : }
181 [ - + ]: 1 : ASSERT_EQ(list.size(), n * 2);
182 : 1 : d_context->pop();
183 : :
184 [ + + ]: 11 : for (int32_t i = 0; i < n; i++)
185 : : {
186 [ - + ]: 10 : ASSERT_EQ(*list[i], start + i);
187 : : }
188 [ - + ]: 1 : ASSERT_EQ(list.size(), n);
189 : : }
190 : :
191 : : } // namespace test
192 : : } // namespace cvc5::internal
|