File: test_hypercube_iterator.cpp

package info (click to toggle)
gridtools 2.3.9-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 29,480 kB
  • sloc: cpp: 228,792; python: 17,561; javascript: 9,164; ansic: 4,101; sh: 850; makefile: 231; f90: 201
file content (89 lines) | stat: -rw-r--r-- 2,539 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
 * GridTools
 *
 * Copyright (c) 2014-2023, ETH Zurich
 * All rights reserved.
 *
 * Please, refer to the LICENSE file in the root directory.
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <gridtools/common/hypercube_iterator.hpp>

#include <gridtools/common/pair.hpp>
#include <gridtools/common/tuple.hpp>
#include <gridtools/common/tuple_util.hpp>
#include <vector>

#include <gmock/gmock.h>
#include <gtest/gtest.h>

using namespace gridtools;

class hypercube_iteration : public ::testing::Test {
    using range_t = std::array<size_t, 2>;
    using data_t = std::vector<std::vector<size_t>>;

  public:
    void expect_ranges(range_t range_i, range_t range_j, range_t range_k) {
        for (size_t i = range_i[0]; i != range_i[1]; ++i)
            for (size_t j = range_j[0]; j != range_j[1]; ++j)
                for (size_t k = range_k[0]; k != range_k[1]; ++k)
                    m_expected.push_back({i, j, k});
    }

    template <class R>
    void call_testee(R &&range) {
        for (auto &&item : make_hypercube_view(range))
            m_actual.push_back({item[0], item[1], item[2]});
    }

    ~hypercube_iteration() { EXPECT_THAT(m_actual, testing::ContainerEq(m_expected)); }

  private:
    data_t m_actual;
    data_t m_expected;
};

TEST_F(hypercube_iteration, view_from_array_of_ranges) {
    expect_ranges({1, 3}, {4, 8}, {2, 10});
    call_testee(array{pair(1, 3), pair(4, 8), pair(2, 10)});
}

TEST_F(hypercube_iteration, view_from_tuple_of_ranges) {
    expect_ranges({1, 3}, {4, 8}, {2, 10});
    call_testee(tuple(pair(1, 3), pair(4, 8), pair(2, 10)));
}

TEST_F(hypercube_iteration, from_array_of_integers) {
    expect_ranges({0, 3}, {0, 8}, {0, 10});
    call_testee(array{3, 8, 10});
}

TEST_F(hypercube_iteration, from_zero_to_zero) {
    expect_ranges({}, {}, {});
    call_testee(array{pair(0, 0), pair(0, 0), pair(0, 0)});
}

TEST_F(hypercube_iteration, from_one_to_one) {
    expect_ranges({}, {}, {});
    call_testee(array{0, 0, 0});
}

TEST(hypercube_view_empty_iteration_space, zero_dimensional_range) {
    int count = 0;
    for (auto it : make_hypercube_view(array<pair<size_t, size_t>, 0>())) {
        static_assert(tuple_util::size<decltype(it)>::value == 0);
        ++count;
    }
    EXPECT_EQ(1, count);
}

TEST(hypercube_view_empty_iteration_space, zero_dimensional_size) {
    int count = 0;
    for (auto it : make_hypercube_view(array<size_t, 0>())) {
        static_assert(tuple_util::size<decltype(it)>::value == 0);
        ++count;
    }
    EXPECT_EQ(1, count);
}