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

// fidl_experiment = output_index_json

#pragma once

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

class WithAndWithoutRequestResponse_TestBase : public ::test::protocols::WithAndWithoutRequestResponse {
 public:
  virtual ~WithAndWithoutRequestResponse_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void NoRequestNoResponse() override {
    NotImplemented_("NoRequestNoResponse");
  }
  void NoRequestEmptyResponse(NoRequestEmptyResponseCallback callback) override {
    NotImplemented_("NoRequestEmptyResponse");
  }
  void NoRequestWithResponse(NoRequestWithResponseCallback callback) override {
    NotImplemented_("NoRequestWithResponse");
  }
  void WithRequestNoResponse(::std::string arg) override {
    NotImplemented_("WithRequestNoResponse");
  }
  void WithRequestEmptyResponse(::std::string arg, WithRequestEmptyResponseCallback callback) override {
    NotImplemented_("WithRequestEmptyResponse");
  }
  void WithRequestWithResponse(::std::string arg, WithRequestWithResponseCallback callback) override {
    NotImplemented_("WithRequestWithResponse");
  }
};

class WithErrorSyntax_TestBase : public ::test::protocols::WithErrorSyntax {
 public:
  virtual ~WithErrorSyntax_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void ResponseAsStruct(ResponseAsStructCallback callback) override {
    NotImplemented_("ResponseAsStruct");
  }
  void ErrorAsPrimitive(ErrorAsPrimitiveCallback callback) override {
    NotImplemented_("ErrorAsPrimitive");
  }
  void ErrorAsEnum(ErrorAsEnumCallback callback) override {
    NotImplemented_("ErrorAsEnum");
  }
  void HandleInResult(HandleInResultCallback callback) override {
    NotImplemented_("HandleInResult");
  }
};

class ChannelProtocol_TestBase : public ::test::protocols::ChannelProtocol {
 public:
  virtual ~ChannelProtocol_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void MethodA(int64_t a, int64_t b) override {
    NotImplemented_("MethodA");
  }
  void MethodB(int64_t a, int64_t b, MethodBCallback callback) override {
    NotImplemented_("MethodB");
  }
  void TakeHandle(::zx::handle h, TakeHandleCallback callback) override {
    NotImplemented_("TakeHandle");
  }
  void MutateSocket(::zx::socket a, MutateSocketCallback callback) override {
    NotImplemented_("MutateSocket");
  }
};

class DiscoverableProtocol_TestBase : public ::test::protocols::DiscoverableProtocol {
 public:
  virtual ~DiscoverableProtocol_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void Method() override {
    NotImplemented_("Method");
  }
};

class AnotherDiscoverableProtocol_TestBase : public ::test::protocols::AnotherDiscoverableProtocol {
 public:
  virtual ~AnotherDiscoverableProtocol_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
};

class PlatformServer_TestBase : public ::test::protocols::PlatformServer {
 public:
  virtual ~PlatformServer_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
};

class HandleRightsProtocol_TestBase : public ::test::protocols::HandleRightsProtocol {
 public:
  virtual ~HandleRightsProtocol_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void NoResponseMethod(::zx::socket h) override {
    NotImplemented_("NoResponseMethod");
  }
  void ResponseMethod(::zx::socket h, ResponseMethodCallback callback) override {
    NotImplemented_("ResponseMethod");
  }
};

class WithProtocolEnds_TestBase : public ::test::protocols::WithProtocolEnds {
 public:
  virtual ~WithProtocolEnds_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void ClientEnds(::fidl::InterfaceHandle<::test::protocols::DiscoverableProtocol> in, ClientEndsCallback callback) override {
    NotImplemented_("ClientEnds");
  }
  void ServerEnds(::fidl::InterfaceRequest<::test::protocols::DiscoverableProtocol> in, ServerEndsCallback callback) override {
    NotImplemented_("ServerEnds");
  }
  void StructContainingEnds(::test::protocols::ProtocolEnds in, StructContainingEndsCallback callback) override {
    NotImplemented_("StructContainingEnds");
  }
};

class ManyParameters_TestBase : public ::test::protocols::ManyParameters {
 public:
  virtual ~ManyParameters_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void Fifteen(bool p1, bool p2, bool p3, bool p4, bool p5, bool p6, bool p7, bool p8, bool p9, bool p10, bool p11, bool p12, bool p13, bool p14, bool p15) override {
    NotImplemented_("Fifteen");
  }
};

class MethodWithUnion_TestBase : public ::test::protocols::MethodWithUnion {
 public:
  virtual ~MethodWithUnion_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void UnionMethod(::test::protocols::TheUnion u, UnionMethodCallback callback) override {
    NotImplemented_("UnionMethod");
  }
};
}  // namespace testing
}  // namespace protocols
}  // namespace test
