// 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 "peridot/lib/testing/module_resolver_fake.h"

namespace modular {

ModuleResolverFake::ModuleResolverFake() { find_modules_response_.results.resize(0); }

ModuleResolverFake::~ModuleResolverFake() = default;

void ModuleResolverFake::SetStatus(fuchsia::modular::FindModulesStatus status) {
  find_modules_response_.status = status;
}

void ModuleResolverFake::FindModules(fuchsia::modular::FindModulesQuery query,
                                     FindModulesCallback callback) {
  if (find_modules_validate_fn_) {
    find_modules_validate_fn_(query);
  }
  callback(std::move(find_modules_response_));
}

void ModuleResolverFake::Connect(fidl::InterfaceRequest<fuchsia::modular::ModuleResolver> request) {
  bindings_.AddBinding(this, std::move(request));
}

void ModuleResolverFake::SetManifest(fuchsia::modular::ModuleManifestPtr manifest) {
  manifest_ = std::move(manifest);
}

void ModuleResolverFake::AddFindModulesResult(fuchsia::modular::FindModulesResult result) {
  find_modules_response_.results.push_back(std::move(result));
}

void ModuleResolverFake::SetFindModulesValidation(
    fit::function<void(const fuchsia::modular::FindModulesQuery&)> fn) {
  find_modules_validate_fn_ = std::move(fn);
}

void ModuleResolverFake::SetGetModuleManifestValidation(
    fit::function<void(const fidl::StringPtr&)> fn) {
  get_module_manifest_validate_fn_ = std::move(fn);
}

}  // namespace modular
