|
| 1 | +#include <gtest/gtest.h> |
| 2 | + |
| 3 | +#include "util/tuple.hpp" |
| 4 | + |
| 5 | +struct some_struct |
| 6 | +{ |
| 7 | + u64 v {}; |
| 8 | + char s[12] = "Hello World"; |
| 9 | + |
| 10 | + bool operator == (const some_struct& r) const |
| 11 | + { |
| 12 | + return v == r.v && std::memcmp(s, r.s, sizeof(s)) == 0; |
| 13 | + } |
| 14 | +}; |
| 15 | + |
| 16 | +TEST(Utils, Tuple) |
| 17 | +{ |
| 18 | + some_struct s {}; |
| 19 | + s.v = 1234; |
| 20 | + |
| 21 | + utils::tuple t0 = {}; |
| 22 | + EXPECT_EQ(t0.size(), 0); |
| 23 | + |
| 24 | + utils::tuple<int> t; |
| 25 | + EXPECT_EQ(sizeof(t), sizeof(int)); |
| 26 | + EXPECT_TRUE((std::is_same_v<decltype(t.get<0>()), int&>)); |
| 27 | + EXPECT_EQ(t.size(), 1); |
| 28 | + EXPECT_EQ(t.get<0>(), 0); |
| 29 | + |
| 30 | + utils::tuple<int> t1 = 2; |
| 31 | + EXPECT_EQ(sizeof(t1), sizeof(int)); |
| 32 | + EXPECT_TRUE((std::is_same_v<decltype(t1.get<0>()), int&>)); |
| 33 | + EXPECT_EQ(t1.size(), 1); |
| 34 | + EXPECT_EQ(t1.get<0>(), 2); |
| 35 | + t1 = {}; |
| 36 | + EXPECT_EQ(t1.size(), 1); |
| 37 | + EXPECT_EQ(t1.get<0>(), 0); |
| 38 | + |
| 39 | + utils::tuple<int, some_struct> t2 = { 2, s }; |
| 40 | + EXPECT_EQ(sizeof(t2), 32); |
| 41 | + EXPECT_EQ(t2.size(), 2); |
| 42 | + EXPECT_TRUE((std::is_same_v<decltype(t2.get<0>()), int&>)); |
| 43 | + EXPECT_TRUE((std::is_same_v<decltype(t2.get<1>()), some_struct&>)); |
| 44 | + EXPECT_EQ(t2.get<0>(), 2); |
| 45 | + EXPECT_EQ(t2.get<1>(), s); |
| 46 | + t2 = {}; |
| 47 | + EXPECT_EQ(t2.size(), 2); |
| 48 | + EXPECT_EQ(t2.get<0>(), 0); |
| 49 | + EXPECT_EQ(t2.get<1>(), some_struct{}); |
| 50 | + |
| 51 | + t2.get<0>() = 666; |
| 52 | + t2.get<1>() = s; |
| 53 | + EXPECT_EQ(t2.get<0>(), 666); |
| 54 | + EXPECT_EQ(t2.get<1>(), s); |
| 55 | + |
| 56 | + utils::tuple<int, some_struct, double> t3 = { 2, s, 1234.0 }; |
| 57 | + EXPECT_EQ(sizeof(t3), 40); |
| 58 | + EXPECT_EQ(t3.size(), 3); |
| 59 | + EXPECT_TRUE((std::is_same_v<decltype(t3.get<0>()), int&>)); |
| 60 | + EXPECT_TRUE((std::is_same_v<decltype(t3.get<1>()), some_struct&>)); |
| 61 | + EXPECT_TRUE((std::is_same_v<decltype(t3.get<2>()), double&>)); |
| 62 | + EXPECT_EQ(t3.get<0>(), 2); |
| 63 | + EXPECT_EQ(t3.get<1>(), s); |
| 64 | + EXPECT_EQ(t3.get<2>(), 1234.0); |
| 65 | + t3 = {}; |
| 66 | + EXPECT_EQ(t3.size(), 3); |
| 67 | + EXPECT_EQ(t3.get<0>(), 0); |
| 68 | + EXPECT_EQ(t3.get<1>(), some_struct{}); |
| 69 | + EXPECT_EQ(t3.get<2>(), 0.0); |
| 70 | + |
| 71 | + t3.get<0>() = 666; |
| 72 | + t3.get<1>() = s; |
| 73 | + t3.get<2>() = 7.0; |
| 74 | + EXPECT_EQ(t3.get<0>(), 666); |
| 75 | + EXPECT_EQ(t3.get<1>(), s); |
| 76 | + EXPECT_EQ(t3.get<2>(), 7.0); |
| 77 | + |
| 78 | + // const |
| 79 | + const utils::tuple<int, some_struct> tc = { 2, s }; |
| 80 | + EXPECT_EQ(tc.size(), 2); |
| 81 | + EXPECT_TRUE((std::is_same_v<decltype(tc.get<0>()), const int&>)); |
| 82 | + EXPECT_TRUE((std::is_same_v<decltype(tc.get<1>()), const some_struct&>)); |
| 83 | + EXPECT_EQ(tc.get<0>(), 2); |
| 84 | + EXPECT_EQ(tc.get<1>(), s); |
| 85 | + |
| 86 | + // assignment |
| 87 | + const utils::tuple<int, some_struct> ta1 = { 2, s }; |
| 88 | + utils::tuple<int, some_struct> ta = ta1; |
| 89 | + EXPECT_EQ(ta.size(), 2); |
| 90 | + EXPECT_TRUE((std::is_same_v<decltype(ta.get<0>()), int&>)); |
| 91 | + EXPECT_TRUE((std::is_same_v<decltype(ta.get<1>()), some_struct&>)); |
| 92 | + EXPECT_EQ(ta.get<0>(), 2); |
| 93 | + EXPECT_EQ(ta.get<1>(), s); |
| 94 | + |
| 95 | + utils::tuple<int, some_struct> ta2 = { 2, s }; |
| 96 | + ta = ta2; |
| 97 | + EXPECT_EQ(ta.size(), 2); |
| 98 | + EXPECT_TRUE((std::is_same_v<decltype(ta.get<0>()), int&>)); |
| 99 | + EXPECT_TRUE((std::is_same_v<decltype(ta.get<1>()), some_struct&>)); |
| 100 | + EXPECT_EQ(ta.get<0>(), 2); |
| 101 | + EXPECT_EQ(ta.get<1>(), s); |
| 102 | + EXPECT_EQ(ta2.size(), 2); |
| 103 | + EXPECT_TRUE((std::is_same_v<decltype(ta2.get<0>()), int&>)); |
| 104 | + EXPECT_TRUE((std::is_same_v<decltype(ta2.get<1>()), some_struct&>)); |
| 105 | + EXPECT_EQ(ta2.get<0>(), 2); |
| 106 | + EXPECT_EQ(ta2.get<1>(), s); |
| 107 | + |
| 108 | + ta = std::move(ta2); |
| 109 | + EXPECT_EQ(ta.size(), 2); |
| 110 | + EXPECT_TRUE((std::is_same_v<decltype(ta.get<0>()), int&>)); |
| 111 | + EXPECT_TRUE((std::is_same_v<decltype(ta.get<1>()), some_struct&>)); |
| 112 | + EXPECT_EQ(ta.get<0>(), 2); |
| 113 | + EXPECT_EQ(ta.get<1>(), s); |
| 114 | +} |
0 commit comments