// Copyright 2019 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 EXAMPLES_TESTS_TEST_SUITE_H_
#define EXAMPLES_TESTS_TEST_SUITE_H_

#include <fuchsia/test/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/fidl/cpp/binding.h>
#include <lib/fidl/cpp/binding_set.h>

#include <string>
#include <unordered_set>

namespace example {

struct Options {
  bool dont_service_get_tests = false;
  bool dont_service_run = false;
  bool close_channel_get_tests = false;
  bool close_channel_run = false;
  bool dont_send_on_finish_event = false;
};

struct TestInput {
  std::string name;
  fuchsia::test::Status status;
  // Treat as disabled by developer if true
  bool disabled = false;
  /// Skips OnTestCaseFinished if true
  bool incomplete_test = false;
  // will not set status if false.
  bool set_result_status = true;
  // will not write to stderr if false.
  bool write_stderr_logs = false;
};

class CaseIterator : public fuchsia::test::CaseIterator {
 public:
  CaseIterator(const std::vector<TestInput>& test_inputs,
               fit::function<void(CaseIterator*)> done_callback)
      : test_inputs_(test_inputs),
        iter_(test_inputs_.begin()),
        done_callback_(std::move(done_callback)) {}

  void GetNext(GetNextCallback callback) override;

 private:
  const std::vector<TestInput>& test_inputs_;
  std::vector<TestInput>::const_iterator iter_;
  fit::function<void(CaseIterator*)> done_callback_;
};

class TestSuite : public fuchsia::test::Suite {
 public:
  explicit TestSuite(async::Loop* loop, std::vector<TestInput> inputs, Options options = Options{});

  void GetTests(::fidl::InterfaceRequest<fuchsia::test::CaseIterator>) override;

  void Run(std::vector<fuchsia::test::Invocation> tests, fuchsia::test::RunOptions /*unused*/,
           fidl::InterfaceHandle<fuchsia::test::RunListener> run_listener) override;

  fidl::InterfaceRequestHandler<fuchsia::test::Suite> GetHandler();

 private:
  bool ShouldSkipTest(const fuchsia::test::RunOptions& run_options,
                      const std::string& test_name) const;

  fidl::Binding<fuchsia::test::Suite> binding_;
  fidl::BindingSet<fuchsia::test::CaseIterator, std::unique_ptr<CaseIterator>>
      case_iterator_bindings_;
  const std::vector<TestInput> test_inputs_;
  std::unordered_set<std::string> disabled_tests_;
  Options options_;
  async::Loop* loop_;
};

}  // namespace example

#endif  // EXAMPLES_TESTS_TEST_SUITE_H_
