xref: /aosp_15_r20/external/libchrome/base/tuple_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/tuple.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
8*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
9*635a8641SAndroid Build Coastguard Worker 
10*635a8641SAndroid Build Coastguard Worker namespace base {
11*635a8641SAndroid Build Coastguard Worker 
12*635a8641SAndroid Build Coastguard Worker namespace {
13*635a8641SAndroid Build Coastguard Worker 
DoAdd(int a,int b,int c,int * res)14*635a8641SAndroid Build Coastguard Worker void DoAdd(int a, int b, int c, int* res) {
15*635a8641SAndroid Build Coastguard Worker   *res = a + b + c;
16*635a8641SAndroid Build Coastguard Worker }
17*635a8641SAndroid Build Coastguard Worker 
18*635a8641SAndroid Build Coastguard Worker struct Addy {
19*635a8641SAndroid Build Coastguard Worker   Addy() = default;
DoAddbase::__anondd4236f20111::Addy20*635a8641SAndroid Build Coastguard Worker   void DoAdd(int a, int b, int c, int d, int* res) {
21*635a8641SAndroid Build Coastguard Worker     *res = a + b + c + d;
22*635a8641SAndroid Build Coastguard Worker   }
23*635a8641SAndroid Build Coastguard Worker };
24*635a8641SAndroid Build Coastguard Worker 
25*635a8641SAndroid Build Coastguard Worker struct Addz {
26*635a8641SAndroid Build Coastguard Worker   Addz() = default;
DoAddbase::__anondd4236f20111::Addz27*635a8641SAndroid Build Coastguard Worker   void DoAdd(int a, int b, int c, int d, int e, int* res) {
28*635a8641SAndroid Build Coastguard Worker     *res = a + b + c + d + e;
29*635a8641SAndroid Build Coastguard Worker   }
30*635a8641SAndroid Build Coastguard Worker };
31*635a8641SAndroid Build Coastguard Worker 
32*635a8641SAndroid Build Coastguard Worker }  // namespace
33*635a8641SAndroid Build Coastguard Worker 
TEST(TupleTest,Basic)34*635a8641SAndroid Build Coastguard Worker TEST(TupleTest, Basic) {
35*635a8641SAndroid Build Coastguard Worker   std::tuple<> t0 = std::make_tuple();
36*635a8641SAndroid Build Coastguard Worker   ALLOW_UNUSED_LOCAL(t0);
37*635a8641SAndroid Build Coastguard Worker   std::tuple<int> t1(1);
38*635a8641SAndroid Build Coastguard Worker   std::tuple<int, const char*> t2 =
39*635a8641SAndroid Build Coastguard Worker       std::make_tuple(1, static_cast<const char*>("wee"));
40*635a8641SAndroid Build Coastguard Worker   ALLOW_UNUSED_LOCAL(t2);
41*635a8641SAndroid Build Coastguard Worker   std::tuple<int, int, int> t3(1, 2, 3);
42*635a8641SAndroid Build Coastguard Worker   ALLOW_UNUSED_LOCAL(t3);
43*635a8641SAndroid Build Coastguard Worker   std::tuple<int, int, int, int*> t4(1, 2, 3, &std::get<0>(t1));
44*635a8641SAndroid Build Coastguard Worker   std::tuple<int, int, int, int, int*> t5(1, 2, 3, 4, &std::get<0>(t4));
45*635a8641SAndroid Build Coastguard Worker   std::tuple<int, int, int, int, int, int*> t6(1, 2, 3, 4, 5, &std::get<0>(t4));
46*635a8641SAndroid Build Coastguard Worker 
47*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, std::get<0>(t1));
48*635a8641SAndroid Build Coastguard Worker   DispatchToFunction(&DoAdd, t4);
49*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(6, std::get<0>(t1));
50*635a8641SAndroid Build Coastguard Worker 
51*635a8641SAndroid Build Coastguard Worker   int res = 0;
52*635a8641SAndroid Build Coastguard Worker   DispatchToFunction(&DoAdd, std::make_tuple(9, 8, 7, &res));
53*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(24, res);
54*635a8641SAndroid Build Coastguard Worker 
55*635a8641SAndroid Build Coastguard Worker   Addy addy;
56*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, std::get<0>(t4));
57*635a8641SAndroid Build Coastguard Worker   DispatchToMethod(&addy, &Addy::DoAdd, t5);
58*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(10, std::get<0>(t4));
59*635a8641SAndroid Build Coastguard Worker 
60*635a8641SAndroid Build Coastguard Worker   Addz addz;
61*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(10, std::get<0>(t4));
62*635a8641SAndroid Build Coastguard Worker   DispatchToMethod(&addz, &Addz::DoAdd, t6);
63*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(15, std::get<0>(t4));
64*635a8641SAndroid Build Coastguard Worker }
65*635a8641SAndroid Build Coastguard Worker 
66*635a8641SAndroid Build Coastguard Worker namespace {
67*635a8641SAndroid Build Coastguard Worker 
68*635a8641SAndroid Build Coastguard Worker struct CopyLogger {
CopyLoggerbase::__anondd4236f20211::CopyLogger69*635a8641SAndroid Build Coastguard Worker   CopyLogger() { ++TimesConstructed; }
CopyLoggerbase::__anondd4236f20211::CopyLogger70*635a8641SAndroid Build Coastguard Worker   CopyLogger(const CopyLogger& tocopy) { ++TimesConstructed; ++TimesCopied; }
71*635a8641SAndroid Build Coastguard Worker   ~CopyLogger() = default;
72*635a8641SAndroid Build Coastguard Worker 
73*635a8641SAndroid Build Coastguard Worker   static int TimesCopied;
74*635a8641SAndroid Build Coastguard Worker   static int TimesConstructed;
75*635a8641SAndroid Build Coastguard Worker };
76*635a8641SAndroid Build Coastguard Worker 
SomeLoggerMethRef(const CopyLogger & logy,const CopyLogger * ptr,bool * b)77*635a8641SAndroid Build Coastguard Worker void SomeLoggerMethRef(const CopyLogger& logy, const CopyLogger* ptr, bool* b) {
78*635a8641SAndroid Build Coastguard Worker   *b = &logy == ptr;
79*635a8641SAndroid Build Coastguard Worker }
80*635a8641SAndroid Build Coastguard Worker 
SomeLoggerMethCopy(CopyLogger logy,const CopyLogger * ptr,bool * b)81*635a8641SAndroid Build Coastguard Worker void SomeLoggerMethCopy(CopyLogger logy, const CopyLogger* ptr, bool* b) {
82*635a8641SAndroid Build Coastguard Worker   *b = &logy == ptr;
83*635a8641SAndroid Build Coastguard Worker }
84*635a8641SAndroid Build Coastguard Worker 
85*635a8641SAndroid Build Coastguard Worker int CopyLogger::TimesCopied = 0;
86*635a8641SAndroid Build Coastguard Worker int CopyLogger::TimesConstructed = 0;
87*635a8641SAndroid Build Coastguard Worker 
88*635a8641SAndroid Build Coastguard Worker }  // namespace
89*635a8641SAndroid Build Coastguard Worker 
TEST(TupleTest,Copying)90*635a8641SAndroid Build Coastguard Worker TEST(TupleTest, Copying) {
91*635a8641SAndroid Build Coastguard Worker   CopyLogger logger;
92*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, CopyLogger::TimesCopied);
93*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, CopyLogger::TimesConstructed);
94*635a8641SAndroid Build Coastguard Worker 
95*635a8641SAndroid Build Coastguard Worker   bool res = false;
96*635a8641SAndroid Build Coastguard Worker 
97*635a8641SAndroid Build Coastguard Worker   // Creating the tuple should copy the class to store internally in the tuple.
98*635a8641SAndroid Build Coastguard Worker   std::tuple<CopyLogger, CopyLogger*, bool*> tuple(logger, &logger, &res);
99*635a8641SAndroid Build Coastguard Worker   std::get<CopyLogger*>(tuple) = &std::get<CopyLogger>(tuple);
100*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, CopyLogger::TimesConstructed);
101*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, CopyLogger::TimesCopied);
102*635a8641SAndroid Build Coastguard Worker 
103*635a8641SAndroid Build Coastguard Worker   // Our internal Logger and the one passed to the function should be the same.
104*635a8641SAndroid Build Coastguard Worker   res = false;
105*635a8641SAndroid Build Coastguard Worker   DispatchToFunction(&SomeLoggerMethRef, tuple);
106*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(res);
107*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, CopyLogger::TimesConstructed);
108*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, CopyLogger::TimesCopied);
109*635a8641SAndroid Build Coastguard Worker 
110*635a8641SAndroid Build Coastguard Worker   // Now they should be different, since the function call will make a copy.
111*635a8641SAndroid Build Coastguard Worker   res = false;
112*635a8641SAndroid Build Coastguard Worker   DispatchToFunction(&SomeLoggerMethCopy, tuple);
113*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(res);
114*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(3, CopyLogger::TimesConstructed);
115*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, CopyLogger::TimesCopied);
116*635a8641SAndroid Build Coastguard Worker }
117*635a8641SAndroid Build Coastguard Worker 
118*635a8641SAndroid Build Coastguard Worker }  // namespace base
119