1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2007, Google Inc. 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// All rights reserved. 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: wan@google.com (Zhanyong Wan) 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/internal/gtest-tuple.h> 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <utility> 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h> 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace { 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing ::std::tr1::get; 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing ::std::tr1::make_tuple; 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing ::std::tr1::tuple; 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing ::std::tr1::tuple_element; 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing ::std::tr1::tuple_size; 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing ::testing::StaticAssertTypeEq; 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that tuple_element<K, tuple<T0, T1, ..., TN> >::type returns TK. 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(tuple_element_Test, ReturnsElementType) { 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville StaticAssertTypeEq<int, tuple_element<0, tuple<int, char> >::type>(); 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville StaticAssertTypeEq<int&, tuple_element<1, tuple<double, int&> >::type>(); 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville StaticAssertTypeEq<bool, tuple_element<2, tuple<double, int, bool> >::type>(); 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that tuple_size<T>::value gives the number of fields in tuple 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// type T. 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(tuple_size_Test, ReturnsNumberOfFields) { 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, +tuple_size<tuple<> >::value); 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, +tuple_size<tuple<void*> >::value); 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, +tuple_size<tuple<char> >::value); 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, +(tuple_size<tuple<tuple<int, double> > >::value)); 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, +(tuple_size<tuple<int&, const char> >::value)); 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(3, +(tuple_size<tuple<char*, void, const bool&> >::value)); 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests comparing a tuple with itself. 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(ComparisonTest, ComparesWithSelf) { 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const tuple<int, char, bool> a(5, 'a', false); 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(a == a); 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(a != a); 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests comparing two tuples with the same value. 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(ComparisonTest, ComparesEqualTuples) { 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const tuple<int, bool> a(5, true), b(5, true); 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(a == b); 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(a != b); 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests comparing two different tuples that have no reference fields. 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(ComparisonTest, ComparesUnequalTuplesWithoutReferenceFields) { 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef tuple<const int, char> FooTuple; 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FooTuple a(0, 'x'); 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FooTuple b(1, 'a'); 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(a != b); 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(a == b); 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FooTuple c(1, 'b'); 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(b != c); 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(b == c); 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests comparing two different tuples that have reference fields. 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(ComparisonTest, ComparesUnequalTuplesWithReferenceFields) { 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef tuple<int&, const char&> FooTuple; 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int i = 5; 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const char ch = 'a'; 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FooTuple a(i, ch); 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int j = 6; 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FooTuple b(j, ch); 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(a != b); 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(a == b); 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville j = 5; 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const char ch2 = 'b'; 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FooTuple c(j, ch2); 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(b != c); 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(b == c); 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that a tuple field with a reference type is an alias of the 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// variable it's supposed to reference. 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(ReferenceFieldTest, IsAliasOfReferencedVariable) { 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int n = 0; 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<bool, int&> t(true, n); 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville n = 1; 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(n, get<1>(t)) 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "Changing a underlying variable should update the reference field."; 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Makes sure that the implementation doesn't do anything funny with 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the & operator for the return type of get<>(). 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&n, &(get<1>(t))) 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "The address of a reference field should equal the address of " 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "the underlying variable."; 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville get<1>(t) = 2; 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, n) 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "Changing a reference field should update the underlying variable."; 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Tests that tuple's default constructor default initializes each field. 1390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This test needs to compile without generating warnings. 1400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTEST(TupleConstructorTest, DefaultConstructorDefaultInitializesEachField) { 1410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson // The TR1 report requires that tuple's default constructor default 1420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson // initializes each field, even if it's a primitive type. If the 1430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson // implementation forgets to do this, this test will catch it by 1440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson // generating warnings about using uninitialized variables (assuming 1450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson // a decent compiler). 1460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<> empty; 1480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson 1490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson tuple<int> a1, b1; 1500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson b1 = a1; 1510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson EXPECT_EQ(0, get<0>(b1)); 1520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson 1530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson tuple<int, double> a2, b2; 1540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson b2 = a2; 1550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson EXPECT_EQ(0, get<0>(b2)); 1560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson EXPECT_EQ(0.0, get<1>(b2)); 1570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson 1580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson tuple<double, char, bool*> a3, b3; 1590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson b3 = a3; 1600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson EXPECT_EQ(0.0, get<0>(b3)); 1610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson EXPECT_EQ('\0', get<1>(b3)); 1620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson EXPECT_TRUE(get<2>(b3) == NULL); 1630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson 1640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson tuple<int, int, int, int, int, int, int, int, int, int> a10, b10; 1650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson b10 = a10; 1660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson EXPECT_EQ(0, get<0>(b10)); 1670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson EXPECT_EQ(0, get<1>(b10)); 1680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson EXPECT_EQ(0, get<2>(b10)); 1690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson EXPECT_EQ(0, get<3>(b10)); 1700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson EXPECT_EQ(0, get<4>(b10)); 1710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson EXPECT_EQ(0, get<5>(b10)); 1720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson EXPECT_EQ(0, get<6>(b10)); 1730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson EXPECT_EQ(0, get<7>(b10)); 1740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson EXPECT_EQ(0, get<8>(b10)); 1750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson EXPECT_EQ(0, get<9>(b10)); 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests constructing a tuple from its fields. 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(TupleConstructorTest, ConstructsFromFields) { 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int n = 1; 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Reference field. 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<int&> a(n); 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&n, &(get<0>(a))); 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Non-reference fields. 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<int, char> b(5, 'a'); 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, get<0>(b)); 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ('a', get<1>(b)); 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Const reference field. 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const int m = 2; 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<bool, const int&> c(true, m); 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(get<0>(c)); 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&m, &(get<1>(c))); 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests tuple's copy constructor. 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(TupleConstructorTest, CopyConstructor) { 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<double, bool> a(0.0, true); 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<double, bool> b(a); 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DOUBLE_EQ(0.0, get<0>(b)); 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(get<1>(b)); 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests constructing a tuple from another tuple that has a compatible 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// but different type. 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(TupleConstructorTest, ConstructsFromDifferentTupleType) { 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<int, int, char> a(0, 1, 'a'); 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<double, long, int> b(a); 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DOUBLE_EQ(0.0, get<0>(b)); 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, get<1>(b)); 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ('a', get<2>(b)); 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests constructing a 2-tuple from an std::pair. 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(TupleConstructorTest, ConstructsFromPair) { 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ::std::pair<int, char> a(1, 'a'); 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<int, char> b(a); 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<int, const char&> c(a); 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests assigning a tuple to another tuple with the same type. 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(TupleAssignmentTest, AssignsToSameTupleType) { 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const tuple<int, long> a(5, 7L); 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<int, long> b; 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville b = a; 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, get<0>(b)); 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(7L, get<1>(b)); 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests assigning a tuple to another tuple with a different but 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// compatible type. 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(TupleAssignmentTest, AssignsToDifferentTupleType) { 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const tuple<int, long, bool> a(1, 7L, true); 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<long, int, bool> b; 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville b = a; 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1L, get<0>(b)); 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(7, get<1>(b)); 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(get<2>(b)); 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests assigning an std::pair to a 2-tuple. 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(TupleAssignmentTest, AssignsFromPair) { 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ::std::pair<int, bool> a(5, true); 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<int, bool> b; 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville b = a; 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, get<0>(b)); 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(get<1>(b)); 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<long, bool> c; 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville c = a; 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5L, get<0>(c)); 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(get<1>(c)); 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A fixture for testing big tuples. 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass BigTupleTest : public testing::Test { 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef tuple<int, int, int, int, int, int, int, int, int, int> BigTuple; 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BigTupleTest() : 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville a_(1, 0, 0, 0, 0, 0, 0, 0, 0, 2), 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville b_(1, 0, 0, 0, 0, 0, 0, 0, 0, 3) {} 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BigTuple a_, b_; 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests constructing big tuples. 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(BigTupleTest, Construction) { 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BigTuple a; 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BigTuple b(b_); 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that get<N>(t) returns the N-th (0-based) field of tuple t. 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(BigTupleTest, get) { 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, get<0>(a_)); 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, get<9>(a_)); 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Tests that get() works on a const tuple too. 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const BigTuple a(a_); 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, get<0>(a)); 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, get<9>(a)); 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests comparing big tuples. 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(BigTupleTest, Comparisons) { 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(a_ == a_); 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(a_ != a_); 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(a_ != b_); 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(a_ == b_); 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MakeTupleTest, WorksForScalarTypes) { 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<bool, int> a; 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville a = make_tuple(true, 5); 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(get<0>(a)); 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, get<1>(a)); 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<char, int, long> b; 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville b = make_tuple('a', 'b', 5); 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ('a', get<0>(b)); 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ('b', get<1>(b)); 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, get<2>(b)); 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MakeTupleTest, WorksForPointers) { 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int a[] = { 1, 2, 3, 4 }; 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const char* const str = "hi"; 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int* const p = a; 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<const char*, int*> t; 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville t = make_tuple(str, p); 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(str, get<0>(t)); 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(p, get<1>(t)); 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace 321