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 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests tuple's default constructor. 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(TupleConstructorTest, DefaultConstructor) { 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We are just testing that the following compiles. 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<> empty; 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<int> one_field; 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<double, char, bool*> three_fields; 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests constructing a tuple from its fields. 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(TupleConstructorTest, ConstructsFromFields) { 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int n = 1; 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Reference field. 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<int&> a(n); 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&n, &(get<0>(a))); 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Non-reference fields. 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<int, char> b(5, 'a'); 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, get<0>(b)); 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ('a', get<1>(b)); 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Const reference field. 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const int m = 2; 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<bool, const int&> c(true, m); 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(get<0>(c)); 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&m, &(get<1>(c))); 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests tuple's copy constructor. 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(TupleConstructorTest, CopyConstructor) { 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<double, bool> a(0.0, true); 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<double, bool> b(a); 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DOUBLE_EQ(0.0, get<0>(b)); 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(get<1>(b)); 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests constructing a tuple from another tuple that has a compatible 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// but different type. 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(TupleConstructorTest, ConstructsFromDifferentTupleType) { 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<int, int, char> a(0, 1, 'a'); 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<double, long, int> b(a); 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DOUBLE_EQ(0.0, get<0>(b)); 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, get<1>(b)); 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ('a', get<2>(b)); 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests constructing a 2-tuple from an std::pair. 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(TupleConstructorTest, ConstructsFromPair) { 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ::std::pair<int, char> a(1, 'a'); 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<int, char> b(a); 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<int, const char&> c(a); 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests assigning a tuple to another tuple with the same type. 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(TupleAssignmentTest, AssignsToSameTupleType) { 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const tuple<int, long> a(5, 7L); 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<int, long> b; 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville b = a; 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, get<0>(b)); 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(7L, get<1>(b)); 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests assigning a tuple to another tuple with a different but 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// compatible type. 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(TupleAssignmentTest, AssignsToDifferentTupleType) { 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const tuple<int, long, bool> a(1, 7L, true); 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<long, int, bool> b; 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville b = a; 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1L, get<0>(b)); 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(7, get<1>(b)); 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(get<2>(b)); 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests assigning an std::pair to a 2-tuple. 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(TupleAssignmentTest, AssignsFromPair) { 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ::std::pair<int, bool> a(5, true); 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<int, bool> b; 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville b = a; 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, get<0>(b)); 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(get<1>(b)); 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<long, bool> c; 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville c = a; 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5L, get<0>(c)); 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(get<1>(c)); 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A fixture for testing big tuples. 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass BigTupleTest : public testing::Test { 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef tuple<int, int, int, int, int, int, int, int, int, int> BigTuple; 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BigTupleTest() : 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville a_(1, 0, 0, 0, 0, 0, 0, 0, 0, 2), 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville b_(1, 0, 0, 0, 0, 0, 0, 0, 0, 3) {} 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BigTuple a_, b_; 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests constructing big tuples. 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(BigTupleTest, Construction) { 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BigTuple a; 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville BigTuple b(b_); 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that get<N>(t) returns the N-th (0-based) field of tuple t. 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(BigTupleTest, get) { 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, get<0>(a_)); 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, get<9>(a_)); 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Tests that get() works on a const tuple too. 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const BigTuple a(a_); 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, get<0>(a)); 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, get<9>(a)); 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests comparing big tuples. 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(BigTupleTest, Comparisons) { 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(a_ == a_); 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(a_ != a_); 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(a_ != b_); 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(a_ == b_); 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MakeTupleTest, WorksForScalarTypes) { 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<bool, int> a; 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville a = make_tuple(true, 5); 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(get<0>(a)); 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, get<1>(a)); 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<char, int, long> b; 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville b = make_tuple('a', 'b', 5); 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ('a', get<0>(b)); 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ('b', get<1>(b)); 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, get<2>(b)); 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MakeTupleTest, WorksForPointers) { 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int a[] = { 1, 2, 3, 4 }; 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const char* const str = "hi"; 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int* const p = a; 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tuple<const char*, int*> t; 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville t = make_tuple(str, p); 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(str, get<0>(t)); 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(p, get<1>(t)); 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace 289