#ifndef CVECTORTEST_H
#define CVECTORTEST_H


#include "Types.h"
#include <cmath>

#include "EigenCore.h"


class CVectorTest : public ::testing::Test
{
 protected:
    CVectorTest();
    virtual ~CVectorTest();
};


CVectorTest::CVectorTest()
{
}

CVectorTest::~CVectorTest()
{
}

TEST_F(CVectorTest, TrivialOperations)
{
    kvector_t vec_k(1.,2.,3.);
    EXPECT_EQ( vec_k.complex().z(), complex_t(3.,0.) );

    cvector_t vec_c(complex_t(1.,3.), complex_t(2.,-5.), complex_t(-3.,-4.));
    EXPECT_EQ( -vec_c.z(), complex_t(3.,4.) );
    EXPECT_DOUBLE_EQ( vec_c.mag(), 8. );
}

TEST_F(CVectorTest, BasicArithmetics)
{
    // Dot product with "Eigen" library
    Eigen::Vector3cd va(complex_t(1.,0.), complex_t(2.,0.), complex_t(3.,0.));
    Eigen::Vector3cd vc(complex_t(1.,1.), complex_t(2.,-5.), complex_t(3.,4.));
    EXPECT_TRUE(va.dot(vc) == complex_t(14.,3.));

    // Dot product defined in BasicVector3D
    cvector_t vec_a(complex_t(1.,0.), complex_t(2.,0.), complex_t(3.,0.));
    cvector_t vec_b(complex_t(2.,0.), complex_t(3.,0.), complex_t(4.,0.));
    cvector_t vec_c(complex_t(1.,1.), complex_t(2.,-5.), complex_t(3.,4.));
    EXPECT_TRUE(vec_a.dot(vec_b) == complex_t(20.,0));
    EXPECT_TRUE(vec_a.dot(vec_c) == complex_t(14.,3.));
    EXPECT_TRUE(vec_c.dot(vec_b) == complex_t(20.,-3.));
    EXPECT_TRUE(vec_a.dot(vec_a) == complex_t(14.,0));
    EXPECT_TRUE(vec_c.dot(vec_c) == complex_t(56.,0));

    // f = f_re + j*f_im
    cvector_t vec_e(1.,2.,3.);
    cvector_t vec_f(5.,6.,7.);
    EXPECT_EQ( vec_e+complex_t(0,1)*vec_f,
               cvector_t(complex_t(1.,5.), complex_t(2.,6), complex_t(3,7)) );
}


#endif // CVECTORTEST_H