traversal/test.hpp contents moved to tests/unit/traversal.cpp
Summary: See above. Reviewers: buda Reviewed By: buda Subscribers: pullbot, florijan, buda Differential Revision: https://phabricator.memgraph.io/D82
This commit is contained in:
parent
1125331649
commit
92aa235a26
@ -1,195 +0,0 @@
|
||||
//
|
||||
// Copyright 2017 Memgraph
|
||||
// Created by Florijan Stamenkovic on 20.02.17.
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <iostream>
|
||||
#include <list>
|
||||
#include <memory>
|
||||
|
||||
#include "enums.hpp"
|
||||
#include "path.hpp"
|
||||
#include "templates.hpp"
|
||||
|
||||
/**
|
||||
* A specialization of the "traversal" namespace that uses
|
||||
* test Vertex and Edge classes (as opposed to the real database
|
||||
* ones).
|
||||
*/
|
||||
namespace traversal_test {
|
||||
|
||||
// add the standard enums to this namespace
|
||||
using Direction = traversal_template::Direction;
|
||||
using Expansion = traversal_template::Expansion;
|
||||
using Uniqueness = traversal_template::Uniqueness;
|
||||
|
||||
// forward declaring Edge because Vertex holds references to it
|
||||
class Edge;
|
||||
|
||||
/**
|
||||
* A Vertex class for traversal testing. Has only the
|
||||
* traversal capabilities and an exposed id_ member.
|
||||
*/
|
||||
class Vertex {
|
||||
friend class Edge;
|
||||
|
||||
public:
|
||||
// unique identifier (uniqueness guaranteed by this class)
|
||||
const int id_;
|
||||
|
||||
// vertex set by the user, for testing purposes
|
||||
const int label_;
|
||||
|
||||
Vertex(int label=0) : id_(counter_++), label_(label) {}
|
||||
|
||||
const auto &in() const { return *in_; }
|
||||
const auto &out() const { return *out_; }
|
||||
|
||||
friend std::ostream &operator<<(std::ostream &stream, const Vertex &v) {
|
||||
return stream << "(" << v.id_ << ")";
|
||||
}
|
||||
|
||||
bool operator==(const Vertex &v) const { return this->id_ == v.id_; }
|
||||
bool operator!=(const Vertex &v) const { return !(*this == v); }
|
||||
|
||||
private:
|
||||
// shared pointers to outgoing and incoming edges are used so that when
|
||||
// a Vertex is copied it still points to the same connectivity storage
|
||||
std::shared_ptr<std::vector<Edge>> in_ = std::make_shared<std::vector<Edge>>();
|
||||
std::shared_ptr<std::vector<Edge>> out_ = std::make_shared<std::vector<Edge>>();
|
||||
|
||||
// Vertex counter, used for generating IDs
|
||||
static int counter_;
|
||||
|
||||
};
|
||||
|
||||
int Vertex::counter_ = 0;
|
||||
|
||||
/**
|
||||
* An Edge class for traversal testing. Has only traversal capabilities
|
||||
* and an exposed id_ member.
|
||||
*/
|
||||
class Edge {
|
||||
public:
|
||||
// unique identifier (uniqueness guaranteed by this class)
|
||||
const int id_;
|
||||
|
||||
// vertex set by the user, for testing purposes
|
||||
const int type_;
|
||||
|
||||
Edge(const Vertex &from, const Vertex &to, int type=0) :
|
||||
id_(counter_++), from_(from), to_(to), type_(type) {
|
||||
from.out_->emplace_back(*this);
|
||||
to.in_->emplace_back(*this);
|
||||
}
|
||||
|
||||
const Vertex &from() const { return from_; }
|
||||
const Vertex &to() const { return to_; }
|
||||
|
||||
bool operator==(const Edge &e) const { return id_ == e.id_; }
|
||||
bool operator!=(const Edge &e) const { return !(*this == e); }
|
||||
|
||||
friend std::ostream &operator<<(std::ostream &stream, const Edge &e) {
|
||||
return stream << "[" << e.id_ << "]";
|
||||
}
|
||||
|
||||
private:
|
||||
const Vertex &from_;
|
||||
const Vertex &to_;
|
||||
|
||||
// Edge counter, used for generating IDs
|
||||
static int counter_;
|
||||
};
|
||||
|
||||
int Edge::counter_ = 0;
|
||||
|
||||
// expose Path and Paths as class template instantiations
|
||||
using Path = traversal_template::Path<Vertex, Edge>;
|
||||
using Paths = traversal_template::Paths<Vertex, Edge>;
|
||||
|
||||
/**
|
||||
* Specialization of the traversal_template::Begin function.
|
||||
*/
|
||||
template<typename TCollection>
|
||||
auto Begin(const TCollection &vertices, std::function<bool(const Vertex &)> vertex_filter = {}) {
|
||||
return traversal_template::Begin<TCollection, Vertex, Edge>(vertices, vertex_filter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Specialization of the traversal_template::Cartesian function that accepts
|
||||
* a single argument.
|
||||
*/
|
||||
template<typename TVisitable>
|
||||
auto Cartesian(TVisitable &&visitable) {
|
||||
return traversal_template::Cartesian<TVisitable, Vertex, Edge>(
|
||||
std::forward<TVisitable>(visitable));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Specialization of the traversal_template::Cartesian function that accepts
|
||||
* multiple arguments.
|
||||
*/
|
||||
// TODO (code-review) can this be specialized more elegantly?
|
||||
template<typename TVisitableFirst, typename... TVisitableOthers>
|
||||
auto Cartesian(TVisitableFirst &&first, TVisitableOthers &&... others) {
|
||||
return traversal_template::CartesianBinaryType<TVisitableFirst, decltype(Cartesian(
|
||||
std::forward<TVisitableOthers>(others)...)),
|
||||
Vertex, Edge>(
|
||||
std::forward<TVisitableFirst>(first),
|
||||
Cartesian(std::forward<TVisitableOthers>(others)...)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Hash calculations for text vertex, edge, Path and Paths.
|
||||
* Only for testing purposes.
|
||||
*/
|
||||
namespace std{
|
||||
|
||||
template <>
|
||||
class hash<traversal_test::Vertex> {
|
||||
public:
|
||||
size_t operator()(const traversal_test::Vertex &vertex) const {
|
||||
return (size_t) vertex.id_;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
class hash<traversal_test::Edge> {
|
||||
public:
|
||||
size_t operator()(const traversal_test::Edge &edge) const {
|
||||
return (size_t) edge.id_;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
class hash<traversal_test::Path> {
|
||||
public:
|
||||
std::size_t operator()(const traversal_test::Path &path) const {
|
||||
std::size_t r_val = 0;
|
||||
|
||||
for (const auto &vertex : path.Vertices())
|
||||
r_val ^= std::hash<traversal_test::Vertex>{}(vertex);
|
||||
|
||||
return r_val;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
class hash<traversal_test::Paths> {
|
||||
public:
|
||||
std::size_t operator()(const traversal_test::Paths &paths) const {
|
||||
std::size_t r_val = 0;
|
||||
|
||||
for (const auto &path : paths)
|
||||
r_val ^= std::hash<traversal_test::Path>{}(path);
|
||||
|
||||
return r_val;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -6,10 +6,196 @@
|
||||
#include <vector>
|
||||
#include <list>
|
||||
#include <unordered_set>
|
||||
#include <iostream>
|
||||
#include <list>
|
||||
#include <memory>
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
#include "traversal/test.hpp"
|
||||
#include "traversal/enums.hpp"
|
||||
#include "traversal/path.hpp"
|
||||
#include "traversal/templates.hpp"
|
||||
|
||||
/**
|
||||
* A specialization of the "traversal" namespace that uses
|
||||
* test Vertex and Edge classes (as opposed to the real database
|
||||
* ones).
|
||||
*/
|
||||
namespace traversal_test {
|
||||
|
||||
// add the standard enums to this namespace
|
||||
using Direction = traversal_template::Direction;
|
||||
using Expansion = traversal_template::Expansion;
|
||||
using Uniqueness = traversal_template::Uniqueness;
|
||||
|
||||
// forward declaring Edge because Vertex holds references to it
|
||||
class Edge;
|
||||
|
||||
/**
|
||||
* A Vertex class for traversal testing. Has only the
|
||||
* traversal capabilities and an exposed id_ member.
|
||||
*/
|
||||
class Vertex {
|
||||
friend class Edge;
|
||||
|
||||
public:
|
||||
// unique identifier (uniqueness guaranteed by this class)
|
||||
const int id_;
|
||||
|
||||
// vertex set by the user, for testing purposes
|
||||
const int label_;
|
||||
|
||||
Vertex(int label=0) : id_(counter_++), label_(label) {}
|
||||
|
||||
const auto &in() const { return *in_; }
|
||||
const auto &out() const { return *out_; }
|
||||
|
||||
friend std::ostream &operator<<(std::ostream &stream, const Vertex &v) {
|
||||
return stream << "(" << v.id_ << ")";
|
||||
}
|
||||
|
||||
bool operator==(const Vertex &v) const { return this->id_ == v.id_; }
|
||||
bool operator!=(const Vertex &v) const { return !(*this == v); }
|
||||
|
||||
private:
|
||||
// shared pointers to outgoing and incoming edges are used so that when
|
||||
// a Vertex is copied it still points to the same connectivity storage
|
||||
std::shared_ptr<std::vector<Edge>> in_ = std::make_shared<std::vector<Edge>>();
|
||||
std::shared_ptr<std::vector<Edge>> out_ = std::make_shared<std::vector<Edge>>();
|
||||
|
||||
// Vertex counter, used for generating IDs
|
||||
static int counter_;
|
||||
|
||||
};
|
||||
|
||||
int Vertex::counter_ = 0;
|
||||
|
||||
/**
|
||||
* An Edge class for traversal testing. Has only traversal capabilities
|
||||
* and an exposed id_ member.
|
||||
*/
|
||||
class Edge {
|
||||
public:
|
||||
// unique identifier (uniqueness guaranteed by this class)
|
||||
const int id_;
|
||||
|
||||
// vertex set by the user, for testing purposes
|
||||
const int type_;
|
||||
|
||||
Edge(const Vertex &from, const Vertex &to, int type=0) :
|
||||
id_(counter_++), from_(from), to_(to), type_(type) {
|
||||
from.out_->emplace_back(*this);
|
||||
to.in_->emplace_back(*this);
|
||||
}
|
||||
|
||||
const Vertex &from() const { return from_; }
|
||||
const Vertex &to() const { return to_; }
|
||||
|
||||
bool operator==(const Edge &e) const { return id_ == e.id_; }
|
||||
bool operator!=(const Edge &e) const { return !(*this == e); }
|
||||
|
||||
friend std::ostream &operator<<(std::ostream &stream, const Edge &e) {
|
||||
return stream << "[" << e.id_ << "]";
|
||||
}
|
||||
|
||||
private:
|
||||
const Vertex &from_;
|
||||
const Vertex &to_;
|
||||
|
||||
// Edge counter, used for generating IDs
|
||||
static int counter_;
|
||||
};
|
||||
|
||||
int Edge::counter_ = 0;
|
||||
|
||||
// expose Path and Paths as class template instantiations
|
||||
using Path = traversal_template::Path<Vertex, Edge>;
|
||||
using Paths = traversal_template::Paths<Vertex, Edge>;
|
||||
|
||||
/**
|
||||
* Specialization of the traversal_template::Begin function.
|
||||
*/
|
||||
template<typename TCollection>
|
||||
auto Begin(const TCollection &vertices, std::function<bool(const Vertex &)> vertex_filter = {}) {
|
||||
return traversal_template::Begin<TCollection, Vertex, Edge>(vertices, vertex_filter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Specialization of the traversal_template::Cartesian function that accepts
|
||||
* a single argument.
|
||||
*/
|
||||
template<typename TVisitable>
|
||||
auto Cartesian(TVisitable &&visitable) {
|
||||
return traversal_template::Cartesian<TVisitable, Vertex, Edge>(
|
||||
std::forward<TVisitable>(visitable));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Specialization of the traversal_template::Cartesian function that accepts
|
||||
* multiple arguments.
|
||||
*/
|
||||
// TODO (code-review) can this be specialized more elegantly?
|
||||
template<typename TVisitableFirst, typename... TVisitableOthers>
|
||||
auto Cartesian(TVisitableFirst &&first, TVisitableOthers &&... others) {
|
||||
return traversal_template::CartesianBinaryType<TVisitableFirst, decltype(Cartesian(
|
||||
std::forward<TVisitableOthers>(others)...)),
|
||||
Vertex, Edge>(
|
||||
std::forward<TVisitableFirst>(first),
|
||||
Cartesian(std::forward<TVisitableOthers>(others)...)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Hash calculations for text vertex, edge, Path and Paths.
|
||||
* Only for testing purposes.
|
||||
*/
|
||||
namespace std{
|
||||
|
||||
template <>
|
||||
class hash<traversal_test::Vertex> {
|
||||
public:
|
||||
size_t operator()(const traversal_test::Vertex &vertex) const {
|
||||
return (size_t) vertex.id_;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
class hash<traversal_test::Edge> {
|
||||
public:
|
||||
size_t operator()(const traversal_test::Edge &edge) const {
|
||||
return (size_t) edge.id_;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
class hash<traversal_test::Path> {
|
||||
public:
|
||||
std::size_t operator()(const traversal_test::Path &path) const {
|
||||
std::size_t r_val = 0;
|
||||
|
||||
for (const auto &vertex : path.Vertices())
|
||||
r_val ^= std::hash<traversal_test::Vertex>{}(vertex);
|
||||
|
||||
return r_val;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
class hash<traversal_test::Paths> {
|
||||
public:
|
||||
std::size_t operator()(const traversal_test::Paths &paths) const {
|
||||
std::size_t r_val = 0;
|
||||
|
||||
for (const auto &path : paths)
|
||||
r_val ^= std::hash<traversal_test::Path>{}(path);
|
||||
|
||||
return r_val;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Hash for a list of edges, used in tests.
|
||||
|
Loading…
Reference in New Issue
Block a user