Branch data Line data Source code
# 1 : : // Copyright (c) 2015-2020 The Bitcoin Core developers
# 2 : : // Distributed under the MIT software license, see the accompanying
# 3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
# 4 : :
# 5 : : #include <prevector.h>
# 6 : : #include <vector>
# 7 : :
# 8 : : #include <reverse_iterator.h>
# 9 : : #include <serialize.h>
# 10 : : #include <streams.h>
# 11 : :
# 12 : : #include <test/util/setup_common.h>
# 13 : :
# 14 : : #include <boost/test/unit_test.hpp>
# 15 : :
# 16 : : BOOST_FIXTURE_TEST_SUITE(prevector_tests, TestingSetup)
# 17 : :
# 18 : : template<unsigned int N, typename T>
# 19 : : class prevector_tester {
# 20 : : typedef std::vector<T> realtype;
# 21 : : realtype real_vector;
# 22 : : realtype real_vector_alt;
# 23 : :
# 24 : : typedef prevector<N, T> pretype;
# 25 : : pretype pre_vector;
# 26 : : pretype pre_vector_alt;
# 27 : :
# 28 : : typedef typename pretype::size_type Size;
# 29 : : bool passed = true;
# 30 : : FastRandomContext rand_cache;
# 31 : : uint256 rand_seed;
# 32 : :
# 33 : :
# 34 : : template <typename A, typename B>
# 35 : : void local_check_equal(A a, B b)
# 36 : 19027456 : {
# 37 : 19027456 : local_check(a == b);
# 38 : 19027456 : }
# 39 : : void local_check(bool b)
# 40 : 53781248 : {
# 41 : 53781248 : passed &= b;
# 42 : 53781248 : }
# 43 : 532352 : void test() {
# 44 : 532352 : const pretype& const_pre_vector = pre_vector;
# 45 : 532352 : local_check_equal(real_vector.size(), pre_vector.size());
# 46 : 532352 : local_check_equal(real_vector.empty(), pre_vector.empty());
# 47 [ + + ]: 4741504 : for (Size s = 0; s < real_vector.size(); s++) {
# 48 : 4209152 : local_check(real_vector[s] == pre_vector[s]);
# 49 : 4209152 : local_check(&(pre_vector[s]) == &(pre_vector.begin()[s]));
# 50 : 4209152 : local_check(&(pre_vector[s]) == &*(pre_vector.begin() + s));
# 51 : 4209152 : local_check(&(pre_vector[s]) == &*((pre_vector.end() + s) - real_vector.size()));
# 52 : 4209152 : }
# 53 : : // local_check(realtype(pre_vector) == real_vector);
# 54 : 532352 : local_check(pretype(real_vector.begin(), real_vector.end()) == pre_vector);
# 55 : 532352 : local_check(pretype(pre_vector.begin(), pre_vector.end()) == pre_vector);
# 56 : 532352 : size_t pos = 0;
# 57 [ + + ]: 4209152 : for (const T& v : pre_vector) {
# 58 : 4209152 : local_check(v == real_vector[pos++]);
# 59 : 4209152 : }
# 60 [ + + ]: 4209152 : for (const T& v : reverse_iterate(pre_vector)) {
# 61 : 4209152 : local_check(v == real_vector[--pos]);
# 62 : 4209152 : }
# 63 [ + + ]: 4209152 : for (const T& v : const_pre_vector) {
# 64 : 4209152 : local_check(v == real_vector[pos++]);
# 65 : 4209152 : }
# 66 [ + + ]: 4209152 : for (const T& v : reverse_iterate(const_pre_vector)) {
# 67 : 4209152 : local_check(v == real_vector[--pos]);
# 68 : 4209152 : }
# 69 : 532352 : CDataStream ss1(SER_DISK, 0);
# 70 : 532352 : CDataStream ss2(SER_DISK, 0);
# 71 : 532352 : ss1 << real_vector;
# 72 : 532352 : ss2 << pre_vector;
# 73 : 532352 : local_check_equal(ss1.size(), ss2.size());
# 74 [ + + ]: 17901312 : for (Size s = 0; s < ss1.size(); s++) {
# 75 : 17368960 : local_check_equal(ss1[s], ss2[s]);
# 76 : 17368960 : }
# 77 : 532352 : }
# 78 : :
# 79 : : public:
# 80 : 30720 : void resize(Size s) {
# 81 : 30720 : real_vector.resize(s);
# 82 : 30720 : local_check_equal(real_vector.size(), s);
# 83 : 30720 : pre_vector.resize(s);
# 84 : 30720 : local_check_equal(pre_vector.size(), s);
# 85 : 30720 : test();
# 86 : 30720 : }
# 87 : :
# 88 : 7936 : void reserve(Size s) {
# 89 : 7936 : real_vector.reserve(s);
# 90 : 7936 : local_check(real_vector.capacity() >= s);
# 91 : 7936 : pre_vector.reserve(s);
# 92 : 7936 : local_check(pre_vector.capacity() >= s);
# 93 : 7936 : test();
# 94 : 7936 : }
# 95 : :
# 96 : 65664 : void insert(Size position, const T& value) {
# 97 : 65664 : real_vector.insert(real_vector.begin() + position, value);
# 98 : 65664 : pre_vector.insert(pre_vector.begin() + position, value);
# 99 : 65664 : test();
# 100 : 65664 : }
# 101 : :
# 102 : 31744 : void insert(Size position, Size count, const T& value) {
# 103 : 31744 : real_vector.insert(real_vector.begin() + position, count, value);
# 104 : 31744 : pre_vector.insert(pre_vector.begin() + position, count, value);
# 105 : 31744 : test();
# 106 : 31744 : }
# 107 : :
# 108 : : template<typename I>
# 109 : 8192 : void insert_range(Size position, I first, I last) {
# 110 : 8192 : real_vector.insert(real_vector.begin() + position, first, last);
# 111 : 8192 : pre_vector.insert(pre_vector.begin() + position, first, last);
# 112 : 8192 : test();
# 113 : 8192 : }
# 114 : :
# 115 : 56192 : void erase(Size position) {
# 116 : 56192 : real_vector.erase(real_vector.begin() + position);
# 117 : 56192 : pre_vector.erase(pre_vector.begin() + position);
# 118 : 56192 : test();
# 119 : 56192 : }
# 120 : :
# 121 : 39552 : void erase(Size first, Size last) {
# 122 : 39552 : real_vector.erase(real_vector.begin() + first, real_vector.begin() + last);
# 123 : 39552 : pre_vector.erase(pre_vector.begin() + first, pre_vector.begin() + last);
# 124 : 39552 : test();
# 125 : 39552 : }
# 126 : :
# 127 : 217600 : void update(Size pos, const T& value) {
# 128 : 217600 : real_vector[pos] = value;
# 129 : 217600 : pre_vector[pos] = value;
# 130 : 217600 : test();
# 131 : 217600 : }
# 132 : :
# 133 : 17664 : void push_back(const T& value) {
# 134 : 17664 : real_vector.push_back(value);
# 135 : 17664 : pre_vector.push_back(value);
# 136 : 17664 : test();
# 137 : 17664 : }
# 138 : :
# 139 : 13952 : void pop_back() {
# 140 : 13952 : real_vector.pop_back();
# 141 : 13952 : pre_vector.pop_back();
# 142 : 13952 : test();
# 143 : 13952 : }
# 144 : :
# 145 : 1152 : void clear() {
# 146 : 1152 : real_vector.clear();
# 147 : 1152 : pre_vector.clear();
# 148 : 1152 : }
# 149 : :
# 150 : 512 : void assign(Size n, const T& value) {
# 151 : 512 : real_vector.assign(n, value);
# 152 : 512 : pre_vector.assign(n, value);
# 153 : 512 : }
# 154 : :
# 155 : 1275648 : Size size() const {
# 156 : 1275648 : return real_vector.size();
# 157 : 1275648 : }
# 158 : :
# 159 : : Size capacity() const {
# 160 : : return pre_vector.capacity();
# 161 : : }
# 162 : :
# 163 : 4224 : void shrink_to_fit() {
# 164 : 4224 : pre_vector.shrink_to_fit();
# 165 : 4224 : test();
# 166 : 4224 : }
# 167 : :
# 168 : 29824 : void swap() {
# 169 : 29824 : real_vector.swap(real_vector_alt);
# 170 : 29824 : pre_vector.swap(pre_vector_alt);
# 171 : 29824 : test();
# 172 : 29824 : }
# 173 : :
# 174 : 8064 : void move() {
# 175 : 8064 : real_vector = std::move(real_vector_alt);
# 176 : 8064 : real_vector_alt.clear();
# 177 : 8064 : pre_vector = std::move(pre_vector_alt);
# 178 : 8064 : pre_vector_alt.clear();
# 179 : 8064 : }
# 180 : :
# 181 : 17920 : void copy() {
# 182 : 17920 : real_vector = real_vector_alt;
# 183 : 17920 : pre_vector = pre_vector_alt;
# 184 : 17920 : }
# 185 : :
# 186 : 9088 : void resize_uninitialized(realtype values) {
# 187 : 9088 : size_t r = values.size();
# 188 : 9088 : size_t s = real_vector.size() / 2;
# 189 [ + + ]: 9088 : if (real_vector.capacity() < s + r) {
# 190 : 3328 : real_vector.reserve(s + r);
# 191 : 3328 : }
# 192 : 9088 : real_vector.resize(s);
# 193 : 9088 : pre_vector.resize_uninitialized(s);
# 194 [ + + ]: 81792 : for (auto v : values) {
# 195 : 81792 : real_vector.push_back(v);
# 196 : 81792 : }
# 197 : 9088 : auto p = pre_vector.size();
# 198 : 9088 : pre_vector.resize_uninitialized(p + r);
# 199 [ + + ]: 81792 : for (auto v : values) {
# 200 : 81792 : pre_vector[p] = v;
# 201 : 81792 : ++p;
# 202 : 81792 : }
# 203 : 9088 : test();
# 204 : 9088 : }
# 205 : :
# 206 : 128 : ~prevector_tester() {
# 207 : 128 : BOOST_CHECK_MESSAGE(passed, "insecure_rand: " + rand_seed.ToString());
# 208 : 128 : }
# 209 : :
# 210 : 128 : prevector_tester() {
# 211 : 128 : SeedInsecureRand();
# 212 : 128 : rand_seed = InsecureRand256();
# 213 : 128 : rand_cache = FastRandomContext(rand_seed);
# 214 : 128 : }
# 215 : : };
# 216 : :
# 217 : : BOOST_AUTO_TEST_CASE(PrevectorTestInt)
# 218 : 2 : {
# 219 [ + + ]: 130 : for (int j = 0; j < 64; j++) {
# 220 : 128 : prevector_tester<8, int> test;
# 221 [ + + ]: 262272 : for (int i = 0; i < 2048; i++) {
# 222 [ + + ]: 262144 : if (InsecureRandBits(2) == 0) {
# 223 : 65664 : test.insert(InsecureRandRange(test.size() + 1), InsecureRand32());
# 224 : 65664 : }
# 225 [ + + ][ + + ]: 262144 : if (test.size() > 0 && InsecureRandBits(2) == 1) {
# 226 : 56192 : test.erase(InsecureRandRange(test.size()));
# 227 : 56192 : }
# 228 [ + + ]: 262144 : if (InsecureRandBits(3) == 2) {
# 229 : 30720 : int new_size = std::max(0, std::min(30, (int)test.size() + (int)InsecureRandRange(5) - 2));
# 230 : 30720 : test.resize(new_size);
# 231 : 30720 : }
# 232 [ + + ]: 262144 : if (InsecureRandBits(3) == 3) {
# 233 : 31744 : test.insert(InsecureRandRange(test.size() + 1), 1 + InsecureRandBool(), InsecureRand32());
# 234 : 31744 : }
# 235 [ + + ]: 262144 : if (InsecureRandBits(3) == 4) {
# 236 : 31488 : int del = std::min<int>(test.size(), 1 + (InsecureRandBool()));
# 237 : 31488 : int beg = InsecureRandRange(test.size() + 1 - del);
# 238 : 31488 : test.erase(beg, beg + del);
# 239 : 31488 : }
# 240 [ + + ]: 262144 : if (InsecureRandBits(4) == 5) {
# 241 : 17664 : test.push_back(InsecureRand32());
# 242 : 17664 : }
# 243 [ + + ][ + + ]: 262144 : if (test.size() > 0 && InsecureRandBits(4) == 6) {
# 244 : 13952 : test.pop_back();
# 245 : 13952 : }
# 246 [ + + ]: 262144 : if (InsecureRandBits(5) == 7) {
# 247 : 8192 : int values[4];
# 248 : 8192 : int num = 1 + (InsecureRandBits(2));
# 249 [ + + ]: 29312 : for (int k = 0; k < num; k++) {
# 250 : 21120 : values[k] = InsecureRand32();
# 251 : 21120 : }
# 252 : 8192 : test.insert_range(InsecureRandRange(test.size() + 1), values, values + num);
# 253 : 8192 : }
# 254 [ + + ]: 262144 : if (InsecureRandBits(5) == 8) {
# 255 : 8064 : int del = std::min<int>(test.size(), 1 + (InsecureRandBits(2)));
# 256 : 8064 : int beg = InsecureRandRange(test.size() + 1 - del);
# 257 : 8064 : test.erase(beg, beg + del);
# 258 : 8064 : }
# 259 [ + + ]: 262144 : if (InsecureRandBits(5) == 9) {
# 260 : 7936 : test.reserve(InsecureRandBits(5));
# 261 : 7936 : }
# 262 [ + + ]: 262144 : if (InsecureRandBits(6) == 10) {
# 263 : 4224 : test.shrink_to_fit();
# 264 : 4224 : }
# 265 [ + + ]: 262144 : if (test.size() > 0) {
# 266 : 217600 : test.update(InsecureRandRange(test.size()), InsecureRand32());
# 267 : 217600 : }
# 268 [ + + ]: 262144 : if (InsecureRandBits(10) == 11) {
# 269 : 1152 : test.clear();
# 270 : 1152 : }
# 271 [ + + ]: 262144 : if (InsecureRandBits(9) == 12) {
# 272 : 512 : test.assign(InsecureRandBits(5), InsecureRand32());
# 273 : 512 : }
# 274 [ + + ]: 262144 : if (InsecureRandBits(3) == 3) {
# 275 : 29824 : test.swap();
# 276 : 29824 : }
# 277 [ + + ]: 262144 : if (InsecureRandBits(4) == 8) {
# 278 : 17920 : test.copy();
# 279 : 17920 : }
# 280 [ + + ]: 262144 : if (InsecureRandBits(5) == 18) {
# 281 : 8064 : test.move();
# 282 : 8064 : }
# 283 [ + + ]: 262144 : if (InsecureRandBits(5) == 19) {
# 284 : 9088 : unsigned int num = 1 + (InsecureRandBits(4));
# 285 : 9088 : std::vector<int> values(num);
# 286 [ + + ]: 81792 : for (auto &v : values) {
# 287 : 81792 : v = InsecureRand32();
# 288 : 81792 : }
# 289 : 9088 : test.resize_uninitialized(values);
# 290 : 9088 : }
# 291 : 262144 : }
# 292 : 128 : }
# 293 : 2 : }
# 294 : :
# 295 : : BOOST_AUTO_TEST_SUITE_END()
|