mirror of
https://github.com/allemangD/toddcox-visualize.git
synced 2025-11-10 12:02:47 -05:00
use gtest
This commit is contained in:
@@ -4,219 +4,124 @@
|
||||
|
||||
#include <tc/pair_map.hpp>
|
||||
|
||||
int test_populate() {
|
||||
auto f = [](size_t i, size_t j) { return ((i + j) << 12) ^ i ^ j; };
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
/// helper for comparing against two options
|
||||
template<typename T, typename U, typename V>
|
||||
testing::AssertionResult AssertEqEither(
|
||||
const char *val_expr,
|
||||
const char *o1_expr,
|
||||
const char *o2_expr,
|
||||
T val, U o1, V o2
|
||||
) {
|
||||
if ((val == o1) || (val == o2)) {
|
||||
return testing::AssertionSuccess();
|
||||
}
|
||||
|
||||
return testing::AssertionFailure()
|
||||
<< val_expr << " (" << val << ") " << "does not equal " << o1_expr
|
||||
<< " (" << o1 << ") " << "or " << o2_expr << " (" << o2 << ")";
|
||||
}
|
||||
|
||||
#define EXPECT_EQ_EITHER(val, o1, o2) EXPECT_PRED_FORMAT3(AssertEqEither, val, o1, o2)
|
||||
|
||||
|
||||
/// Naive symmetric pair hash
|
||||
size_t key(size_t i, size_t j) {
|
||||
return ((i + j) << 12) ^ i ^ j;
|
||||
}
|
||||
|
||||
/// factory to build a simple pair_map
|
||||
tc::pair_map<size_t> populate(size_t size) {
|
||||
tc::pair_map<size_t> pm(6);
|
||||
|
||||
for (int i = 0; i < pm.size(); ++i) {
|
||||
for (int j = i; j < pm.size(); ++j) {
|
||||
pm(i, j) = f(i, j);
|
||||
pm(i, j) = key(i, j);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < pm.size(); ++i) {
|
||||
for (int j = 0; j < pm.size(); ++j) {
|
||||
if (pm(i, j) != (f(i, j))) {
|
||||
std::cerr << "pm(" << i << ", " << j << ") != " << (f(i, j)) << "" << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
if (pm(j, i) != (f(i, j))) {
|
||||
std::cerr << "pm(" << j << ", " << i << ") != " << (f(i, j)) << "" << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
return pm;
|
||||
}
|
||||
|
||||
int test_symmetry() {
|
||||
size_t key = 1;
|
||||
tc::pair_map<size_t> pm(6);
|
||||
|
||||
for (int i = 0; i < pm.size(); ++i) {
|
||||
for (int j = i; j < pm.size(); ++j) {
|
||||
pm(i, j) = key++;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < pm.size(); ++i) {
|
||||
for (int j = 0; j < pm.size(); ++j) {
|
||||
if (pm(i, j) != pm(j, i)) {
|
||||
std::cerr << "pm(" << i << ", " << j << ") != pm(" << j << ", " << i << ")" << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
int test_fill() {
|
||||
TEST(pair_map, fill) {
|
||||
tc::pair_map<size_t> pm(6, 42);
|
||||
|
||||
for (int i = 0; i < pm.size(); ++i) {
|
||||
for (int j = i; j < pm.size(); ++j) {
|
||||
if (pm(i, j) != 42) {
|
||||
std::cerr << "pm(" << i << ", " << j << ") != 42" << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
EXPECT_EQ(pm(i, j), 42);
|
||||
}
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
int test_copy() {
|
||||
auto f = [](size_t i, size_t j) { return ((i + j) << 12) ^ i ^ j; };
|
||||
|
||||
tc::pair_map<size_t> pm(6);
|
||||
TEST(pair_map, symmetry) {
|
||||
auto pm = populate(6);
|
||||
|
||||
for (int i = 0; i < pm.size(); ++i) {
|
||||
for (int j = i; j < pm.size(); ++j) {
|
||||
pm(i, j) = f(i, j);
|
||||
EXPECT_EQ(pm(i, j), key(i, j));
|
||||
EXPECT_EQ(pm(j, i), pm(i, j));
|
||||
}
|
||||
}
|
||||
|
||||
tc::pair_map<size_t> cp = pm;
|
||||
|
||||
for (int i = 0; i < pm.size(); ++i) {
|
||||
for (int j = 0; j < pm.size(); ++j) {
|
||||
if (cp(i, j) != pm(i, j)) {
|
||||
std::cerr << "cp(" << i << ", " << j << ") (" << cp(i, j) << ") != pm(" << i << ", " << j << ") ("
|
||||
<< pm(i, j) << ")" << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
int test_move() {
|
||||
auto f = [](size_t i, size_t j) { return ((i + j) << 12) ^ i ^ j; };
|
||||
TEST(pair_map, copy) {
|
||||
auto pm = populate(6);
|
||||
auto pm_ = pm;
|
||||
|
||||
tc::pair_map<size_t> pm(6);
|
||||
ASSERT_EQ(pm_.size(), 6);
|
||||
|
||||
for (int i = 0; i < pm.size(); ++i) {
|
||||
for (int j = i; j < pm.size(); ++j) {
|
||||
pm(i, j) = f(i, j);
|
||||
for (int i = 0; i < pm_.size(); ++i) {
|
||||
for (int j = i; j < pm_.size(); ++j) {
|
||||
EXPECT_EQ(pm_(i, j), pm(i, j));
|
||||
EXPECT_EQ(pm_(i, j), key(i, j));
|
||||
}
|
||||
}
|
||||
|
||||
tc::pair_map<size_t> cp = std::move(pm);
|
||||
|
||||
for (int i = 0; i < cp.size(); ++i) {
|
||||
for (int j = 0; j < cp.size(); ++j) {
|
||||
if (cp(i, j) != (f(i, j))) {
|
||||
std::cerr << "cp(" << i << ", " << j << ") != " << (f(i, j)) << "" << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
if (cp(j, i) != (f(i, j))) {
|
||||
std::cerr << "cp(" << j << ", " << i << ") != " << (f(i, j)) << "" << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
int test_iterate() {
|
||||
auto f = [](size_t i, size_t j) { return ((i + j) << 12) ^ i ^ j; };
|
||||
TEST(pair_map, move) {
|
||||
auto pm = populate(6);
|
||||
auto pm_ = std::move(pm);
|
||||
|
||||
tc::pair_map<size_t> pm(6);
|
||||
ASSERT_EQ(pm_.size(), 6);
|
||||
|
||||
for (int i = 0; i < pm.size(); ++i) {
|
||||
for (int j = i; j < pm.size(); ++j) {
|
||||
pm(i, j) = f(i, j);
|
||||
for (int i = 0; i < pm_.size(); ++i) {
|
||||
for (int j = i; j < pm_.size(); ++j) {
|
||||
EXPECT_EQ(pm_(i, j), key(i, j));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST(pair_map, iterate) {
|
||||
auto pm = populate(6);
|
||||
|
||||
size_t count = 0;
|
||||
for (const auto &[i, j, m]: pm) {
|
||||
if (m != f(i, j)) {
|
||||
std::cerr << "m (" << m << ") != " << (f(i, j)) << "" << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
EXPECT_EQ(m, key(i, j));
|
||||
count++;
|
||||
}
|
||||
|
||||
if (count != 21) {
|
||||
std::cerr << "count (" << count << ") != " << 21 << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
EXPECT_EQ(count, 21);
|
||||
}
|
||||
|
||||
int test_iterate_ref() {
|
||||
auto f = [](size_t i, size_t j) { return ((i + j) << 12) ^ i ^ j; };
|
||||
|
||||
tc::pair_map<size_t> pm(6);
|
||||
TEST(pair_map, iterate_ref) {
|
||||
auto pm = populate(6);
|
||||
|
||||
for (const auto &[i, j, m]: pm) {
|
||||
m = f(i, j);
|
||||
m = 42;
|
||||
}
|
||||
|
||||
for (const auto &[i, j, m]: pm) {
|
||||
if (m != f(i, j)) {
|
||||
std::cerr << "m (" << m << ") != " << f(i, j) << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
EXPECT_EQ(m, 42);
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
int test_view() {
|
||||
auto f = [](size_t i, size_t j) { return ((i + j) << 12) ^ i ^ j; };
|
||||
|
||||
tc::pair_map<size_t> pm(6);
|
||||
|
||||
for (int i = 0; i < pm.size(); ++i) {
|
||||
for (int j = i; j < pm.size(); ++j) {
|
||||
pm(i, j) = f(i, j);
|
||||
}
|
||||
}
|
||||
TEST(pair_map, view) {
|
||||
auto pm = populate(6);
|
||||
|
||||
size_t count = 0;
|
||||
for (const auto &[i, j, m]: pm.of(4)) {
|
||||
if (i != 4 && j != 4) {
|
||||
std::cerr << i << ", " << j << " != " << 4 << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
EXPECT_EQ_EITHER(4, i, j);
|
||||
count++;
|
||||
}
|
||||
|
||||
if (count != 6) {
|
||||
std::cerr << "count (" << count << ") != " << 6 << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
static std::unordered_map<std::string, std::function<int()>> tests = {
|
||||
{"populate", test_populate},
|
||||
{"symmetry", test_symmetry},
|
||||
{"fill", test_fill},
|
||||
{"copy", test_copy},
|
||||
{"move", test_move},
|
||||
{"iterate", test_iterate},
|
||||
{"iterate_ref", test_iterate_ref},
|
||||
{"view", test_view},
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
std::vector<std::string> args(argv + 1, argv + argc);
|
||||
|
||||
auto it = tests.find(args[0]);
|
||||
if (it == tests.end()) {
|
||||
std::cerr << "Test not found" << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
auto test = it->second;
|
||||
return test();
|
||||
EXPECT_EQ(count, pm.size());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user