1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/tuple.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/compiler_specific.h" 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h" 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace { 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DoAdd(int a, int b, int c, int* res) { 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *res = a + b + c; 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct Addy { 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Addy() { } 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void DoAdd(int a, int b, int c, int d, int* res) { 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *res = a + b + c + d; 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct Addz { 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Addz() { } 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void DoAdd(int a, int b, int c, int d, int e, int* res) { 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *res = a + b + c + d + e; 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(TupleTest, Basic) { 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Tuple0 t0 ALLOW_UNUSED = MakeTuple(); 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Tuple1<int> t1(1); 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Tuple2<int, const char*> t2 = MakeTuple(1, static_cast<const char*>("wee")); 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Tuple3<int, int, int> t3(1, 2, 3); 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Tuple4<int, int, int, int*> t4(1, 2, 3, &t1.a); 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Tuple5<int, int, int, int, int*> t5(1, 2, 3, 4, &t4.a); 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Tuple6<int, int, int, int, int, int*> t6(1, 2, 3, 4, 5, &t4.a); 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, t1.a); 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, t2.a); 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, t3.a); 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, t3.b); 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(3, t3.c); 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, t4.a); 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, t4.b); 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(3, t4.c); 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, t5.a); 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, t5.b); 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(3, t5.c); 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(4, t5.d); 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, t6.a); 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, t6.b); 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(3, t6.c); 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(4, t6.d); 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(5, t6.e); 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, t1.a); 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DispatchToFunction(&DoAdd, t4); 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(6, t1.a); 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int res = 0; 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DispatchToFunction(&DoAdd, MakeTuple(9, 8, 7, &res)); 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(24, res); 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Addy addy; 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, t4.a); 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DispatchToMethod(&addy, &Addy::DoAdd, t5); 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(10, t4.a); 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Addz addz; 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(10, t4.a); 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DispatchToMethod(&addz, &Addz::DoAdd, t6); 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(15, t4.a); 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace { 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct CopyLogger { 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CopyLogger() { ++TimesConstructed; } 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CopyLogger(const CopyLogger& tocopy) { ++TimesConstructed; ++TimesCopied; } 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ~CopyLogger() { } 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static int TimesCopied; 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static int TimesConstructed; 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SomeLoggerMethRef(const CopyLogger& logy, const CopyLogger* ptr, bool* b) { 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *b = &logy == ptr; 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SomeLoggerMethCopy(CopyLogger logy, const CopyLogger* ptr, bool* b) { 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *b = &logy == ptr; 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint CopyLogger::TimesCopied = 0; 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint CopyLogger::TimesConstructed = 0; 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(TupleTest, Copying) { 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CopyLogger logger; 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, CopyLogger::TimesCopied); 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, CopyLogger::TimesConstructed); 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool res = false; 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Creating the tuple should copy the class to store internally in the tuple. 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Tuple3<CopyLogger, CopyLogger*, bool*> tuple(logger, &logger, &res); 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tuple.b = &tuple.a; 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, CopyLogger::TimesConstructed); 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, CopyLogger::TimesCopied); 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Our internal Logger and the one passed to the function should be the same. 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott res = false; 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DispatchToFunction(&SomeLoggerMethRef, tuple); 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(res); 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, CopyLogger::TimesConstructed); 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, CopyLogger::TimesCopied); 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Now they should be different, since the function call will make a copy. 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott res = false; 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DispatchToFunction(&SomeLoggerMethCopy, tuple); 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_FALSE(res); 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(3, CopyLogger::TimesConstructed); 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, CopyLogger::TimesCopied); 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 129