113481Sgiacomo.travaglini@arm.com// Copyright 2007, Google Inc.
213481Sgiacomo.travaglini@arm.com// All rights reserved.
313481Sgiacomo.travaglini@arm.com//
413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
613481Sgiacomo.travaglini@arm.com// met:
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1013481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1313481Sgiacomo.travaglini@arm.com// distribution.
1413481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
1713481Sgiacomo.travaglini@arm.com//
1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2913481Sgiacomo.travaglini@arm.com//
3013481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan)
3113481Sgiacomo.travaglini@arm.com
3213481Sgiacomo.travaglini@arm.com#include "gtest/internal/gtest-tuple.h"
3313481Sgiacomo.travaglini@arm.com#include <utility>
3413481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h"
3513481Sgiacomo.travaglini@arm.com
3613481Sgiacomo.travaglini@arm.comnamespace {
3713481Sgiacomo.travaglini@arm.com
3813481Sgiacomo.travaglini@arm.comusing ::std::tr1::get;
3913481Sgiacomo.travaglini@arm.comusing ::std::tr1::make_tuple;
4013481Sgiacomo.travaglini@arm.comusing ::std::tr1::tuple;
4113481Sgiacomo.travaglini@arm.comusing ::std::tr1::tuple_element;
4213481Sgiacomo.travaglini@arm.comusing ::std::tr1::tuple_size;
4313481Sgiacomo.travaglini@arm.comusing ::testing::StaticAssertTypeEq;
4413481Sgiacomo.travaglini@arm.com
4513481Sgiacomo.travaglini@arm.com// Tests that tuple_element<K, tuple<T0, T1, ..., TN> >::type returns TK.
4613481Sgiacomo.travaglini@arm.comTEST(tuple_element_Test, ReturnsElementType) {
4713481Sgiacomo.travaglini@arm.com  StaticAssertTypeEq<int, tuple_element<0, tuple<int, char> >::type>();
4813481Sgiacomo.travaglini@arm.com  StaticAssertTypeEq<int&, tuple_element<1, tuple<double, int&> >::type>();
4913481Sgiacomo.travaglini@arm.com  StaticAssertTypeEq<bool, tuple_element<2, tuple<double, int, bool> >::type>();
5013481Sgiacomo.travaglini@arm.com}
5113481Sgiacomo.travaglini@arm.com
5213481Sgiacomo.travaglini@arm.com// Tests that tuple_size<T>::value gives the number of fields in tuple
5313481Sgiacomo.travaglini@arm.com// type T.
5413481Sgiacomo.travaglini@arm.comTEST(tuple_size_Test, ReturnsNumberOfFields) {
5513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, +tuple_size<tuple<> >::value);
5613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, +tuple_size<tuple<void*> >::value);
5713481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, +tuple_size<tuple<char> >::value);
5813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, +(tuple_size<tuple<tuple<int, double> > >::value));
5913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, +(tuple_size<tuple<int&, const char> >::value));
6013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(3, +(tuple_size<tuple<char*, void, const bool&> >::value));
6113481Sgiacomo.travaglini@arm.com}
6213481Sgiacomo.travaglini@arm.com
6313481Sgiacomo.travaglini@arm.com// Tests comparing a tuple with itself.
6413481Sgiacomo.travaglini@arm.comTEST(ComparisonTest, ComparesWithSelf) {
6513481Sgiacomo.travaglini@arm.com  const tuple<int, char, bool> a(5, 'a', false);
6613481Sgiacomo.travaglini@arm.com
6713481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(a == a);
6813481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(a != a);
6913481Sgiacomo.travaglini@arm.com}
7013481Sgiacomo.travaglini@arm.com
7113481Sgiacomo.travaglini@arm.com// Tests comparing two tuples with the same value.
7213481Sgiacomo.travaglini@arm.comTEST(ComparisonTest, ComparesEqualTuples) {
7313481Sgiacomo.travaglini@arm.com  const tuple<int, bool> a(5, true), b(5, true);
7413481Sgiacomo.travaglini@arm.com
7513481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(a == b);
7613481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(a != b);
7713481Sgiacomo.travaglini@arm.com}
7813481Sgiacomo.travaglini@arm.com
7913481Sgiacomo.travaglini@arm.com// Tests comparing two different tuples that have no reference fields.
8013481Sgiacomo.travaglini@arm.comTEST(ComparisonTest, ComparesUnequalTuplesWithoutReferenceFields) {
8113481Sgiacomo.travaglini@arm.com  typedef tuple<const int, char> FooTuple;
8213481Sgiacomo.travaglini@arm.com
8313481Sgiacomo.travaglini@arm.com  const FooTuple a(0, 'x');
8413481Sgiacomo.travaglini@arm.com  const FooTuple b(1, 'a');
8513481Sgiacomo.travaglini@arm.com
8613481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(a != b);
8713481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(a == b);
8813481Sgiacomo.travaglini@arm.com
8913481Sgiacomo.travaglini@arm.com  const FooTuple c(1, 'b');
9013481Sgiacomo.travaglini@arm.com
9113481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(b != c);
9213481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(b == c);
9313481Sgiacomo.travaglini@arm.com}
9413481Sgiacomo.travaglini@arm.com
9513481Sgiacomo.travaglini@arm.com// Tests comparing two different tuples that have reference fields.
9613481Sgiacomo.travaglini@arm.comTEST(ComparisonTest, ComparesUnequalTuplesWithReferenceFields) {
9713481Sgiacomo.travaglini@arm.com  typedef tuple<int&, const char&> FooTuple;
9813481Sgiacomo.travaglini@arm.com
9913481Sgiacomo.travaglini@arm.com  int i = 5;
10013481Sgiacomo.travaglini@arm.com  const char ch = 'a';
10113481Sgiacomo.travaglini@arm.com  const FooTuple a(i, ch);
10213481Sgiacomo.travaglini@arm.com
10313481Sgiacomo.travaglini@arm.com  int j = 6;
10413481Sgiacomo.travaglini@arm.com  const FooTuple b(j, ch);
10513481Sgiacomo.travaglini@arm.com
10613481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(a != b);
10713481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(a == b);
10813481Sgiacomo.travaglini@arm.com
10913481Sgiacomo.travaglini@arm.com  j = 5;
11013481Sgiacomo.travaglini@arm.com  const char ch2 = 'b';
11113481Sgiacomo.travaglini@arm.com  const FooTuple c(j, ch2);
11213481Sgiacomo.travaglini@arm.com
11313481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(b != c);
11413481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(b == c);
11513481Sgiacomo.travaglini@arm.com}
11613481Sgiacomo.travaglini@arm.com
11713481Sgiacomo.travaglini@arm.com// Tests that a tuple field with a reference type is an alias of the
11813481Sgiacomo.travaglini@arm.com// variable it's supposed to reference.
11913481Sgiacomo.travaglini@arm.comTEST(ReferenceFieldTest, IsAliasOfReferencedVariable) {
12013481Sgiacomo.travaglini@arm.com  int n = 0;
12113481Sgiacomo.travaglini@arm.com  tuple<bool, int&> t(true, n);
12213481Sgiacomo.travaglini@arm.com
12313481Sgiacomo.travaglini@arm.com  n = 1;
12413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(n, get<1>(t))
12513481Sgiacomo.travaglini@arm.com      << "Changing a underlying variable should update the reference field.";
12613481Sgiacomo.travaglini@arm.com
12713481Sgiacomo.travaglini@arm.com  // Makes sure that the implementation doesn't do anything funny with
12813481Sgiacomo.travaglini@arm.com  // the & operator for the return type of get<>().
12913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(&n, &(get<1>(t)))
13013481Sgiacomo.travaglini@arm.com      << "The address of a reference field should equal the address of "
13113481Sgiacomo.travaglini@arm.com      << "the underlying variable.";
13213481Sgiacomo.travaglini@arm.com
13313481Sgiacomo.travaglini@arm.com  get<1>(t) = 2;
13413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, n)
13513481Sgiacomo.travaglini@arm.com      << "Changing a reference field should update the underlying variable.";
13613481Sgiacomo.travaglini@arm.com}
13713481Sgiacomo.travaglini@arm.com
13813481Sgiacomo.travaglini@arm.com// Tests that tuple's default constructor default initializes each field.
13913481Sgiacomo.travaglini@arm.com// This test needs to compile without generating warnings.
14013481Sgiacomo.travaglini@arm.comTEST(TupleConstructorTest, DefaultConstructorDefaultInitializesEachField) {
14113481Sgiacomo.travaglini@arm.com  // The TR1 report requires that tuple's default constructor default
14213481Sgiacomo.travaglini@arm.com  // initializes each field, even if it's a primitive type.  If the
14313481Sgiacomo.travaglini@arm.com  // implementation forgets to do this, this test will catch it by
14413481Sgiacomo.travaglini@arm.com  // generating warnings about using uninitialized variables (assuming
14513481Sgiacomo.travaglini@arm.com  // a decent compiler).
14613481Sgiacomo.travaglini@arm.com
14713481Sgiacomo.travaglini@arm.com  tuple<> empty;
14813481Sgiacomo.travaglini@arm.com
14913481Sgiacomo.travaglini@arm.com  tuple<int> a1, b1;
15013481Sgiacomo.travaglini@arm.com  b1 = a1;
15113481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, get<0>(b1));
15213481Sgiacomo.travaglini@arm.com
15313481Sgiacomo.travaglini@arm.com  tuple<int, double> a2, b2;
15413481Sgiacomo.travaglini@arm.com  b2 = a2;
15513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, get<0>(b2));
15613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0.0, get<1>(b2));
15713481Sgiacomo.travaglini@arm.com
15813481Sgiacomo.travaglini@arm.com  tuple<double, char, bool*> a3, b3;
15913481Sgiacomo.travaglini@arm.com  b3 = a3;
16013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0.0, get<0>(b3));
16113481Sgiacomo.travaglini@arm.com  EXPECT_EQ('\0', get<1>(b3));
16213481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(get<2>(b3) == NULL);
16313481Sgiacomo.travaglini@arm.com
16413481Sgiacomo.travaglini@arm.com  tuple<int, int, int, int, int, int, int, int, int, int> a10, b10;
16513481Sgiacomo.travaglini@arm.com  b10 = a10;
16613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, get<0>(b10));
16713481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, get<1>(b10));
16813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, get<2>(b10));
16913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, get<3>(b10));
17013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, get<4>(b10));
17113481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, get<5>(b10));
17213481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, get<6>(b10));
17313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, get<7>(b10));
17413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, get<8>(b10));
17513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, get<9>(b10));
17613481Sgiacomo.travaglini@arm.com}
17713481Sgiacomo.travaglini@arm.com
17813481Sgiacomo.travaglini@arm.com// Tests constructing a tuple from its fields.
17913481Sgiacomo.travaglini@arm.comTEST(TupleConstructorTest, ConstructsFromFields) {
18013481Sgiacomo.travaglini@arm.com  int n = 1;
18113481Sgiacomo.travaglini@arm.com  // Reference field.
18213481Sgiacomo.travaglini@arm.com  tuple<int&> a(n);
18313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(&n, &(get<0>(a)));
18413481Sgiacomo.travaglini@arm.com
18513481Sgiacomo.travaglini@arm.com  // Non-reference fields.
18613481Sgiacomo.travaglini@arm.com  tuple<int, char> b(5, 'a');
18713481Sgiacomo.travaglini@arm.com  EXPECT_EQ(5, get<0>(b));
18813481Sgiacomo.travaglini@arm.com  EXPECT_EQ('a', get<1>(b));
18913481Sgiacomo.travaglini@arm.com
19013481Sgiacomo.travaglini@arm.com  // Const reference field.
19113481Sgiacomo.travaglini@arm.com  const int m = 2;
19213481Sgiacomo.travaglini@arm.com  tuple<bool, const int&> c(true, m);
19313481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(get<0>(c));
19413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(&m, &(get<1>(c)));
19513481Sgiacomo.travaglini@arm.com}
19613481Sgiacomo.travaglini@arm.com
19713481Sgiacomo.travaglini@arm.com// Tests tuple's copy constructor.
19813481Sgiacomo.travaglini@arm.comTEST(TupleConstructorTest, CopyConstructor) {
19913481Sgiacomo.travaglini@arm.com  tuple<double, bool> a(0.0, true);
20013481Sgiacomo.travaglini@arm.com  tuple<double, bool> b(a);
20113481Sgiacomo.travaglini@arm.com
20213481Sgiacomo.travaglini@arm.com  EXPECT_DOUBLE_EQ(0.0, get<0>(b));
20313481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(get<1>(b));
20413481Sgiacomo.travaglini@arm.com}
20513481Sgiacomo.travaglini@arm.com
20613481Sgiacomo.travaglini@arm.com// Tests constructing a tuple from another tuple that has a compatible
20713481Sgiacomo.travaglini@arm.com// but different type.
20813481Sgiacomo.travaglini@arm.comTEST(TupleConstructorTest, ConstructsFromDifferentTupleType) {
20913481Sgiacomo.travaglini@arm.com  tuple<int, int, char> a(0, 1, 'a');
21013481Sgiacomo.travaglini@arm.com  tuple<double, long, int> b(a);
21113481Sgiacomo.travaglini@arm.com
21213481Sgiacomo.travaglini@arm.com  EXPECT_DOUBLE_EQ(0.0, get<0>(b));
21313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, get<1>(b));
21413481Sgiacomo.travaglini@arm.com  EXPECT_EQ('a', get<2>(b));
21513481Sgiacomo.travaglini@arm.com}
21613481Sgiacomo.travaglini@arm.com
21713481Sgiacomo.travaglini@arm.com// Tests constructing a 2-tuple from an std::pair.
21813481Sgiacomo.travaglini@arm.comTEST(TupleConstructorTest, ConstructsFromPair) {
21913481Sgiacomo.travaglini@arm.com  ::std::pair<int, char> a(1, 'a');
22013481Sgiacomo.travaglini@arm.com  tuple<int, char> b(a);
22113481Sgiacomo.travaglini@arm.com  tuple<int, const char&> c(a);
22213481Sgiacomo.travaglini@arm.com}
22313481Sgiacomo.travaglini@arm.com
22413481Sgiacomo.travaglini@arm.com// Tests assigning a tuple to another tuple with the same type.
22513481Sgiacomo.travaglini@arm.comTEST(TupleAssignmentTest, AssignsToSameTupleType) {
22613481Sgiacomo.travaglini@arm.com  const tuple<int, long> a(5, 7L);
22713481Sgiacomo.travaglini@arm.com  tuple<int, long> b;
22813481Sgiacomo.travaglini@arm.com  b = a;
22913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(5, get<0>(b));
23013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(7L, get<1>(b));
23113481Sgiacomo.travaglini@arm.com}
23213481Sgiacomo.travaglini@arm.com
23313481Sgiacomo.travaglini@arm.com// Tests assigning a tuple to another tuple with a different but
23413481Sgiacomo.travaglini@arm.com// compatible type.
23513481Sgiacomo.travaglini@arm.comTEST(TupleAssignmentTest, AssignsToDifferentTupleType) {
23613481Sgiacomo.travaglini@arm.com  const tuple<int, long, bool> a(1, 7L, true);
23713481Sgiacomo.travaglini@arm.com  tuple<long, int, bool> b;
23813481Sgiacomo.travaglini@arm.com  b = a;
23913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1L, get<0>(b));
24013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(7, get<1>(b));
24113481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(get<2>(b));
24213481Sgiacomo.travaglini@arm.com}
24313481Sgiacomo.travaglini@arm.com
24413481Sgiacomo.travaglini@arm.com// Tests assigning an std::pair to a 2-tuple.
24513481Sgiacomo.travaglini@arm.comTEST(TupleAssignmentTest, AssignsFromPair) {
24613481Sgiacomo.travaglini@arm.com  const ::std::pair<int, bool> a(5, true);
24713481Sgiacomo.travaglini@arm.com  tuple<int, bool> b;
24813481Sgiacomo.travaglini@arm.com  b = a;
24913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(5, get<0>(b));
25013481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(get<1>(b));
25113481Sgiacomo.travaglini@arm.com
25213481Sgiacomo.travaglini@arm.com  tuple<long, bool> c;
25313481Sgiacomo.travaglini@arm.com  c = a;
25413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(5L, get<0>(c));
25513481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(get<1>(c));
25613481Sgiacomo.travaglini@arm.com}
25713481Sgiacomo.travaglini@arm.com
25813481Sgiacomo.travaglini@arm.com// A fixture for testing big tuples.
25913481Sgiacomo.travaglini@arm.comclass BigTupleTest : public testing::Test {
26013481Sgiacomo.travaglini@arm.com protected:
26113481Sgiacomo.travaglini@arm.com  typedef tuple<int, int, int, int, int, int, int, int, int, int> BigTuple;
26213481Sgiacomo.travaglini@arm.com
26313481Sgiacomo.travaglini@arm.com  BigTupleTest() :
26413481Sgiacomo.travaglini@arm.com      a_(1, 0, 0, 0, 0, 0, 0, 0, 0, 2),
26513481Sgiacomo.travaglini@arm.com      b_(1, 0, 0, 0, 0, 0, 0, 0, 0, 3) {}
26613481Sgiacomo.travaglini@arm.com
26713481Sgiacomo.travaglini@arm.com  BigTuple a_, b_;
26813481Sgiacomo.travaglini@arm.com};
26913481Sgiacomo.travaglini@arm.com
27013481Sgiacomo.travaglini@arm.com// Tests constructing big tuples.
27113481Sgiacomo.travaglini@arm.comTEST_F(BigTupleTest, Construction) {
27213481Sgiacomo.travaglini@arm.com  BigTuple a;
27313481Sgiacomo.travaglini@arm.com  BigTuple b(b_);
27413481Sgiacomo.travaglini@arm.com}
27513481Sgiacomo.travaglini@arm.com
27613481Sgiacomo.travaglini@arm.com// Tests that get<N>(t) returns the N-th (0-based) field of tuple t.
27713481Sgiacomo.travaglini@arm.comTEST_F(BigTupleTest, get) {
27813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, get<0>(a_));
27913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, get<9>(a_));
28013481Sgiacomo.travaglini@arm.com
28113481Sgiacomo.travaglini@arm.com  // Tests that get() works on a const tuple too.
28213481Sgiacomo.travaglini@arm.com  const BigTuple a(a_);
28313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, get<0>(a));
28413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, get<9>(a));
28513481Sgiacomo.travaglini@arm.com}
28613481Sgiacomo.travaglini@arm.com
28713481Sgiacomo.travaglini@arm.com// Tests comparing big tuples.
28813481Sgiacomo.travaglini@arm.comTEST_F(BigTupleTest, Comparisons) {
28913481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(a_ == a_);
29013481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(a_ != a_);
29113481Sgiacomo.travaglini@arm.com
29213481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(a_ != b_);
29313481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(a_ == b_);
29413481Sgiacomo.travaglini@arm.com}
29513481Sgiacomo.travaglini@arm.com
29613481Sgiacomo.travaglini@arm.comTEST(MakeTupleTest, WorksForScalarTypes) {
29713481Sgiacomo.travaglini@arm.com  tuple<bool, int> a;
29813481Sgiacomo.travaglini@arm.com  a = make_tuple(true, 5);
29913481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(get<0>(a));
30013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(5, get<1>(a));
30113481Sgiacomo.travaglini@arm.com
30213481Sgiacomo.travaglini@arm.com  tuple<char, int, long> b;
30313481Sgiacomo.travaglini@arm.com  b = make_tuple('a', 'b', 5);
30413481Sgiacomo.travaglini@arm.com  EXPECT_EQ('a', get<0>(b));
30513481Sgiacomo.travaglini@arm.com  EXPECT_EQ('b', get<1>(b));
30613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(5, get<2>(b));
30713481Sgiacomo.travaglini@arm.com}
30813481Sgiacomo.travaglini@arm.com
30913481Sgiacomo.travaglini@arm.comTEST(MakeTupleTest, WorksForPointers) {
31013481Sgiacomo.travaglini@arm.com  int a[] = { 1, 2, 3, 4 };
31113481Sgiacomo.travaglini@arm.com  const char* const str = "hi";
31213481Sgiacomo.travaglini@arm.com  int* const p = a;
31313481Sgiacomo.travaglini@arm.com
31413481Sgiacomo.travaglini@arm.com  tuple<const char*, int*> t;
31513481Sgiacomo.travaglini@arm.com  t = make_tuple(str, p);
31613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(str, get<0>(t));
31713481Sgiacomo.travaglini@arm.com  EXPECT_EQ(p, get<1>(t));
31813481Sgiacomo.travaglini@arm.com}
31913481Sgiacomo.travaglini@arm.com
32013481Sgiacomo.travaglini@arm.com}  // namespace
321