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