blob: 5ce3ff086cf611fb6fb0c0168a4ba06a7d6f5310 [file] [log] [blame]
/*
* Copyright 2015 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <folly/Lazy.h>
#include <map>
#include <functional>
#include <iostream>
#include <gtest/gtest.h>
namespace folly {
TEST(Lazy, Simple) {
int computeCount = 0;
auto const val = folly::lazy([&]() -> int {
++computeCount;
EXPECT_EQ(computeCount, 1);
return 12;
});
EXPECT_EQ(computeCount, 0);
for (int i = 0; i < 100; ++i) {
if (i > 50) {
EXPECT_EQ(val(), 12);
EXPECT_EQ(computeCount, 1);
} else {
EXPECT_EQ(computeCount, 0);
}
}
EXPECT_EQ(val(), 12);
EXPECT_EQ(computeCount, 1);
}
auto globalCount = folly::lazy([]{ return 0; });
auto const foo = folly::lazy([]() -> std::string {
++globalCount();
EXPECT_EQ(globalCount(), 1);
return std::string("YEP");
});
TEST(Lazy, Global) {
EXPECT_EQ(globalCount(), 0);
EXPECT_EQ(foo(), "YEP");
EXPECT_EQ(globalCount(), 1);
}
TEST(Lazy, Map) {
auto lazyMap = folly::lazy([]() -> std::map<std::string,std::string> {
return {
{ "foo", "bar" },
{ "baz", "quux" }
};
});
EXPECT_EQ(lazyMap().size(), 2);
lazyMap()["blah"] = "asd";
EXPECT_EQ(lazyMap().size(), 3);
}
struct CopyCount {
CopyCount() {}
CopyCount(const CopyCount&) { ++count; }
CopyCount(CopyCount&&) noexcept {}
static int count;
bool operator()() const { return true ; }
};
int CopyCount::count = 0;
TEST(Lazy, NonLambda) {
auto const rval = folly::lazy(CopyCount());
EXPECT_EQ(CopyCount::count, 0);
EXPECT_EQ(rval(), true);
EXPECT_EQ(CopyCount::count, 0);
CopyCount cpy;
auto const lval = folly::lazy(cpy);
EXPECT_EQ(CopyCount::count, 1);
EXPECT_EQ(lval(), true);
EXPECT_EQ(CopyCount::count, 1);
std::function<bool()> f = [&]{ return 12; };
auto const lazyF = folly::lazy(f);
EXPECT_EQ(lazyF(), true);
}
TEST(Lazy, Consty) {
std::function<int ()> const f = [&] { return 12; };
auto lz = folly::lazy(f);
EXPECT_EQ(lz(), 12);
}
}