blob: eea56c417a5719f9e198c3eb217dbc5979a50394 [file] [log] [blame]
// SPDX-License-Identifier: Apache-2.0
/** @file
MemSpan unit tests.
*/
#include <iostream>
#include "swoc/Vectray.h"
#include "catch.hpp"
using swoc::Vectray;
TEST_CASE("Vectray", "[libswoc][Vectray]")
{
struct Thing {
unsigned n = 56;
Thing() = default;
Thing(Thing const& that) = default;
Thing(Thing && that) : n(that.n) { that.n = 0; }
Thing(unsigned u) : n(u) {}
};
Vectray<Thing, 1> unit_thing;
Thing PhysicalThing{0};
REQUIRE(unit_thing.size() == 0);
unit_thing.push_back(PhysicalThing); // Copy construct
REQUIRE(unit_thing.size() == 1);
unit_thing.push_back(Thing{1});
REQUIRE(unit_thing.size() == 2);
unit_thing.push_back(Thing{2});
REQUIRE(unit_thing.size() == 3);
// Check via indexed access.
for ( unsigned idx = 0 ; idx < unit_thing.size() ; ++idx ) {
REQUIRE(unit_thing[idx].n == idx);
}
// Check via container access.
unsigned n = 0;
for ( auto const& thing : unit_thing ) {
REQUIRE(thing.n == n);
++n;
}
REQUIRE(n == unit_thing.size());
Thing tmp{99};
unit_thing.push_back(std::move(tmp));
REQUIRE(unit_thing[3].n == 99);
REQUIRE(tmp.n == 0);
PhysicalThing.n = 101;
unit_thing.push_back(PhysicalThing);
REQUIRE(unit_thing.back().n == 101);
REQUIRE(PhysicalThing.n == 101);
}
TEST_CASE("Vectray Destructor", "[libswoc][Vectray]") {
int count = 0;
struct Q {
int & count_;
Q(int & count) : count_(count) {}
~Q() { ++count_; }
};
{
Vectray<Q, 1> v1;
v1.emplace_back(count);
}
REQUIRE(count == 1);
count = 0;
{ // force use of dynamic memory.
Vectray<Q, 1> v2;
v2.emplace_back(count);
v2.emplace_back(count);
v2.emplace_back(count);
}
// Hard to get an exact cound because of std::vector resizes.
// But first object should be at least double deleted because of transfer.
REQUIRE(count >= 4);
}