diff --git a/test/primitives/iterator.cpp b/test/primitives/iterator.cpp
index 196f0391..f00f21c4 100644
--- a/test/primitives/iterator.cpp
+++ b/test/primitives/iterator.cpp
@@ -32,8 +32,7 @@ class iterator_
iterator_(const base::manager& memory, const Link& start,
const Key& key) NOEXCEPT
- : base(memory, start, key),
- manager_(memory)
+ : iterator(memory, start, key)
{
}
@@ -46,11 +45,64 @@ class iterator_
{
return base::get_next(base::get_ptr());
}
-
-private:
- const base::manager manager_;
};
+BOOST_AUTO_TEST_CASE(iterator_test)
+{
+ using link = linkage<1>;
+ using key = data_array<2>;
+ constexpr size_t value = 1;
+ using record_iterate = iterator_;
+ static_assert(link::terminal == 0xff);
+
+ constexpr link head{ 0 };
+ constexpr key key2{ 0x1a, 0x2a };
+
+ // raw memory
+ data_chunk data
+ {
+ 0x01, 0x1a, 0x2a, 0xee,
+ 0x02, 0x1a, 0x2a, 0xee,
+ 0xff, 0xcc, 0xcc, 0xee
+ };
+
+ // database::storage
+ test::chunk_storage file{ data };
+
+ // database::manager
+ record_iterate::manager manager{ file };
+
+ // database::iterator
+ record_iterate iterator1{ file, head, key2 };
+
+ // First record is 0x00.
+ BOOST_REQUIRE_EQUAL(iterator1.self(), 0x00u);
+
+ // Next record is 0x01 (data[0]->data[4]).
+ BOOST_REQUIRE_EQUAL(iterator1.get_next_(), 0x01u);
+ BOOST_REQUIRE(iterator1.is_match_());
+
+ // Set self/link to record 0x01.
+ BOOST_REQUIRE(iterator1.advance());
+ BOOST_REQUIRE_EQUAL(iterator1.self(), 0x01u);
+ BOOST_REQUIRE(iterator1.is_match_());
+
+ // Next record is 0x02 (data[4]->data[8]).
+ BOOST_REQUIRE_EQUAL(iterator1.get_next_(), 0x02u);
+ BOOST_REQUIRE_EQUAL(iterator1.self(), 0x01u);
+ BOOST_REQUIRE(iterator1.is_match_());
+
+ // Advance returns false (no match) and self becomes terminal.
+ BOOST_REQUIRE(!iterator1.advance());
+ BOOST_REQUIRE(!iterator1.is_match_());
+ BOOST_REQUIRE(iterator1.self().is_terminal());
+ BOOST_REQUIRE(!iterator1.advance());
+ BOOST_REQUIRE(!iterator1.is_match_());
+ BOOST_REQUIRE(iterator1.self().is_terminal());
+}
+
+#if defined(DISABLED)
+
BOOST_AUTO_TEST_CASE(iterator__get_next__empty__terminal)
{
using link = linkage<4>;
@@ -138,11 +190,9 @@ BOOST_AUTO_TEST_CASE(iterator__next__self__expected)
{
using link = linkage<1>;
using key = data_array<2>;
- constexpr size_t value = 1;
- using record_iterate = iterator_;
- static_assert(link::terminal == 0xff);
+ using record_iterate = iterator_;
- constexpr link head{ 0 };
+ constexpr auto start = 0;
constexpr key key2{ 0x1a, 0x2a };
data_chunk data
{
@@ -151,32 +201,19 @@ BOOST_AUTO_TEST_CASE(iterator__next__self__expected)
0xff, 0xcc, 0xcc, 0xee
};
test::chunk_storage file{ data };
- record_iterate iterator1{ file, head, key2 };
+ record_iterate iterator1{ file, start, key2 };
- // First record is 0x00.
+ // First link is zero, matched.
BOOST_REQUIRE_EQUAL(iterator1.self(), 0x00u);
- // Next record is 0x01 (data[0]->data[4]).
- BOOST_REQUIRE_EQUAL(iterator1.get_next_(), 0x01u);
- BOOST_REQUIRE(iterator1.is_match_());
-
- // Set self/link to record 0x01.
+ // Sets self/link to 0x01 (data[4]), matched.
BOOST_REQUIRE(iterator1.advance());
+ BOOST_REQUIRE(!iterator1.self().is_terminal());
BOOST_REQUIRE_EQUAL(iterator1.self(), 0x01u);
- BOOST_REQUIRE(iterator1.is_match_());
-
- // Next record is 0x02 (data[4]->data[8]).
- BOOST_REQUIRE_EQUAL(iterator1.get_next_(), 0x02u);
- BOOST_REQUIRE_EQUAL(iterator1.self(), 0x01u);
- BOOST_REQUIRE(iterator1.is_match_());
- // Advance returns false (no match) and self becomes terminal.
+ // No more matches.
BOOST_REQUIRE(!iterator1.advance());
- BOOST_REQUIRE(!iterator1.is_match_());
- BOOST_REQUIRE(iterator1.self().is_terminal());
- BOOST_REQUIRE(!iterator1.advance());
- BOOST_REQUIRE(!iterator1.is_match_());
- BOOST_REQUIRE(iterator1.self().is_terminal());
+ BOOST_REQUIRE_EQUAL(iterator1.self(), link::terminal);
}
BOOST_AUTO_TEST_CASE(iterator__next__true__non_terminal)
@@ -203,4 +240,6 @@ BOOST_AUTO_TEST_CASE(iterator__next__true__non_terminal)
BOOST_REQUIRE(iterator.self().is_terminal());
}
+#endif // DISABLED
+
BOOST_AUTO_TEST_SUITE_END()