/*
 * 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);
}

}
