Serenity Operating System
at master 109 lines 3.0 kB view raw
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}