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