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