Skip to content

Commit 7d8d3e6

Browse files
committed
Add tests for util/vector.h's Cat and Vector
1 parent e65e61c commit 7d8d3e6

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed

src/test/util_tests.cpp

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <util/string.h>
1414
#include <util/time.h>
1515
#include <util/spanparsing.h>
16+
#include <util/vector.h>
1617

1718
#include <stdint.h>
1819
#include <thread>
@@ -1714,4 +1715,109 @@ BOOST_AUTO_TEST_CASE(test_LogEscapeMessage)
17141715
BOOST_CHECK_EQUAL(BCLog::LogEscapeMessage(NUL), R"(O\x00O)");
17151716
}
17161717

1718+
namespace {
1719+
1720+
struct Tracker
1721+
{
1722+
//! Points to the original object (possibly itself) we moved/copied from
1723+
const Tracker* origin;
1724+
//! How many copies where involved between the original object and this one (moves are not counted)
1725+
int copies;
1726+
1727+
Tracker() noexcept : origin(this), copies(0) {}
1728+
Tracker(const Tracker& t) noexcept : origin(t.origin), copies(t.copies + 1) {}
1729+
Tracker(Tracker&& t) noexcept : origin(t.origin), copies(t.copies) {}
1730+
Tracker& operator=(const Tracker& t) noexcept
1731+
{
1732+
origin = t.origin;
1733+
copies = t.copies + 1;
1734+
return *this;
1735+
}
1736+
Tracker& operator=(Tracker&& t) noexcept
1737+
{
1738+
origin = t.origin;
1739+
copies = t.copies;
1740+
return *this;
1741+
}
1742+
};
1743+
1744+
}
1745+
1746+
BOOST_AUTO_TEST_CASE(test_tracked_vector)
1747+
{
1748+
Tracker t1;
1749+
Tracker t2;
1750+
Tracker t3;
1751+
1752+
BOOST_CHECK(t1.origin == &t1);
1753+
BOOST_CHECK(t2.origin == &t2);
1754+
BOOST_CHECK(t3.origin == &t3);
1755+
1756+
auto v1 = Vector(t1);
1757+
BOOST_CHECK_EQUAL(v1.size(), 1);
1758+
BOOST_CHECK(v1[0].origin == &t1);
1759+
BOOST_CHECK_EQUAL(v1[0].copies, 1);
1760+
1761+
auto v2 = Vector(std::move(t2));
1762+
BOOST_CHECK_EQUAL(v2.size(), 1);
1763+
BOOST_CHECK(v2[0].origin == &t2);
1764+
BOOST_CHECK_EQUAL(v2[0].copies, 0);
1765+
1766+
auto v3 = Vector(t1, std::move(t2));
1767+
BOOST_CHECK_EQUAL(v3.size(), 2);
1768+
BOOST_CHECK(v3[0].origin == &t1);
1769+
BOOST_CHECK(v3[1].origin == &t2);
1770+
BOOST_CHECK_EQUAL(v3[0].copies, 1);
1771+
BOOST_CHECK_EQUAL(v3[1].copies, 0);
1772+
1773+
auto v4 = Vector(std::move(v3[0]), v3[1], std::move(t3));
1774+
BOOST_CHECK_EQUAL(v4.size(), 3);
1775+
BOOST_CHECK(v4[0].origin == &t1);
1776+
BOOST_CHECK(v4[1].origin == &t2);
1777+
BOOST_CHECK(v4[2].origin == &t3);
1778+
BOOST_CHECK_EQUAL(v4[0].copies, 1);
1779+
BOOST_CHECK_EQUAL(v4[1].copies, 1);
1780+
BOOST_CHECK_EQUAL(v4[2].copies, 0);
1781+
1782+
auto v5 = Cat(v1, v4);
1783+
BOOST_CHECK_EQUAL(v5.size(), 4);
1784+
BOOST_CHECK(v5[0].origin == &t1);
1785+
BOOST_CHECK(v5[1].origin == &t1);
1786+
BOOST_CHECK(v5[2].origin == &t2);
1787+
BOOST_CHECK(v5[3].origin == &t3);
1788+
BOOST_CHECK_EQUAL(v5[0].copies, 2);
1789+
BOOST_CHECK_EQUAL(v5[1].copies, 2);
1790+
BOOST_CHECK_EQUAL(v5[2].copies, 2);
1791+
BOOST_CHECK_EQUAL(v5[3].copies, 1);
1792+
1793+
auto v6 = Cat(std::move(v1), v3);
1794+
BOOST_CHECK_EQUAL(v6.size(), 3);
1795+
BOOST_CHECK(v6[0].origin == &t1);
1796+
BOOST_CHECK(v6[1].origin == &t1);
1797+
BOOST_CHECK(v6[2].origin == &t2);
1798+
BOOST_CHECK_EQUAL(v6[0].copies, 1);
1799+
BOOST_CHECK_EQUAL(v6[1].copies, 2);
1800+
BOOST_CHECK_EQUAL(v6[2].copies, 1);
1801+
1802+
auto v7 = Cat(v2, std::move(v4));
1803+
BOOST_CHECK_EQUAL(v7.size(), 4);
1804+
BOOST_CHECK(v7[0].origin == &t2);
1805+
BOOST_CHECK(v7[1].origin == &t1);
1806+
BOOST_CHECK(v7[2].origin == &t2);
1807+
BOOST_CHECK(v7[3].origin == &t3);
1808+
BOOST_CHECK_EQUAL(v7[0].copies, 1);
1809+
BOOST_CHECK_EQUAL(v7[1].copies, 1);
1810+
BOOST_CHECK_EQUAL(v7[2].copies, 1);
1811+
BOOST_CHECK_EQUAL(v7[3].copies, 0);
1812+
1813+
auto v8 = Cat(std::move(v2), std::move(v3));
1814+
BOOST_CHECK_EQUAL(v8.size(), 3);
1815+
BOOST_CHECK(v8[0].origin == &t2);
1816+
BOOST_CHECK(v8[1].origin == &t1);
1817+
BOOST_CHECK(v8[2].origin == &t2);
1818+
BOOST_CHECK_EQUAL(v8[0].copies, 0);
1819+
BOOST_CHECK_EQUAL(v8[1].copies, 1);
1820+
BOOST_CHECK_EQUAL(v8[2].copies, 0);
1821+
}
1822+
17171823
BOOST_AUTO_TEST_SUITE_END()

0 commit comments

Comments
 (0)