/***************************************************************************
* Copyright (c) Johan Mabille, Sylvain Corlay and Wolf Vollprecht *
* Copyright (c) QuantStack *
* *
* Distributed under the terms of the BSD 3-Clause License. *
* *
* The full license is in the file LICENSE, distributed with this software. *
****************************************************************************/
#include "xtensor/containers/xarray.hpp"
#include "xtensor/views/xaxis_slice_iterator.hpp"
#include "test_common_macros.hpp"
namespace xt
{
using std::size_t;
xarray get_slice_test_array()
{
xarray res = {
{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}},
{{13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}}
};
return res;
}
TEST(xaxis_slice_iterator, begin)
{
xarray a = get_slice_test_array();
auto iter_begin = axis_slice_begin(a, 0);
EXPECT_EQ(size_t(1), iter_begin->dimension());
EXPECT_EQ(a.shape()[0], iter_begin->shape()[0]);
EXPECT_EQ(a(0, 0, 0), (*iter_begin)(0));
EXPECT_EQ(a(1, 0, 0), (*iter_begin)(1));
}
TEST(xaxis_slice_iterator, end)
{
xarray a = get_slice_test_array();
xarray a_col = get_slice_test_array();
auto dist = std::distance(axis_slice_begin(a, 0), axis_slice_end(a, 0));
EXPECT_EQ(12, dist);
dist = std::distance(axis_slice_begin(a_col), axis_slice_end(a_col));
EXPECT_EQ(12, dist);
dist = std::distance(axis_slice_begin(a, 1), axis_slice_end(a, 1));
EXPECT_EQ(8, dist);
dist = std::distance(axis_slice_begin(a_col, 1), axis_slice_end(a_col, 1));
EXPECT_EQ(8, dist);
dist = std::distance(axis_slice_begin(a, 2), axis_slice_end(a, 2));
EXPECT_EQ(6, dist);
dist = std::distance(axis_slice_begin(a_col, 2), axis_slice_end(a_col, 2));
EXPECT_EQ(6, dist);
}
TEST(xaxis_slice_iterator, increment)
{
xarray a = get_slice_test_array();
auto iter = axis_slice_begin(a, 0);
++iter;
EXPECT_EQ(size_t(1), iter->dimension());
EXPECT_EQ(a.shape()[0], iter->shape()[0]);
EXPECT_EQ(a(0, 0, 1), (*iter)(0));
EXPECT_EQ(a(1, 0, 1), (*iter)(1));
}
TEST(xaxis_slice_iterator, const_array)
{
const xarray a = get_slice_test_array();
auto iter = axis_slice_begin(a, 2);
++iter;
EXPECT_EQ(size_t(1), iter->dimension());
EXPECT_EQ(a.shape()[2], iter->shape()[0]);
EXPECT_EQ(a(0, 1, 0), (*iter)(0));
EXPECT_EQ(a(0, 1, 1), (*iter)(1));
EXPECT_EQ(a(0, 1, 2), (*iter)(2));
EXPECT_EQ(a(0, 1, 3), (*iter)(3));
}
TEST(xaxis_slice_iterator, axis_0)
{
xarray a = get_slice_test_array();
auto iter = axis_slice_begin(a, size_t(0));
EXPECT_EQ(a(0, 0, 0), (*iter)(0));
EXPECT_EQ(a(1, 0, 0), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 0, 1), (*iter)(0));
EXPECT_EQ(a(1, 0, 1), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 0, 2), (*iter)(0));
EXPECT_EQ(a(1, 0, 2), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 0, 3), (*iter)(0));
EXPECT_EQ(a(1, 0, 3), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 1, 0), (*iter)(0));
EXPECT_EQ(a(1, 1, 0), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 1, 1), (*iter)(0));
EXPECT_EQ(a(1, 1, 1), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 1, 2), (*iter)(0));
EXPECT_EQ(a(1, 1, 2), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 1, 3), (*iter)(0));
EXPECT_EQ(a(1, 1, 3), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 2, 0), (*iter)(0));
EXPECT_EQ(a(1, 2, 0), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 2, 1), (*iter)(0));
EXPECT_EQ(a(1, 2, 1), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 2, 2), (*iter)(0));
EXPECT_EQ(a(1, 2, 2), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 2, 3), (*iter)(0));
EXPECT_EQ(a(1, 2, 3), (*iter)(1));
}
TEST(xaxis_slice_iterator, axis_0_col)
{
xarray a = get_slice_test_array();
auto iter = axis_slice_begin(a, size_t(0));
EXPECT_EQ(a(0, 0, 0), (*iter)(0));
EXPECT_EQ(a(1, 0, 0), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 1, 0), (*iter)(0));
EXPECT_EQ(a(1, 1, 0), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 2, 0), (*iter)(0));
EXPECT_EQ(a(1, 2, 0), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 0, 1), (*iter)(0));
EXPECT_EQ(a(1, 0, 1), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 1, 1), (*iter)(0));
EXPECT_EQ(a(1, 1, 1), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 2, 1), (*iter)(0));
EXPECT_EQ(a(1, 2, 1), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 0, 2), (*iter)(0));
EXPECT_EQ(a(1, 0, 2), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 1, 2), (*iter)(0));
EXPECT_EQ(a(1, 1, 2), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 2, 2), (*iter)(0));
EXPECT_EQ(a(1, 2, 2), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 0, 3), (*iter)(0));
EXPECT_EQ(a(1, 0, 3), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 1, 3), (*iter)(0));
EXPECT_EQ(a(1, 1, 3), (*iter)(1));
++iter;
EXPECT_EQ(a(0, 2, 3), (*iter)(0));
EXPECT_EQ(a(1, 2, 3), (*iter)(1));
}
TEST(xaxis_slice_iterator, axis_1)
{
xarray a = get_slice_test_array();
auto iter = axis_slice_begin(a, size_t(1));
EXPECT_EQ(a(0, 0, 0), (*iter)(0));
EXPECT_EQ(a(0, 1, 0), (*iter)(1));
EXPECT_EQ(a(0, 2, 0), (*iter)(2));
++iter;
EXPECT_EQ(a(0, 0, 1), (*iter)(0));
EXPECT_EQ(a(0, 1, 1), (*iter)(1));
EXPECT_EQ(a(0, 2, 1), (*iter)(2));
++iter;
EXPECT_EQ(a(0, 0, 2), (*iter)(0));
EXPECT_EQ(a(0, 1, 2), (*iter)(1));
EXPECT_EQ(a(0, 2, 2), (*iter)(2));
++iter;
EXPECT_EQ(a(0, 0, 3), (*iter)(0));
EXPECT_EQ(a(0, 1, 3), (*iter)(1));
EXPECT_EQ(a(0, 2, 3), (*iter)(2));
++iter;
EXPECT_EQ(a(1, 0, 0), (*iter)(0));
EXPECT_EQ(a(1, 1, 0), (*iter)(1));
EXPECT_EQ(a(1, 2, 0), (*iter)(2));
++iter;
EXPECT_EQ(a(1, 0, 1), (*iter)(0));
EXPECT_EQ(a(1, 1, 1), (*iter)(1));
EXPECT_EQ(a(1, 2, 1), (*iter)(2));
++iter;
EXPECT_EQ(a(1, 0, 2), (*iter)(0));
EXPECT_EQ(a(1, 1, 2), (*iter)(1));
EXPECT_EQ(a(1, 2, 2), (*iter)(2));
++iter;
EXPECT_EQ(a(1, 0, 3), (*iter)(0));
EXPECT_EQ(a(1, 1, 3), (*iter)(1));
EXPECT_EQ(a(1, 2, 3), (*iter)(2));
}
TEST(xaxis_slice_iterator, axis_1_col)
{
xarray a = get_slice_test_array();
auto iter = axis_slice_begin(a, size_t(1));
EXPECT_EQ(a(0, 0, 0), (*iter)(0));
EXPECT_EQ(a(0, 1, 0), (*iter)(1));
EXPECT_EQ(a(0, 2, 0), (*iter)(2));
++iter;
EXPECT_EQ(a(1, 0, 0), (*iter)(0));
EXPECT_EQ(a(1, 1, 0), (*iter)(1));
EXPECT_EQ(a(1, 2, 0), (*iter)(2));
++iter;
EXPECT_EQ(a(0, 0, 1), (*iter)(0));
EXPECT_EQ(a(0, 1, 1), (*iter)(1));
EXPECT_EQ(a(0, 2, 1), (*iter)(2));
++iter;
EXPECT_EQ(a(1, 0, 1), (*iter)(0));
EXPECT_EQ(a(1, 1, 1), (*iter)(1));
EXPECT_EQ(a(1, 2, 1), (*iter)(2));
++iter;
EXPECT_EQ(a(0, 0, 2), (*iter)(0));
EXPECT_EQ(a(0, 1, 2), (*iter)(1));
EXPECT_EQ(a(0, 2, 2), (*iter)(2));
++iter;
EXPECT_EQ(a(1, 0, 2), (*iter)(0));
EXPECT_EQ(a(1, 1, 2), (*iter)(1));
EXPECT_EQ(a(1, 2, 2), (*iter)(2));
++iter;
EXPECT_EQ(a(0, 0, 3), (*iter)(0));
EXPECT_EQ(a(0, 1, 3), (*iter)(1));
EXPECT_EQ(a(0, 2, 3), (*iter)(2));
++iter;
EXPECT_EQ(a(1, 0, 3), (*iter)(0));
EXPECT_EQ(a(1, 1, 3), (*iter)(1));
EXPECT_EQ(a(1, 2, 3), (*iter)(2));
}
TEST(xaxis_slice_iterator, axis_2)
{
xarray a = get_slice_test_array();
auto iter = axis_slice_begin(a, size_t(2));
EXPECT_EQ(a(0, 0, 0), (*iter)(0));
EXPECT_EQ(a(0, 0, 1), (*iter)(1));
EXPECT_EQ(a(0, 0, 2), (*iter)(2));
EXPECT_EQ(a(0, 0, 3), (*iter)(3));
++iter;
EXPECT_EQ(a(0, 1, 0), (*iter)(0));
EXPECT_EQ(a(0, 1, 1), (*iter)(1));
EXPECT_EQ(a(0, 1, 2), (*iter)(2));
EXPECT_EQ(a(0, 1, 3), (*iter)(3));
++iter;
EXPECT_EQ(a(0, 2, 0), (*iter)(0));
EXPECT_EQ(a(0, 2, 1), (*iter)(1));
EXPECT_EQ(a(0, 2, 2), (*iter)(2));
EXPECT_EQ(a(0, 2, 3), (*iter)(3));
++iter;
EXPECT_EQ(a(1, 0, 0), (*iter)(0));
EXPECT_EQ(a(1, 0, 1), (*iter)(1));
EXPECT_EQ(a(1, 0, 2), (*iter)(2));
EXPECT_EQ(a(1, 0, 3), (*iter)(3));
++iter;
EXPECT_EQ(a(1, 1, 0), (*iter)(0));
EXPECT_EQ(a(1, 1, 1), (*iter)(1));
EXPECT_EQ(a(1, 1, 2), (*iter)(2));
EXPECT_EQ(a(1, 1, 3), (*iter)(3));
++iter;
EXPECT_EQ(a(1, 2, 0), (*iter)(0));
EXPECT_EQ(a(1, 2, 1), (*iter)(1));
EXPECT_EQ(a(1, 2, 2), (*iter)(2));
EXPECT_EQ(a(1, 2, 3), (*iter)(3));
}
TEST(xaxis_slice_iterator, axis_2_col)
{
xarray a = get_slice_test_array();
auto iter = axis_slice_begin(a, size_t(2));
EXPECT_EQ(a(0, 0, 0), (*iter)(0));
EXPECT_EQ(a(0, 0, 1), (*iter)(1));
EXPECT_EQ(a(0, 0, 2), (*iter)(2));
EXPECT_EQ(a(0, 0, 3), (*iter)(3));
++iter;
EXPECT_EQ(a(1, 0, 0), (*iter)(0));
EXPECT_EQ(a(1, 0, 1), (*iter)(1));
EXPECT_EQ(a(1, 0, 2), (*iter)(2));
EXPECT_EQ(a(1, 0, 3), (*iter)(3));
++iter;
EXPECT_EQ(a(0, 1, 0), (*iter)(0));
EXPECT_EQ(a(0, 1, 1), (*iter)(1));
EXPECT_EQ(a(0, 1, 2), (*iter)(2));
EXPECT_EQ(a(0, 1, 3), (*iter)(3));
++iter;
EXPECT_EQ(a(1, 1, 0), (*iter)(0));
EXPECT_EQ(a(1, 1, 1), (*iter)(1));
EXPECT_EQ(a(1, 1, 2), (*iter)(2));
EXPECT_EQ(a(1, 1, 3), (*iter)(3));
++iter;
EXPECT_EQ(a(0, 2, 0), (*iter)(0));
EXPECT_EQ(a(0, 2, 1), (*iter)(1));
EXPECT_EQ(a(0, 2, 2), (*iter)(2));
EXPECT_EQ(a(0, 2, 3), (*iter)(3));
++iter;
EXPECT_EQ(a(1, 2, 0), (*iter)(0));
EXPECT_EQ(a(1, 2, 1), (*iter)(1));
EXPECT_EQ(a(1, 2, 2), (*iter)(2));
EXPECT_EQ(a(1, 2, 3), (*iter)(3));
}
}