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