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