// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/ledger/bin/cache/lazy_value.h"

#include <lib/callback/capture.h>
#include <lib/callback/set_when_called.h>
#include <lib/fit/function.h>

#include "gtest/gtest.h"

namespace cache {
namespace {
TEST(LazyValueTest, SimpleGet) {
  auto generator = [](fit::function<void(size_t, size_t)> callback) {
    callback(0, 1);
  };

  LazyValue<size_t, size_t> cache(0, generator);

  bool called;
  size_t status;
  size_t value;
  cache.Get(
      callback::Capture(callback::SetWhenCalled(&called), &status, &value));
  ASSERT_TRUE(called);
  EXPECT_EQ(0u, status);
  EXPECT_EQ(1u, value);
}

TEST(LazyValueTest, FailingGenerator) {
  size_t nb_called = 0;
  auto generator = [&nb_called](fit::function<void(size_t, size_t)> callback) {
    ++nb_called;
    callback(1, 0);
  };

  LazyValue<size_t, size_t> cache(0, generator);

  bool called;
  size_t status;
  size_t value;

  cache.Get(
      callback::Capture(callback::SetWhenCalled(&called), &status, &value));
  ASSERT_TRUE(called);
  EXPECT_EQ(1u, status);
  EXPECT_EQ(1u, nb_called);

  cache.Get(
      callback::Capture(callback::SetWhenCalled(&called), &status, &value));
  ASSERT_TRUE(called);
  EXPECT_EQ(1u, status);
  EXPECT_EQ(2u, nb_called);
}

TEST(LazyValueTest, CacheCallback) {
  size_t nb_called = 0;
  fit::function<void(size_t, size_t)> generator_callback;
  auto generator = [&nb_called, &generator_callback](
                       fit::function<void(size_t, size_t)> callback) {
    ++nb_called;
    generator_callback = std::move(callback);
  };

  LazyValue<size_t, size_t> cache(0, generator);

  bool called1, called2;
  size_t status1, status2;
  size_t value1, value2;

  cache.Get(
      callback::Capture(callback::SetWhenCalled(&called1), &status1, &value1));

  EXPECT_FALSE(called1);
  EXPECT_EQ(1u, nb_called);

  cache.Get(
      callback::Capture(callback::SetWhenCalled(&called2), &status2, &value2));

  EXPECT_FALSE(called2);
  EXPECT_EQ(1u, nb_called);

  generator_callback(0, 42);

  ASSERT_TRUE(called1);
  ASSERT_TRUE(called2);
  EXPECT_EQ(1u, nb_called);
  EXPECT_EQ(0u, status1);
  EXPECT_EQ(42u, value1);
  EXPECT_EQ(0u, status2);
  EXPECT_EQ(42u, value2);
}

}  // namespace
}  // namespace cache
