Serenity Operating System
1/*
2 * Copyright (c) 2021, Ali Mohammad Pur <mpfard@serenity.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <LibTest/TestSuite.h>
8
9#include <AK/Tuple.h>
10
11TEST_CASE(basic)
12{
13 Tuple<int, DeprecatedString> value { 1, "foo" };
14 EXPECT_EQ(value.get<int>(), 1);
15 EXPECT_EQ(value.get<DeprecatedString>(), "foo");
16 EXPECT_EQ(value.get<0>(), 1);
17 EXPECT_EQ(value.get<1>(), "foo");
18
19 // Move assignment
20 value = { 2, "bar" };
21 EXPECT_EQ(value.get<int>(), 2);
22 EXPECT_EQ(value.get<DeprecatedString>(), "bar");
23 EXPECT_EQ(value.get<0>(), 2);
24 EXPECT_EQ(value.get<1>(), "bar");
25
26 // Copy ctor
27 auto other_value { value };
28 EXPECT_EQ(other_value.get<int>(), 2);
29 EXPECT_EQ(other_value.get<DeprecatedString>(), "bar");
30 EXPECT_EQ(other_value.get<0>(), 2);
31 EXPECT_EQ(other_value.get<1>(), "bar");
32
33 // Move ctor
34 auto moved_to_value { move(value) };
35 EXPECT_EQ(moved_to_value.get<int>(), 2);
36 EXPECT_EQ(moved_to_value.get<DeprecatedString>(), "bar");
37 EXPECT_EQ(moved_to_value.get<0>(), 2);
38 EXPECT_EQ(moved_to_value.get<1>(), "bar");
39
40 // Copy assignment
41 value = moved_to_value;
42 EXPECT_EQ(moved_to_value.get<int>(), 2);
43 EXPECT_EQ(moved_to_value.get<DeprecatedString>(), "bar");
44 EXPECT_EQ(moved_to_value.get<0>(), 2);
45 EXPECT_EQ(moved_to_value.get<1>(), "bar");
46 EXPECT_EQ(value.get<int>(), 2);
47 EXPECT_EQ(value.get<DeprecatedString>(), "bar");
48 EXPECT_EQ(value.get<0>(), 2);
49 EXPECT_EQ(value.get<1>(), "bar");
50}
51
52TEST_CASE(no_copy)
53{
54 struct NoCopy {
55 AK_MAKE_NONCOPYABLE(NoCopy);
56
57 public:
58 NoCopy(NoCopy&&) = default;
59 NoCopy() = default;
60 };
61
62 // Deleted copy ctor should not cause an issue so long as the value isn't copied.
63 Tuple<NoCopy, int, int> value { {}, 1, 2 };
64 auto foo = move(value);
65 EXPECT_EQ(foo.get<1>(), 1);
66 EXPECT_EQ(foo.get<2>(), 2);
67}
68
69TEST_CASE(apply)
70{
71 Tuple<int, int, DeprecatedString> args { 1, 2, "foo" };
72
73 // With copy
74 {
75 bool was_called = false;
76 args.apply_as_args([&](int a, int b, DeprecatedString c) {
77 was_called = true;
78 EXPECT_EQ(a, 1);
79 EXPECT_EQ(b, 2);
80 EXPECT_EQ(c, "foo");
81 });
82 EXPECT(was_called);
83 }
84
85 // With reference
86 {
87 bool was_called = false;
88 args.apply_as_args([&](int& a, int& b, DeprecatedString& c) {
89 was_called = true;
90 EXPECT_EQ(a, 1);
91 EXPECT_EQ(b, 2);
92 EXPECT_EQ(c, "foo");
93 });
94 EXPECT(was_called);
95 }
96
97 // With const reference, taken from a const tuple
98 {
99 bool was_called = false;
100 auto const& args_ref = args;
101 args_ref.apply_as_args([&](int const& a, int const& b, DeprecatedString const& c) {
102 was_called = true;
103 EXPECT_EQ(a, 1);
104 EXPECT_EQ(b, 2);
105 EXPECT_EQ(c, "foo");
106 });
107 EXPECT(was_called);
108 }
109}