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

#ifndef PERIDOT_LIB_TESTING_MODULE_RESOLVER_FAKE_H_
#define PERIDOT_LIB_TESTING_MODULE_RESOLVER_FAKE_H_

#include <fuchsia/modular/cpp/fidl.h>
#include <lib/fidl/cpp/binding_set.h>

namespace modular {

class ModuleResolverFake : fuchsia::modular::ModuleResolver {
 public:
  ModuleResolverFake();
  ~ModuleResolverFake() override;

  // |ModuleResolver|
  void FindModules(fuchsia::modular::FindModulesQuery query,
                   FindModulesCallback callback) override;

  // |ModuleResolver|
  void GetModuleManifest(std::string module_id,
                         GetModuleManifestCallback callback) override;

  // |ModuleResolver|
  void FindModulesByTypes(fuchsia::modular::FindModulesByTypesQuery query,
                          FindModulesByTypesCallback callback) override;

  void Connect(
      fidl::InterfaceRequest<fuchsia::modular::ModuleResolver> request);

  // Sets the manifest for GetModuleManifest.
  void SetManifest(fuchsia::modular::ModuleManifestPtr manifest);

  // Sets the status for FindModules response.
  void SetStatus(fuchsia::modular::FindModulesStatus status);

  // Adds a result to the FindModules response.
  void AddFindModulesResult(fuchsia::modular::FindModulesResult result);

  // Sets a function for validation of the query when calling FindModules. This
  // is useful to intercept the query and ensure it was built as expected.
  void SetFindModulesValidation(
      std::function<void(const fuchsia::modular::FindModulesQuery&)> fn);

  // Sets a function for validation of the query when calling GetModuleManifest.
  // This is useful to intercept the query and ensure it was built as expected.
  void SetGetModuleManifestValidation(
      std::function<void(const fidl::StringPtr&)> fn);

 private:
  fidl::BindingSet<fuchsia::modular::ModuleResolver> bindings_;
  std::function<void(const fuchsia::modular::FindModulesQuery&)>
      find_modules_validate_fn_;
  std::function<void(const fidl::StringPtr&)> get_module_manifest_validate_fn_;
  fuchsia::modular::ModuleManifestPtr manifest_;
  fuchsia::modular::FindModulesResponse find_modules_response_;
};

}  // namespace modular

#endif  // PERIDOT_LIB_TESTING_MODULE_RESOLVER_FAKE_H_
