#include <vector>
#include "gtest/gtest.h"
TEST(Types, VectorFieldConstruct) {
int n = 5;
v = -3.4;
for (int i = 0; i < n; ++i) {
EXPECT_EQ(-3.4, v(i, 0));
EXPECT_EQ(-3.4, v(i, 1));
}
EXPECT_EQ(a.rows()*a.cols(), a.size());
EXPECT_TRUE((b-v).isZero(0));
std::vector<int> x;
EXPECT_EQ(0, x.size());
for (int i = 0; i < n; ++i) {
EXPECT_EQ(4.1, v(i, 0));
EXPECT_EQ(5.5, v(i, 1));
}
v.c(1) = v.c(0);
for (int i = 0; i < n; ++i) {
EXPECT_EQ(4.1, v(i, 0));
EXPECT_EQ(4.1, v(i, 1));
}
}
TEST(Types, VectorFieldAccess) {
int n = 5;
v.setZero();
v[2][1] = 4;
for (int i = 0; i < n; ++i) {
if (i == 2) {
EXPECT_EQ(0.0, v(i, 0));
EXPECT_EQ(4.0, v(i, 1));
} else {
EXPECT_EQ(0.0, v(i, 0));
EXPECT_EQ(0.0, v(i, 1));
}
}
v(4, 0) = -5.2;
for (int i = 0; i < n; ++i) {
if (i == 2) {
EXPECT_EQ(0.0, v(i, 0));
EXPECT_EQ(4.0, v(i, 1));
} else if (i == 4) {
EXPECT_EQ(-5.2, v(i, 0));
EXPECT_EQ(0.0, v(i, 1));
} else {
EXPECT_EQ(0.0, v(i, 0));
EXPECT_EQ(0.0, v(i, 1));
}
}
for (int i = 0; i < n; ++i) {
if (i == 0) {
EXPECT_EQ(2.4, v(i, 0));
EXPECT_EQ(-1.3, v(i, 1));
} else if (i == 2) {
EXPECT_EQ(0.0, v(i, 0));
EXPECT_EQ(4.0, v(i, 1));
} else if (i == 4) {
EXPECT_EQ(-5.2, v(i, 0));
EXPECT_EQ(0.0, v(i, 1));
} else {
EXPECT_EQ(0.0, v(i, 0));
EXPECT_EQ(0.0, v(i, 1));
}
}
}
TEST(Types, VectorFieldMuliIndexAccess) {
int n = 5;
v.setZero();
v[idx] = 4;
for (int i = 0; i < n; ++i) {
if (i == 1 || i == 2 || i == 3) {
EXPECT_EQ(4.0, v(i, 0));
EXPECT_EQ(4.0, v(i, 1));
EXPECT_EQ(4.0, v(i, 2));
} else {
EXPECT_EQ(0.0, v(i, 0));
EXPECT_EQ(0.0, v(i, 1));
EXPECT_EQ(0.0, v(i, 2));
}
}
v[idx] = {2.3, -4.55, 3.212};
for (int i = 0; i < n; ++i) {
if (i == 1 || i == 2 || i == 3) {
EXPECT_EQ(2.3, v(i, 0));
EXPECT_EQ(-4.55, v(i, 1));
EXPECT_EQ(3.212, v(i, 2));
} else {
EXPECT_EQ(0.0, v(i, 0));
EXPECT_EQ(0.0, v(i, 1));
EXPECT_EQ(0.0, v(i, 2));
}
}
v(idx).setConstant(5);
for (int i = 0; i < n; ++i) {
if (i == 1 || i == 2 || i == 3) {
EXPECT_EQ(5.0, v(i, 0));
EXPECT_EQ(5.0, v(i, 1));
EXPECT_EQ(5.0, v(i, 2));
} else {
EXPECT_EQ(0.0, v(i, 0));
EXPECT_EQ(0.0, v(i, 1));
EXPECT_EQ(0.0, v(i, 2));
}
}
}
TEST(Types, VectorFieldElement) {
v.setZero();
EXPECT_EQ(1, v[3].cols());
EXPECT_EQ(3, v[3].rows());
EXPECT_EQ(c, a);
}
TEST(Types, VectorFieldLinearization) {
int n = 8;
v.setRandom();
Eigen::VectorXd x = v.asLinear();
EXPECT_TRUE((v2-v).isZero(0));
}
TEST(Types, VectorFieldIterate) {
int n = 3;
v.setRandom();
std::vector<double> coef;
for (int i = 0; i < n; ++i) coef.push_back(v(i, 0));
for (int i = 0; i < n; ++i) coef.push_back(v(i, 1));
std::vector<double> coef2;
for (double x : v) coef2.push_back(x);
EXPECT_EQ(coef, coef2);
}
TEST(Types, DISABLED_VectorFieldUsageExample) {
int n = 7;
int s = v.size();
assert(s == v.dim*n);
assert(n == v.rows());
v = 0.0;
v(4, 0) = -1.2;
v[3][1] = 4.5;
v[{1, 3, 4}] =
Vec2d(-4.5, 2.5);
v[{0, 6, 2}] = 0.0;
auto c = v.c(0);
v *= -2.4;
v += v;
std::cout << v << std::endl;
Eigen::VectorXd x = v.asLinear();
(void) s;
(void) c;
}
}