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/Foreach.h>
19 #include <folly/portability/GTest.h>
26 using namespace folly;
27 using namespace folly::detail;
29 TEST(Foreach, ForEachRvalue) {
30 const char* const hello = "hello";
32 FOR_EACH(it, std::string(hello)) {
35 EXPECT_EQ(strlen(hello), n);
36 FOR_EACH_R(it, std::string(hello)) {
38 EXPECT_EQ(hello[n], *it);
43 TEST(Foreach, ForEachNested) {
44 const std::string hello = "hello";
51 auto len = hello.size();
52 EXPECT_EQ(len * len, n);
55 TEST(Foreach, ForEachKV) {
56 std::map<std::string, int> testMap;
59 std::string keys = "";
62 FOR_EACH_KV (key, value, testMap) {
67 EXPECT_EQ("abcdef", keys);
69 EXPECT_EQ(2, numEntries);
72 TEST(Foreach, ForEachKVBreak) {
73 std::map<std::string, int> testMap;
76 std::string keys = "";
79 FOR_EACH_KV (key, value, testMap) {
85 EXPECT_EQ("abc", keys);
87 EXPECT_EQ(1, numEntries);
90 TEST(Foreach, ForEachKvWithMultiMap) {
91 std::multimap<std::string, int> testMap;
92 testMap.insert(std::make_pair("abc", 1));
93 testMap.insert(std::make_pair("abc", 2));
94 testMap.insert(std::make_pair("def", 3));
95 std::string keys = "";
98 FOR_EACH_KV (key, value, testMap) {
103 EXPECT_EQ("abcabcdef", keys);
104 EXPECT_EQ(6, values);
105 EXPECT_EQ(3, numEntries);
108 TEST(Foreach, ForEachEnumerate) {
112 int numIterations = 0;
113 FOR_EACH_ENUMERATE(aa, iter, vv) {
119 EXPECT_EQ(sumIter, 0);
120 EXPECT_EQ(numIterations, 0);
125 FOR_EACH_ENUMERATE(aa, iter, vv) {
130 EXPECT_EQ(sumAA, 3); // 0 + 1 + 2
131 EXPECT_EQ(sumIter, 9); // 1 + 3 + 5
132 EXPECT_EQ(numIterations, 3);
135 TEST(Foreach, ForEachEnumerateBreak) {
139 int numIterations = 0;
144 FOR_EACH_ENUMERATE(aa, iter, vv) {
150 EXPECT_EQ(sumAA, 1); // 0 + 1
151 EXPECT_EQ(sumIter, 3); // 1 + 2
152 EXPECT_EQ(numIterations, 2);
155 TEST(Foreach, ForEachRangeR) {
158 FOR_EACH_RANGE_R (i, 0, 0) {
163 FOR_EACH_RANGE_R (i, 0, -1) {
168 FOR_EACH_RANGE_R (i, 0, 5) {
173 std::list<int> lst = { 0, 1, 2, 3, 4 };
175 FOR_EACH_RANGE_R (i, lst.begin(), lst.end()) {