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

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

namespace callback {
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, OnEmpty) {
  ManagedContainer managed_container;
  bool called = false;
  managed_container.set_on_empty(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 callback
