// 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.

#pragma once

#include <fuchsia/modular/storymodel/cpp/fidl.h>
#include <lib/fit/bridge.h>

#include "peridot/bin/sessionmgr/story/model/story_mutator.h"

namespace modular {

// A version of StoryMutator for use in tests.
//
// Collects all calls to StoryMutator.Execute() in public member
// |execute_calls|. Each element of |execute_calls| consists of:
//
// * |ExecuteCall.commands| are the StoryModelMutation commands that were
// issued in the Execute() call.
// * |ExecuteCall.completer| is used to complete the fit::promise<> that
// Execute() returns. The test author must call |completer.complete_ok()| or
// |completer.complete_error()| for any tasks blocked on the Execute() call to
// unblock.
class TestMutator : public StoryMutator {
 public:
  // Convenience factory allowing the caller to retain a pointer to the TestMutator
  // when constructing a class that accepts a StoryMutator as a constructor argument.
  //
  // Usage:
  //
  // TestMutator* test_mutator;
  // Foo foo(TestMutator::Create(&test_mutator));
  static std::unique_ptr<StoryMutator> Create(TestMutator** ptr);

  fit::consumer<> ExecuteInternal(
      std::vector<fuchsia::modular::storymodel::StoryModelMutation> commands)
      override;

  struct ExecuteCall {
    fit::completer<> completer;
    std::vector<fuchsia::modular::storymodel::StoryModelMutation> commands;
  };
  std::vector<ExecuteCall> execute_calls;
};

}  // namespace modular
