Skip to content

Commit

Permalink
add property-based and stress tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Daoortor committed Dec 9, 2024
1 parent 07ea477 commit a7315ec
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 1 deletion.
2 changes: 1 addition & 1 deletion core/src/pathfinder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ std::optional<Journey> pathfind(const TransportSystem &transportSystem, const QS
dpEntry *currentStopOpt = &prevLayer[currentStopIndexInStops];
dpEntry *targetOpt = &prevLayer[targetIndex];
// Relax dp; target pruning - ignore routes after earliest known arrival time at target
if (currentStopTime->arrivalTime < std::min(currentStopOpt->optimalTime, targetOpt->optimalTime)) {
if (currentStopTime->arrivalTime < std::min(currentStopOpt->optimalTime, targetOpt->optimalTime) && boardedStop != currentStop) {
curLayer[currentStopIndexInStops] = {
currentStopTime->arrivalTime,
nullptr,
Expand Down
44 changes: 44 additions & 0 deletions test/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,31 @@ TEST_CASE("Pathfinder test") {
}
).check();
}

SUBCASE("Triangle inequality") {
const int N_TESTS = 10;

for (int i = 0; i < N_TESTS; i++) {
std::uniform_int_distribution<> randomStop(0, hamburg.stops.size() - 1);
const Stop *a = &hamburg.stops[randomStop(rng)];
const Stop *b = &hamburg.stops[randomStop(rng)];
const Stop *c = &hamburg.stops[randomStop(rng)];
std::optional<Journey> aTob_ = pathfind(hamburg, a->id, b->id, initDateTime);
if (!aTob_.has_value()) {
continue;
}
Journey &aTob = aTob_.value();
std::optional<Journey> bToc_ = pathfind(hamburg, b->id, c->id, aTob.arrivalTime);
if (!bToc_.has_value()) {
continue;
}
Journey &bToc = bToc_.value();
std::optional<Journey> aToc_ = pathfind(hamburg, a->id, c->id, initDateTime);
assert(aToc_.has_value());
Journey &aToc = aToc_.value();
assert(aToc.arrivalTime <= bToc.arrivalTime);
}
}
}

SUBCASE("Paris") {
Expand Down Expand Up @@ -138,6 +163,25 @@ TEST_CASE("Substring find test") {
std::vector<QString> expected;
assert(expected == result);
}

SUBCASE("Stress test") {
const int N_TESTS = 5;
const int N_STRINGS = 50;
const int N_SUBSTRINGS = 200;
const int STRING_LENGTH = 10;
const int SUBSTRING_LENGTH = 2;

for (int i = 0; i < N_TESTS; i++) {
std::vector strings = generateStrings(N_STRINGS, STRING_LENGTH);
SuffixAutomaton sa(strings);
for (int j = 0; j < N_SUBSTRINGS; j++) {
QString substring = generateString(SUBSTRING_LENGTH);
std::vector<QString> expected = naiveFindAllStringsContaining(strings, substring);
std::vector<QString> actual = sa.findAllStringsContaining(substring);
assert(expected == actual);
}
}
}
}

}
32 changes: 32 additions & 0 deletions test/util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,36 @@ void TestCase::check() const {
}
}

QString generateString(size_t len) {
std::string result;
result.reserve(len);
for (size_t i = 0; i < len; ++i) {
result += 'a' + randomChar(rng);
}

return result.c_str();
}


std::vector<QString> generateStrings(size_t n, size_t len) {
std::vector<QString> result;
result.reserve(n);
for (size_t i = 0; i < n; i++) {
result.push_back(generateString(len));
}
return result;
}

std::vector<QString> naiveFindAllStringsContaining(const std::vector<QString> &strings, const QString &substring) {
std::vector<QString> result;
std::string stdSubstring = substring.toStdString();
for (auto &string : strings) {
if (string.toStdString().find(stdSubstring) != string.toStdString().npos) {
result.push_back(string);
}
}
std::ranges::sort(result);
return result;
}

}
14 changes: 14 additions & 0 deletions test/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,17 @@

#include <string>
#include <vector>
#include <random>

namespace sdtmaps::test {

static std::random_device rd;
static std::mt19937 rng{rd()};
static std::uniform_int_distribution randomChar(0, 51);

static QDateTime initDateTime = QDateTime(QDate::fromJulianDay(0), QTime(0, 0));


BETTER_ENUM(JourneyElementType, int, RIDE, TRANSFER);

struct SimplifiedJourneyElement {
Expand Down Expand Up @@ -45,6 +53,12 @@ struct TestCase {
void check() const;
};

QString generateString(size_t len);

std::vector<QString> generateStrings(size_t n, size_t len);

std::vector<QString> naiveFindAllStringsContaining(const std::vector<QString> &strings, const QString &substring);

}

#endif //UTIL_H

0 comments on commit a7315ec

Please sign in to comment.