2 * Copyright 2016 Facebook, Inc.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #include <folly/Format.h>
19 #include <glog/logging.h>
20 #include <gtest/gtest.h>
22 #include <folly/FBVector.h>
23 #include <folly/FileUtil.h>
24 #include <folly/dynamic.h>
25 #include <folly/json.h>
26 #include <folly/small_vector.h>
28 using namespace folly;
30 TEST(FormatOther, file) {
31 // Test writing to FILE. I'd use open_memstream but that's not available
32 // outside of Linux (even though it's in POSIX.1-2008).
36 SCOPE_EXIT { closeNoInt(fds[1]); };
38 FILE* fp = fdopen(fds[1], "wb");
40 SCOPE_EXIT { fclose(fp); };
41 writeTo(fp, format("{} {}", 42, 23)); // <= 512 bytes (PIPE_BUF)
45 ssize_t n = readFull(fds[0], buf, sizeof(buf));
48 EXPECT_EQ("42 23", std::string(buf, n));
52 TEST(FormatOther, dynamic) {
55 " \"hello\": \"world\",\n"
57 " \"y\": {\"a\" : 42}\n"
60 EXPECT_EQ("world", sformat("{0[hello]}", dyn));
61 EXPECT_THROW(sformat("{0[none]}", dyn), std::out_of_range);
62 EXPECT_EQ("world", sformat("{0[hello]}", defaulted(dyn, "meow")));
63 EXPECT_EQ("meow", sformat("{0[none]}", defaulted(dyn, "meow")));
65 EXPECT_EQ("20", sformat("{0[x.0]}", dyn));
66 EXPECT_THROW(sformat("{0[x.2]}", dyn), std::out_of_range);
68 // No support for "deep" defaulting (dyn["x"] is not defaulted)
70 EXPECT_EQ("20", sformat("{0[0]}", v));
71 EXPECT_THROW(sformat("{0[2]}", v), std::out_of_range);
72 EXPECT_EQ("20", sformat("{0[0]}", defaulted(v, 42)));
73 EXPECT_EQ("42", sformat("{0[2]}", defaulted(v, 42)));
75 EXPECT_EQ("42", sformat("{0[y.a]}", dyn));
77 EXPECT_EQ("(null)", sformat("{}", dynamic(nullptr)));
83 void testFormatSeq() {
85 EXPECT_EQ("30 10", sformat("{0[2]} {0[0]}", v));
86 EXPECT_EQ("0020", sformat("{0[1]:04}", v));
87 EXPECT_EQ("0020", svformat("{1:04}", v));
88 EXPECT_EQ("10 20", svformat("{} {}", v));
89 EXPECT_EQ("10 20 0030", svformat("{} {} {:04}", v));
94 TEST(FormatOther, fbvector) {
95 testFormatSeq<fbvector<int>>();
98 TEST(FormatOther, small_vector) {
99 testFormatSeq<small_vector<int, 2>>();
102 int main(int argc, char *argv[]) {
103 testing::InitGoogleTest(&argc, argv);
104 gflags::ParseCommandLineFlags(&argc, &argv, true);
105 return RUN_ALL_TESTS();