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