Added some foreachSubRange

This commit is contained in:
emeric
2023-11-08 13:53:27 +01:00
parent 4bc5aee986
commit 6bb6dd6add
2 changed files with 349 additions and 294 deletions
+158 -120
View File
@@ -36,174 +36,212 @@
#include "services/database/User.hpp"
TmpDatabase::TmpDatabase()
: _tmpFile {std::tmpnam(nullptr)}
, _fileDeleter {_tmpFile}
, _db {_tmpFile}
: _tmpFile{ std::tmpnam(nullptr) }
, _fileDeleter{ _tmpFile }
, _db{ _tmpFile }
{
}
Database::Db&
TmpDatabase::getDb()
{
return _db;
return _db;
}
DatabaseFixture::~DatabaseFixture()
{
testDatabaseEmpty();
testDatabaseEmpty();
}
void
DatabaseFixture::SetUpTestCase()
{
_tmpDb = std::make_unique<TmpDatabase>();
{
Database::Session s {_tmpDb->getDb()};
s.prepareTables();
s.analyze();
_tmpDb = std::make_unique<TmpDatabase>();
{
Database::Session s{ _tmpDb->getDb() };
s.prepareTables();
s.analyze();
// remove default created entries
{
auto transaction {s.createUniqueTransaction()};
auto clusterTypes {Database::ClusterType::find(s, Database::Range {})};
for (auto clusterTypeId : clusterTypes.results)
{
auto clusterType {Database::ClusterType::find(s, clusterTypeId)};
clusterType.remove();
}
}
}
// remove default created entries
{
auto transaction{ s.createUniqueTransaction() };
auto clusterTypes{ Database::ClusterType::find(s, Database::Range {}) };
for (auto clusterTypeId : clusterTypes.results)
{
auto clusterType{ Database::ClusterType::find(s, clusterTypeId) };
clusterType.remove();
}
}
}
}
void
DatabaseFixture::TearDownTestCase()
{
_tmpDb.reset();
_tmpDb.reset();
}
void
DatabaseFixture::testDatabaseEmpty()
{
using namespace Database;
using namespace Database;
auto uniqueTransaction {session.createUniqueTransaction()};
auto uniqueTransaction{ session.createUniqueTransaction() };
EXPECT_EQ(Artist::getCount(session), 0);
EXPECT_EQ(Cluster::getCount(session), 0);
EXPECT_EQ(ClusterType::getCount(session), 0);
EXPECT_EQ(Listen::getCount(session), 0);
EXPECT_EQ(Release::getCount(session), 0);
EXPECT_EQ(StarredArtist::getCount(session), 0);
EXPECT_EQ(StarredRelease::getCount(session), 0);
EXPECT_EQ(StarredTrack::getCount(session), 0);
EXPECT_EQ(Track::getCount(session), 0);
EXPECT_EQ(TrackBookmark::getCount(session), 0);
EXPECT_EQ(TrackList::getCount(session), 0);
EXPECT_EQ(User::getCount(session), 0);
EXPECT_EQ(Artist::getCount(session), 0);
EXPECT_EQ(Cluster::getCount(session), 0);
EXPECT_EQ(ClusterType::getCount(session), 0);
EXPECT_EQ(Listen::getCount(session), 0);
EXPECT_EQ(Release::getCount(session), 0);
EXPECT_EQ(StarredArtist::getCount(session), 0);
EXPECT_EQ(StarredRelease::getCount(session), 0);
EXPECT_EQ(StarredTrack::getCount(session), 0);
EXPECT_EQ(Track::getCount(session), 0);
EXPECT_EQ(TrackBookmark::getCount(session), 0);
EXPECT_EQ(TrackList::getCount(session), 0);
EXPECT_EQ(User::getCount(session), 0);
}
TEST_F(DatabaseFixture, Common_subRangeEmpty)
{
using namespace Database;
using namespace Database;
RangeResults<int> results;
results.range = Range {0, 0};
results.results = {};
results.moreResults = false;
RangeResults<int> results;
results.range = Range{ 0, 0 };
results.results = {};
results.moreResults = false;
{
auto subRange {results.getSubRange(Range {0, 0})};
EXPECT_FALSE(subRange.moreResults);
ASSERT_EQ(subRange.results.size(), 0);
EXPECT_EQ(subRange.range, Range {});
}
{
auto subRange {results.getSubRange(Range {0, 1})};
EXPECT_FALSE(subRange.moreResults);
ASSERT_EQ(subRange.results.size(), 0);
}
{
auto subRange{ results.getSubRange(Range {0, 0}) };
EXPECT_FALSE(subRange.moreResults);
ASSERT_EQ(subRange.results.size(), 0);
EXPECT_EQ(subRange.range, Range{});
}
{
auto subRange{ results.getSubRange(Range {0, 1}) };
EXPECT_FALSE(subRange.moreResults);
ASSERT_EQ(subRange.results.size(), 0);
}
}
TEST_F(DatabaseFixture, Common_subRangeForeach)
{
using namespace Database;
struct TestCase
{
Range range;
std::size_t subRangeSize;
std::vector<Range> expectedSubRanges;
};
TestCase testCases[]
{
{Range{0, 0}, 1, {}},
{Range{1, 0}, 1, {}},
{Range{1, 1}, 1, { Range{ 1,1 } }},
{Range{1, 3}, 1, { Range{ 1,1 }, Range {2,1}, Range{3,1} }},
{Range{0, 100}, 100, { Range{0,100} }},
{Range{0, 50}, 100, { Range{0,50} }},
{Range{100, 200}, 100, { Range{100,100}, Range{200,100} }},
{Range{100, 101}, 100, { Range{100,100}, Range{200,1}}},
{Range{1000, 10}, 100, { Range{1000,10} }},
{Range{1, 100}, 50, { Range{1,50}, Range{51, 50} }},
};
for (const TestCase& test : testCases)
{
std::vector<Range> subRanges;
foreachSubRange(test.range, test.subRangeSize, [&](Range subRange)
{
subRanges.push_back(subRange);
return true;
});
EXPECT_EQ(subRanges, test.expectedSubRanges) << ", test index = " << std::distance(std::cbegin(testCases), &test);
}
}
TEST_F(DatabaseFixture, Common_IdType)
{
using namespace Database;
using namespace Database;
{
const IdType id{};
EXPECT_FALSE(id.isValid());
}
{
const IdType id{};
EXPECT_FALSE(id.isValid());
}
{
const IdType id{0};
EXPECT_TRUE(id.isValid());
}
{
const IdType id{ 0 };
EXPECT_TRUE(id.isValid());
}
{
const IdType id1{0};
const IdType id2{0};
EXPECT_EQ(id1, id2);
}
{
const IdType id1{ 0 };
const IdType id2{ 0 };
EXPECT_EQ(id1, id2);
}
{
const IdType id1{0};
const IdType id2{1};
EXPECT_NE(id1, id2);
EXPECT_LT(id1, id2);
EXPECT_GT(id2, id1);
}
{
const IdType id1{ 0 };
const IdType id2{ 1 };
EXPECT_NE(id1, id2);
EXPECT_LT(id1, id2);
EXPECT_GT(id2, id1);
}
}
TEST_F(DatabaseFixture, Common_subRange)
{
using namespace Database;
using namespace Database;
RangeResults<int> results;
results.range = Range {0, 2};
results.results = {5, 6};
results.moreResults = false;
RangeResults<int> results;
results.range = Range{ 0, 2 };
results.results = { 5, 6 };
results.moreResults = false;
{
auto subRange {results.getSubRange(Range {0, 1})};
EXPECT_TRUE(subRange.moreResults);
ASSERT_EQ(subRange.results.size(), 1);
EXPECT_EQ(subRange.results.front(), 5);
}
{
auto subRange {results.getSubRange(Range {1, 1})};
EXPECT_FALSE(subRange.moreResults);
ASSERT_EQ(subRange.results.size(), 1);
EXPECT_EQ(subRange.results.front(), 6);
}
{
auto subRange {results.getSubRange(Range {0, 2})};
EXPECT_FALSE(subRange.moreResults);
ASSERT_EQ(subRange.results.size(), 2);
EXPECT_EQ(subRange.results.front(), 5);
EXPECT_EQ(subRange.results.back(), 6);
}
{
auto subRange {results.getSubRange(Range {})};
EXPECT_FALSE(subRange.moreResults);
ASSERT_EQ(subRange.results.size(), 2);
EXPECT_EQ(subRange.results.front(), 5);
EXPECT_EQ(subRange.results.back(), 6);
EXPECT_EQ(subRange.range, results.range);
}
{
auto subRange{ results.getSubRange(Range {0, 1}) };
EXPECT_TRUE(subRange.moreResults);
ASSERT_EQ(subRange.results.size(), 1);
EXPECT_EQ(subRange.results.front(), 5);
}
{
auto subRange{ results.getSubRange(Range {1, 1}) };
EXPECT_FALSE(subRange.moreResults);
ASSERT_EQ(subRange.results.size(), 1);
EXPECT_EQ(subRange.results.front(), 6);
}
{
auto subRange{ results.getSubRange(Range {0, 2}) };
EXPECT_FALSE(subRange.moreResults);
ASSERT_EQ(subRange.results.size(), 2);
EXPECT_EQ(subRange.results.front(), 5);
EXPECT_EQ(subRange.results.back(), 6);
}
{
auto subRange{ results.getSubRange(Range {}) };
EXPECT_FALSE(subRange.moreResults);
ASSERT_EQ(subRange.results.size(), 2);
EXPECT_EQ(subRange.results.front(), 5);
EXPECT_EQ(subRange.results.back(), 6);
EXPECT_EQ(subRange.range, results.range);
}
{
auto subRange {results.getSubRange(Range {1, 0})};
EXPECT_FALSE(subRange.moreResults);
ASSERT_EQ(subRange.results.size(), 1);
EXPECT_EQ(subRange.results.front(), 6);
const Range expectedRange {1, 1};
EXPECT_EQ(subRange.range, expectedRange);
}
{
auto subRange {results.getSubRange(Range {3, 2})};
EXPECT_FALSE(subRange.moreResults);
ASSERT_EQ(subRange.results.size(), 0);
const Range expectedRange {2, 0};
EXPECT_EQ(subRange.range, expectedRange);
}
{
auto subRange{ results.getSubRange(Range {1, 0}) };
EXPECT_FALSE(subRange.moreResults);
ASSERT_EQ(subRange.results.size(), 1);
EXPECT_EQ(subRange.results.front(), 6);
const Range expectedRange{ 1, 1 };
EXPECT_EQ(subRange.range, expectedRange);
}
{
auto subRange{ results.getSubRange(Range {3, 2}) };
EXPECT_FALSE(subRange.moreResults);
ASSERT_EQ(subRange.results.size(), 0);
const Range expectedRange{ 2, 0 };
EXPECT_EQ(subRange.range, expectedRange);
}
}