// WARNING: This file is machine generated by fidlgen.

// fidl_experiment = output_index_json

#pragma once

#include <test/protocollayouts/cpp/fidl.h>
#include <test/protocollayouts/imported/cpp/fidl.h>
namespace test {
namespace protocollayouts {
namespace testing {

class MainProtocol_TestBase : public ::test::protocollayouts::MainProtocol {
 public:
  virtual ~MainProtocol_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void OneWayAnonComposed(::test::protocollayouts::imported::ComposedProtocolOneWayAnonComposedRequest ComposedProtocolOneWayAnonComposedRequest) override {
    NotImplemented_("OneWayAnonComposed");
  }
  void TwoWayAnonComposed(::test::protocollayouts::imported::ComposedProtocolTwoWayAnonComposedRequest ComposedProtocolTwoWayAnonComposedRequest, TwoWayAnonComposedCallback callback) override {
    NotImplemented_("TwoWayAnonComposed");
  }
  void TwoWayAnonComposedWithError(::test::protocollayouts::imported::ComposedProtocolTwoWayAnonComposedWithErrorRequest ComposedProtocolTwoWayAnonComposedWithErrorRequest, TwoWayAnonComposedWithErrorCallback callback) override {
    NotImplemented_("TwoWayAnonComposedWithError");
  }
  void OneWayNamedComposed(::test::protocollayouts::imported::ImportTablePayload ImportTablePayload) override {
    NotImplemented_("OneWayNamedComposed");
  }
  void TwoWayNamedComposed(::test::protocollayouts::imported::ImportUnionPayload ImportUnionPayload, TwoWayNamedComposedCallback callback) override {
    NotImplemented_("TwoWayNamedComposed");
  }
  void TwoWayNamedComposedWithError(::test::protocollayouts::imported::ImportTablePayload ImportTablePayload, TwoWayNamedComposedWithErrorCallback callback) override {
    NotImplemented_("TwoWayNamedComposedWithError");
  }
  void OneWayImport(::test::protocollayouts::imported::ImportTablePayload ImportTablePayload) override {
    NotImplemented_("OneWayImport");
  }
  void TwoWayImport(::test::protocollayouts::imported::ImportUnionPayload ImportUnionPayload, TwoWayImportCallback callback) override {
    NotImplemented_("TwoWayImport");
  }
  void TwoWayImportWithError(::test::protocollayouts::imported::ImportTablePayload ImportTablePayload, TwoWayImportWithErrorCallback callback) override {
    NotImplemented_("TwoWayImportWithError");
  }
  void OneWayLocal(::test::protocollayouts::LocalTablePayload LocalTablePayload) override {
    NotImplemented_("OneWayLocal");
  }
  void TwoWayLocal(::test::protocollayouts::LocalUnionPayload LocalUnionPayload, TwoWayLocalCallback callback) override {
    NotImplemented_("TwoWayLocal");
  }
  void TwoWayLocalWithError(::test::protocollayouts::LocalTablePayload LocalTablePayload, TwoWayLocalWithErrorCallback callback) override {
    NotImplemented_("TwoWayLocalWithError");
  }
  void OneWayAnon(::test::protocollayouts::MainProtocolOneWayAnonRequest MainProtocolOneWayAnonRequest) override {
    NotImplemented_("OneWayAnon");
  }
  void TwoWayAnon(::test::protocollayouts::MainProtocolTwoWayAnonRequest MainProtocolTwoWayAnonRequest, TwoWayAnonCallback callback) override {
    NotImplemented_("TwoWayAnon");
  }
  void TwoWayAnonWithError(::test::protocollayouts::MainProtocolTwoWayAnonWithErrorRequest MainProtocolTwoWayAnonWithErrorRequest, TwoWayAnonWithErrorCallback callback) override {
    NotImplemented_("TwoWayAnonWithError");
  }
};

class OpenProtocol_TestBase : public ::test::protocollayouts::OpenProtocol {
 public:
  virtual ~OpenProtocol_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void FlexibleOneWay(int32_t value) override {
    NotImplemented_("FlexibleOneWay");
  }
  void FlexibleTwoWayNoError(int32_t value, FlexibleTwoWayNoErrorCallback callback) override {
    NotImplemented_("FlexibleTwoWayNoError");
  }
  void FlexibleTwoWayWithError(int32_t value, FlexibleTwoWayWithErrorCallback callback) override {
    NotImplemented_("FlexibleTwoWayWithError");
  }
  void StrictOneWay(int32_t value) override {
    NotImplemented_("StrictOneWay");
  }
  void StrictTwoWayNoError(int32_t value, StrictTwoWayNoErrorCallback callback) override {
    NotImplemented_("StrictTwoWayNoError");
  }
  void StrictTwoWayWithError(int32_t value, StrictTwoWayWithErrorCallback callback) override {
    NotImplemented_("StrictTwoWayWithError");
  }
  void FlexibleOneWayNamedPayload(int32_t value) override {
    NotImplemented_("FlexibleOneWayNamedPayload");
  }
  void handle_unknown_method(uint64_t ordinal, bool method_has_response) override {
    NotImplemented_("handle_unknown_method");
  }
};
}  // namespace testing
}  // namespace protocollayouts
}  // namespace test
