bf3b462f32ce516ce3ef68d3b973f3f862520519
[folly.git] / folly / test / DynamicOtherTest.cpp
1 /*
2  * Copyright 2016 Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <folly/dynamic.h>
18
19 #include <folly/gen/Base.h>
20 #include <folly/json.h>
21 #include <folly/portability/GFlags.h>
22
23 #include <gtest/gtest.h>
24
25 #include <iostream>
26
27 using folly::dynamic;
28 using folly::TypeError;
29
30 TEST(Dynamic, ArrayGenerator) {
31   // Make sure arrays can be used with folly::gen.
32   using namespace folly::gen;
33   dynamic arr = dynamic::array(1, 2, 3, 4);
34   EXPECT_EQ(from(arr) | take(3) | member(&dynamic::asInt) | sum, 6);
35 }
36
37 TEST(Dynamic, StringPtrs) {
38   dynamic str = "12.0";
39   dynamic num = 12.0;
40   dynamic nullStr = folly::parseJson("\"foo\\u0000bar\"");
41
42   EXPECT_EQ(0, strcmp(str.c_str(), "12.0"));
43   EXPECT_EQ(0, strncmp(str.data(), "12.0", str.asString().length()));
44   EXPECT_EQ(str.stringPiece(), "12.0");
45
46   EXPECT_THROW(num.c_str(), TypeError);
47   EXPECT_THROW(num.data(), TypeError);
48   EXPECT_THROW(num.stringPiece(), TypeError);
49
50   EXPECT_EQ(nullStr.stringPiece(), folly::StringPiece("foo\0bar", 7));
51
52   nullStr.getString()[3] = '|';
53   EXPECT_EQ(nullStr.stringPiece(), "foo|bar");
54 }
55
56 TEST(Dynamic, Getters) {
57   dynamic dStr = folly::parseJson("\"foo\\u0000bar\"");
58   dynamic dInt = 1;
59   dynamic dDouble = 0.5;
60   dynamic dBool = true;
61
62   EXPECT_EQ(dStr.getString(), std::string("foo\0bar", 7));
63   EXPECT_EQ(dInt.getInt(), 1);
64   EXPECT_EQ(dDouble.getDouble(), 0.5);
65   EXPECT_EQ(dBool.getBool(), true);
66
67   dStr.getString()[3] = '|';
68   EXPECT_EQ(dStr.getString(), "foo|bar");
69
70   dInt.getInt() = 2;
71   EXPECT_EQ(dInt.getInt(), 2);
72
73   dDouble.getDouble() = 0.7;
74   EXPECT_EQ(dDouble.getDouble(), 0.7);
75
76   dBool.getBool() = false;
77   EXPECT_EQ(dBool.getBool(), false);
78
79   EXPECT_THROW(dStr.getInt(), TypeError);
80   EXPECT_THROW(dStr.getDouble(), TypeError);
81   EXPECT_THROW(dStr.getBool(), TypeError);
82
83   EXPECT_THROW(dInt.getString(), TypeError);
84   EXPECT_THROW(dInt.getDouble(), TypeError);
85   EXPECT_THROW(dInt.getBool(), TypeError);
86
87   EXPECT_THROW(dDouble.getString(), TypeError);
88   EXPECT_THROW(dDouble.getInt(), TypeError);
89   EXPECT_THROW(dDouble.getBool(), TypeError);
90
91   EXPECT_THROW(dBool.getString(), TypeError);
92   EXPECT_THROW(dBool.getInt(), TypeError);
93   EXPECT_THROW(dBool.getDouble(), TypeError);
94 }
95
96 TEST(Dynamic, FormattedIO) {
97   std::ostringstream out;
98   dynamic doubl = 123.33;
99   dynamic dint = 12;
100   out << "0x" << std::hex << ++dint << ' ' << std::setprecision(1)
101       << doubl << '\n';
102   EXPECT_EQ(out.str(), "0xd 1e+02\n");
103
104   out.str("");
105   dynamic arrr = dynamic::array(1, 2, 3);
106   out << arrr;
107   EXPECT_EQ(out.str(), "[1,2,3]");
108
109   out.str("");
110   dynamic objy = dynamic::object("a", 12);
111   out << objy;
112   EXPECT_EQ(out.str(), R"({"a":12})");
113
114   out.str("");
115   dynamic objy2 = dynamic::array(objy,
116                                  dynamic::object(12, "str"),
117                                  dynamic::object(true, false));
118   out << objy2;
119   EXPECT_EQ(out.str(), R"([{"a":12},{12:"str"},{true:false}])");
120 }
121
122 int main(int argc, char** argv) {
123   testing::InitGoogleTest(&argc, argv);
124   gflags::ParseCommandLineFlags(&argc, &argv, true);
125   return RUN_ALL_TESTS();
126 }