19205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko// Copyright 2014 The Chromium OS Authors. All rights reserved.
29205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko// Use of this source code is governed by a BSD-style license that can be
39205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko// found in the LICENSE file.
49205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
59205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko#include <algorithm>
69205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko#include <functional>
79205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko#include <string>
89205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko#include <vector>
99205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
109ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko#include <brillo/any.h>
119205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko#include <gtest/gtest.h>
129205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
139ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkousing brillo::Any;
149205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
159205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoTEST(Any, Empty) {
169205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val;
179205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsEmpty());
189205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
199205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val2 = val;
209205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsEmpty());
219205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val2.IsEmpty());
229205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
239205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val3 = std::move(val);
249205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsEmpty());
259205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val3.IsEmpty());
269205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko}
279205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
289205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoTEST(Any, SimpleTypes) {
299205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val(20);
309205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_FALSE(val.IsEmpty());
319205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsTypeCompatible<int>());
329205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(20, val.Get<int>());
339205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
349205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val2(3.1415926);
359205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_FALSE(val2.IsEmpty());
369205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val2.IsTypeCompatible<double>());
379205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_FALSE(val2.IsTypeCompatible<int>());
389205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_DOUBLE_EQ(3.1415926, val2.Get<double>());
399205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
409205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val3(std::string("blah"));
419205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val3.IsTypeCompatible<std::string>());
429205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ("blah", val3.Get<std::string>());
439205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko}
449205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
459205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoTEST(Any, Clear) {
469205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val('x');
479205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_FALSE(val.IsEmpty());
489205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ('x', val.Get<char>());
499205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
509205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val.Clear();
519205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsEmpty());
529205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko}
539205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
549205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoTEST(Any, Assignments) {
559205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val(20);
569205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(20, val.Get<int>());
579205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
589205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val = 3.1415926;
599205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_FALSE(val.IsEmpty());
609205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsTypeCompatible<double>());
619205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_DOUBLE_EQ(3.1415926, val.Get<double>());
629205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
639205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val = std::string("blah");
649205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ("blah", val.Get<std::string>());
659205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
669205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val2;
679205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val2.IsEmpty());
689205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val2 = val;
699205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_FALSE(val.IsEmpty());
709205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_FALSE(val2.IsEmpty());
719205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ("blah", val.Get<std::string>());
729205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ("blah", val2.Get<std::string>());
739205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val.Clear();
749205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsEmpty());
759205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ("blah", val2.Get<std::string>());
769205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val2.Clear();
779205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val2.IsEmpty());
789205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
799205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val = std::vector<int>{100, 20, 3};
809205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  auto v = val.Get<std::vector<int>>();
819205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(100, v[0]);
829205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(20, v[1]);
839205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(3, v[2]);
849205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
859205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val2 = std::move(val);
869205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsEmpty());
879205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val2.IsTypeCompatible<std::vector<int>>());
889205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(3, val2.Get<std::vector<int>>().size());
899205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
909205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val = val2;
919205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsTypeCompatible<std::vector<int>>());
929205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val2.IsTypeCompatible<std::vector<int>>());
939205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(3, val.Get<std::vector<int>>().size());
949205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(3, val2.Get<std::vector<int>>().size());
959205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko}
969205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
979205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoTEST(Any, Enums) {
989205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  enum class Dummy { foo, bar, baz };
999205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val(Dummy::bar);
1009205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_FALSE(val.IsEmpty());
1019205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsConvertibleToInteger());
1029205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(Dummy::bar, val.Get<Dummy>());
1039205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(1, val.GetAsInteger());
1049205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
1059205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val = Dummy::baz;
1069205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(2, val.GetAsInteger());
1079205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
1089205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val = Dummy::foo;
1099205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(0, val.GetAsInteger());
1109205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko}
1119205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
1129205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoTEST(Any, Integers) {
1139205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val(14);
1149205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsConvertibleToInteger());
1159205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(14, val.Get<int>());
1169205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(14, val.GetAsInteger());
1179205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
1189205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val = '\x40';
1199205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsConvertibleToInteger());
1209205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(64, val.Get<char>());
1219205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(64, val.GetAsInteger());
1229205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
1239205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val = static_cast<uint16_t>(65535);
1249205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsConvertibleToInteger());
1259205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(65535, val.Get<uint16_t>());
1269205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(65535, val.GetAsInteger());
1279205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
1289205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val = static_cast<uint64_t>(0xFFFFFFFFFFFFFFFFULL);
1299205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsConvertibleToInteger());
1309205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(0xFFFFFFFFFFFFFFFFULL, val.Get<uint64_t>());
1319205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(-1, val.GetAsInteger());
1329205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
1339205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val = "abc";
1349205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_FALSE(val.IsConvertibleToInteger());
1359205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
1369205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  int a = 5;
1379205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val = &a;
1389205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_FALSE(val.IsConvertibleToInteger());
1399205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko}
1409205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
1419205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoTEST(Any, Pointers) {
1429205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val("abc");  // const char*
1439205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_FALSE(val.IsTypeCompatible<char*>());
1449205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsTypeCompatible<const char*>());
1459205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_FALSE(val.IsTypeCompatible<volatile char*>());
1469205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsTypeCompatible<volatile const char*>());
1479205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_STREQ("abc", val.Get<const char*>());
1489205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
1499205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  int a = 10;
1509205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val = &a;
1519205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsTypeCompatible<int*>());
1529205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsTypeCompatible<const int*>());
1539205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsTypeCompatible<volatile int*>());
1549205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsTypeCompatible<volatile const int*>());
1559205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(10, *val.Get<const int*>());
1569205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  *val.Get<int*>() = 3;
1579205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(3, a);
1589205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko}
1599205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
1609205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoTEST(Any, Arrays) {
1619205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  // The following test are here to validate the array-to-pointer decay rules.
1629205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  // Since Any does not store the contents of a C-style array, just a pointer
1639205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  // to the data, putting array data into Any could be dangerous.
1649205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  // Make sure the array's lifetime exceeds that of an Any containing the
1659205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  // pointer to the array data.
1669205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  // If you want to store the array with data, use corresponding value types
1679205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  // such as std::vector or a struct containing C-style array as a member.
1689205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
1699205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  int int_array[] = {1, 2, 3};  // int*
1709205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val = int_array;
1719205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsTypeCompatible<int*>());
1729205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsTypeCompatible<const int*>());
1739205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsTypeCompatible<int[]>());
1749205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsTypeCompatible<const int[]>());
1759205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(3, val.Get<int*>()[2]);
1769205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
1779205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  const int const_int_array[] = {10, 20, 30};  // const int*
1789205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val = const_int_array;
1799205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_FALSE(val.IsTypeCompatible<int*>());
1809205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsTypeCompatible<const int*>());
1819205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_FALSE(val.IsTypeCompatible<int[]>());
1829205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_TRUE(val.IsTypeCompatible<const int[]>());
1839205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(30, val.Get<const int*>()[2]);
1849205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko}
1859205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
1869205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoTEST(Any, References) {
1879205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  // Passing references to object via Any might be error-prone or the
1889205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  // semantics could be unfamiliar to other developers. In many cases,
1899205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  // using pointers instead of references are more conventional and easier
1909205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  // to understand. Even though the cases of passing references are quite
1919205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  // explicit on both storing and retrieving ends, you might want to
1929205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  // use pointers instead anyway.
1939205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
1949205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  int a = 5;
1959205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val(std::ref(a));  // int&
1969205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(5, val.Get<std::reference_wrapper<int>>().get());
1979205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val.Get<std::reference_wrapper<int>>().get() = 7;
1989205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(7, val.Get<std::reference_wrapper<int>>().get());
1999205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(7, a);
2009205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
2019205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val2(std::cref(a));  // const int&
2029205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(7, val2.Get<std::reference_wrapper<const int>>().get());
2039205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
2049205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  a = 10;
2059205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(10, val.Get<std::reference_wrapper<int>>().get());
2069205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(10, val2.Get<std::reference_wrapper<const int>>().get());
2079205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko}
2089205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
2099205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoTEST(Any, CustomTypes) {
2109205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  struct Person {
2119205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko    std::string name;
2129205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko    int age;
2139205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  };
2149205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val(Person{"Jack", 40});
2159205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val2 = val;
2169205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ("Jack", val.Get<Person>().name);
2179205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val.GetPtr<Person>()->name = "Joe";
2189205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val.GetPtr<Person>()->age /= 2;
2199205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ("Joe", val.Get<Person>().name);
2209205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(20, val.Get<Person>().age);
2219205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ("Jack", val2.Get<Person>().name);
2229205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(40, val2.Get<Person>().age);
2239205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko}
2249205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
2259205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoTEST(Any, Swap) {
2269205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val(12);
2279205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val2(2.7);
2289205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(12, val.Get<int>());
2299205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(2.7, val2.Get<double>());
2309205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
2319205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val.Swap(val2);
2329205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(2.7, val.Get<double>());
2339205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(12, val2.Get<int>());
2349205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
2359205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  std::swap(val, val2);
2369205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(12, val.Get<int>());
2379205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(2.7, val2.Get<double>());
2389205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko}
2399205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
2409205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoTEST(Any, TypeMismatch) {
2419205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val(12);
2429205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_DEATH(val.Get<double>(),
243bba50fab4c6bb851dc423ad78e0cc3392cb08157Alex Vakulenko               "Requesting value of type 'double' from variant containing "
244bba50fab4c6bb851dc423ad78e0cc3392cb08157Alex Vakulenko               "'int'");
2459205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
2469205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  val = std::string("123");
2479205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_DEATH(val.GetAsInteger(),
24876601775391e2593c8e12a594a1b97271254c092Alex Vakulenko               "Unable to convert value of type 'std::.*' to integer");
2499205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
2509205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any empty;
2519205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_DEATH(empty.GetAsInteger(), "Must not be called on an empty Any");
2529205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko}
2539205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko
2549205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex VakulenkoTEST(Any, TryGet) {
2559205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any val(12);
2569205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  Any empty;
2579205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ("dummy", val.TryGet<std::string>("dummy"));
2589205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(12, val.TryGet<int>(17));
2599205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko  EXPECT_EQ(17, empty.TryGet<int>(17));
2609205c772a4a34ce16c7cfd9caee0d0c9b43bbee1Alex Vakulenko}
26188c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko
26288c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex VakulenkoTEST(Any, Compare_Int) {
26388c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  Any int1{12};
26488c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  Any int2{12};
26588c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  Any int3{20};
26688c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  EXPECT_EQ(int1, int2);
26788c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  EXPECT_NE(int2, int3);
26888c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko}
26988c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko
27088c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex VakulenkoTEST(Any, Compare_String) {
27188c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  Any str1{std::string{"foo"}};
27288c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  Any str2{std::string{"foo"}};
27388c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  Any str3{std::string{"bar"}};
27488c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  EXPECT_EQ(str1, str2);
27588c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  EXPECT_NE(str2, str3);
27688c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko}
27788c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko
27888c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex VakulenkoTEST(Any, Compare_Array) {
27988c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  Any vec1{std::vector<int>{1, 2}};
28088c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  Any vec2{std::vector<int>{1, 2}};
28188c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  Any vec3{std::vector<int>{1, 2, 3}};
28288c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  EXPECT_EQ(vec1, vec2);
28388c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  EXPECT_NE(vec2, vec3);
28488c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko}
28588c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko
28688c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex VakulenkoTEST(Any, Compare_Empty) {
28788c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  Any empty1;
28888c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  Any empty2;
28988c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  Any int1{1};
29088c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  EXPECT_EQ(empty1, empty2);
29188c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  EXPECT_NE(int1, empty1);
29288c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  EXPECT_NE(empty2, int1);
29388c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko}
29488c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko
29588c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex VakulenkoTEST(Any, Compare_NonComparable) {
29688c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  struct Person {
29788c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko    std::string name;
29888c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko    int age;
29988c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  };
30088c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  Any person1(Person{"Jack", 40});
30188c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  Any person2 = person1;
30288c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  Any person3(Person{"Jill", 20});
30388c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  EXPECT_NE(person1, person2);
30488c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  EXPECT_NE(person1, person3);
30588c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko  EXPECT_NE(person2, person3);
30688c1b4bfc86a47b72d5a2640c14ed0c58cede29bAlex Vakulenko}
3078d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko
3088d6301aa107d64d92bb0257ded486591391bfe41Alex VakulenkoTEST(Any, GetUndecoratedTypeName) {
3098d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko  Any val;
3108d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko  EXPECT_TRUE(val.GetUndecoratedTypeName().empty());
3118d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko
3128d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko  val = 1;
3138d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko  EXPECT_EQ(brillo::GetUndecoratedTypeName<int>(),
3148d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko            val.GetUndecoratedTypeName());
3158d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko
3168d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko  val = 3.1415926;
3178d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko  EXPECT_EQ(brillo::GetUndecoratedTypeName<double>(),
3188d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko            val.GetUndecoratedTypeName());
3198d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko
3208d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko  val = std::string("blah");
3218d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko  EXPECT_EQ(brillo::GetUndecoratedTypeName<std::string>(),
3228d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko            val.GetUndecoratedTypeName());
3238d6301aa107d64d92bb0257ded486591391bfe41Alex Vakulenko}
324