// Copyright 2017 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/lib/callback/managed_container.h"

#include "gtest/gtest.h"
#include "src/ledger/lib/callback/set_when_called.h"

namespace ledger {
namespace {

TEST(ManagedContainer, Cleanup) {
  ManagedContainer managed_container;
  size_t called = 0;
  auto result = managed_container.Manage(fit::defer([&called] { ++called; }));
  EXPECT_EQ(0u, called);
  result.reset();
  EXPECT_EQ(1u, called);
}

TEST(ManagedContainer, ContainerDeletion) {
  size_t called = 0;
  auto updater = fit::defer([&called] { ++called; });
  auto managed_container = std::make_unique<ManagedContainer>();
  auto result = managed_container->Manage(std::move(updater));
  EXPECT_EQ(0u, called);
  managed_container.reset();
  EXPECT_EQ(1u, called);
}

TEST(ManagedContainer, HandlerDeletion) {
  size_t called = 0;
  auto updater = fit::defer([&called] { ++called; });
  ManagedContainer managed_container;
  {
    auto result = managed_container.Manage(std::move(updater));
    EXPECT_EQ(0u, called);
  }
  EXPECT_EQ(1u, called);
}

TEST(ManagedContainer, HeterogenousObject) {
  ManagedContainer managed_container;
  size_t called = 0;
  auto result1 = managed_container.Manage(fit::defer([&called] { ++called; }));
  auto result2 = managed_container.Manage(fit::defer([&called] { ++called; }));
  EXPECT_EQ(0u, called);
  result1.reset();
  EXPECT_EQ(1u, called);
  result2.reset();
  EXPECT_EQ(2u, called);
}

TEST(ManagedContainer, DoNotCrashIfManagerDeleted) {
  std::unique_ptr<ManagedContainer> managed_container = std::make_unique<ManagedContainer>();
  size_t called = 0;
  auto result = managed_container->Manage(fit::defer([&called] { ++called; }));
  EXPECT_EQ(0u, called);
  managed_container.reset();
  // |managed_container| is deleted and all its storage.
  EXPECT_EQ(1u, called);
  result.reset();
  // Nothing bad should happen
}

TEST(ManagedContainer, OnDiscardable) {
  ManagedContainer managed_container;
  bool called = false;
  managed_container.SetOnDiscardable(SetWhenCalled(&called));
  auto item1 = managed_container.Manage(true);
  auto item2 = managed_container.Manage(true);
  item1.reset();
  EXPECT_FALSE(called);
  item2.reset();
  EXPECT_TRUE(called);
}

}  // namespace
}  // namespace ledger
