test_tuple_map.cppΒΆ

// Copyright 2017, 2019, 2021, 2022 by Mark Melton
//

#include <gtest/gtest.h>
#include "core/tuple/map.h"

using namespace core;

TEST(TupleMap, Map)
{
    auto tup = std::make_tuple(1.0, 2.0, 3.0);
    auto r = tp::map([](auto x) { return x + 1.0; }, tup);
    EXPECT_EQ(r, std::make_tuple(2.0, 3.0, 4.0));
}

TEST(TupleMap, MapTwoTuples)
{
    auto tup1 = std::make_tuple(1.0, 2.0, 3.0);
    auto tup2 = std::make_tuple(0.0, 1.0, 2.0);
    auto r = tp::map([](auto x, auto y) { return x - y; }, tup1, tup2);
    EXPECT_EQ(r, std::make_tuple(1.0, 1.0, 1.0));
}

TEST(TupleMap, MapInplace)
{
    auto tup = std::make_tuple(1.0, 2.0, 3.0);
    tp::map_inplace([](auto& x) { x += 1.0; }, tup);
    EXPECT_EQ(std::get<0>(tup), 2.0);
    EXPECT_EQ(std::get<1>(tup), 3.0);
    EXPECT_EQ(std::get<2>(tup), 4.0);
}

TEST(TupleMap, MapInplaceTwoTuples)
{
    auto tup = std::make_tuple(1.0, 2.0, 3.0);
    auto tup2 = std::make_tuple(4.0, 5.0, 6.0);
    tp::map_inplace([](auto& x, auto& y) { x += 1.0; y += 2.0; }, tup, tup2);
    EXPECT_EQ(std::get<0>(tup), 2.0);
    EXPECT_EQ(std::get<1>(tup), 3.0);
    EXPECT_EQ(std::get<2>(tup), 4.0);
    EXPECT_EQ(std::get<0>(tup2), 6.0);
    EXPECT_EQ(std::get<1>(tup2), 7.0);
    EXPECT_EQ(std::get<2>(tup2), 8.0);
}

TEST(TupleMap, MapInplaceAndReturnTuple)
{
    auto tup = std::make_tuple(1.0, 2.0, 3.0);
    auto r = tp::map_inplace([](auto& x) { x += 1; return x; }, tup);
    EXPECT_EQ(tup, std::make_tuple(2.0, 3.0, 4.0));
    EXPECT_EQ(r, std::make_tuple(2.0, 3.0, 4.0));
}

TEST(TupleMap, MapWithStateSum)
{
    struct sum { int operator()(int s, int v) const { return s + v; }};
    auto tup = std::make_tuple(1,2,3,4);
    auto v1 = tp::map(tup, sum(), 0);
    EXPECT_EQ(v1, std::make_tuple(1,3,6,10));
}

TEST(TupleMap, MapWithStateProduct)
{
    struct product { int operator()(int s, int v) const { return s * v; }};
    auto tup = std::make_tuple(1,2,3,4);
    auto v1 = tp::map(tup, product(), 1);
    EXPECT_EQ(v1, std::make_tuple(1,2,6,24));
}

TEST(TupleMap, MapNth)
{
    auto tup = std::make_tuple(1.0, 2.0, 3.0);
    auto r = tp::map_nth([](auto& x) { x += 1.0; return x; }, 1, tup);
    EXPECT_EQ(r, 3.0);
    EXPECT_EQ(std::get<0>(tup), 1.0);
    EXPECT_EQ(std::get<1>(tup), 3.0);
    EXPECT_EQ(std::get<2>(tup), 3.0);
}

int main(int argc, char *argv[])
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}