Skip to content
Snippets Groups Projects
DatafieldTest.cpp 3.64 KiB
#include "Base/Axis/MakeScale.h"
#include "Base/Axis/Scale.h"
#include "Device/Data/DataUtil.h"
#include "Device/Data/Datafield.h"
#include "Tests/GTestWrapper/google_test.h"

TEST(DatafieldTest, createRearrangedDataSet)
{
    Datafield input_data{
        {newEquiDivision("axis0", 2, 1.0, 2.0), newEquiDivision("axis1", 3, 3.0, 4.0)}};
    input_data.setVector(std::vector<double>{1.0, 2.0, 3.0, 4.0, 5.0, 6.0});

    std::unique_ptr<Datafield> output_data;
    output_data = std::make_unique<Datafield>(DataUtil::createRearrangedDataSet(input_data, 5));

    EXPECT_EQ(size_t(3), output_data->axis(0).size());
    EXPECT_EQ(size_t(2), output_data->axis(1).size());

    EXPECT_EQ(input_data[2], (*output_data)[0]);
    EXPECT_EQ(input_data[5], (*output_data)[1]);
    EXPECT_EQ(input_data[1], (*output_data)[2]);
    EXPECT_EQ(input_data[4], (*output_data)[3]);
    EXPECT_EQ(input_data[0], (*output_data)[4]);
    EXPECT_EQ(input_data[3], (*output_data)[5]);

    output_data = std::make_unique<Datafield>(DataUtil::createRearrangedDataSet(input_data, -6));

    EXPECT_EQ(size_t(2), output_data->axis(0).size());
    EXPECT_EQ(size_t(3), output_data->axis(1).size());

    EXPECT_EQ(input_data[5], (*output_data)[0]);
    EXPECT_EQ(input_data[4], (*output_data)[1]);
    EXPECT_EQ(input_data[3], (*output_data)[2]);
    EXPECT_EQ(input_data[2], (*output_data)[3]);
    EXPECT_EQ(input_data[1], (*output_data)[4]);
    EXPECT_EQ(input_data[0], (*output_data)[5]);

    output_data = std::make_unique<Datafield>(DataUtil::createRearrangedDataSet(input_data, 3));

    EXPECT_EQ(size_t(3), output_data->axis(0).size());
    EXPECT_EQ(size_t(2), output_data->axis(1).size());

    EXPECT_EQ(input_data[3], (*output_data)[0]);
    EXPECT_EQ(input_data[0], (*output_data)[1]);
    EXPECT_EQ(input_data[4], (*output_data)[2]);
    EXPECT_EQ(input_data[1], (*output_data)[3]);
    EXPECT_EQ(input_data[5], (*output_data)[4]);
    EXPECT_EQ(input_data[2], (*output_data)[5]);
}

TEST(DatafieldTest, create2DArrayfromDatafield)
{
    Datafield out_data{
        {newEquiDivision("axis0", 3, 1.0, 3.0), newEquiDivision("axis1", 2, 10., 20.)}};
    EXPECT_EQ(6u, out_data.size());

    EXPECT_EQ(3u, out_data.axis(0).size()); // no. of rows
    EXPECT_EQ(2u, out_data.axis(1).size()); // no. of cols

    std::vector<double> arr_in{1, 2, 3, 4, 5, 6};
    out_data.setVector(arr_in);

    EXPECT_EQ(arr_in[0], out_data[0]);
    EXPECT_EQ(arr_in[1], out_data[1]);
    EXPECT_EQ(arr_in[2], out_data[2]);
    EXPECT_EQ(arr_in[3], out_data[3]);
    EXPECT_EQ(arr_in[4], out_data[4]);
    EXPECT_EQ(arr_in[5], out_data[5]);

    auto arr_out = out_data.flatVector();
    EXPECT_EQ(arr_in, arr_out);

    auto array_2d = out_data.values2D();

    std::vector<std::vector<double>> array_expected_2d{{arr_in[0], arr_in[1], arr_in[2]},
                                                       {arr_in[3], arr_in[4], arr_in[5]}};
    EXPECT_EQ(array_expected_2d, array_2d);
}

TEST(DatafieldTest, vecvecToDatafield)
{
    std::vector<double> arr_in{1, 2, 3, 4, 5, 6};
    std::vector<std::vector<double>> array_2d{{arr_in[0], arr_in[1], arr_in[2]},
                                              {arr_in[3], arr_in[4], arr_in[5]}};
    const Datafield data = DataUtil::vecvecToDatafield(array_2d);
    EXPECT_EQ(arr_in, data.flatVector());
}

TEST(DatafieldTest, DatafieldToVector2D)
{
    Datafield data(
        {newEquiDivision("axis0", 3, 10.0, 20.0), newEquiDivision("axis1", 2, 30.0, 40.0)});
    const std::vector<double> values = {0., 1., 2., 10., 11., 12.};

    data.setVector(values);

    auto vec = data.values2D();
    const std::vector<std::vector<double>> expected = {{0., 1., 2.}, {10., 11., 12.}};
    EXPECT_EQ(vec, expected);
}