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

#pragma once

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

template <>
class WireTestBase<::test_protocollayouts::MainProtocol>
    : public ::fidl::WireServer<::test_protocollayouts::MainProtocol> {
 public:
  virtual ~WireTestBase<::test_protocollayouts::MainProtocol>() = default;
  virtual void NotImplemented_(const std::string& name,
                               ::fidl::CompleterBase& completer) = 0;
  virtual void OneWayAnonComposed(
      OneWayAnonComposedRequestView request,
      OneWayAnonComposedCompleter::Sync& completer) override {
    NotImplemented_("OneWayAnonComposed", completer);
  }
  virtual void TwoWayAnonComposed(
      TwoWayAnonComposedRequestView request,
      TwoWayAnonComposedCompleter::Sync& completer) override {
    NotImplemented_("TwoWayAnonComposed", completer);
  }
  virtual void TwoWayAnonComposedWithError(
      TwoWayAnonComposedWithErrorRequestView request,
      TwoWayAnonComposedWithErrorCompleter::Sync& completer) override {
    NotImplemented_("TwoWayAnonComposedWithError", completer);
  }
  virtual void OneWayNamedComposed(
      OneWayNamedComposedRequestView request,
      OneWayNamedComposedCompleter::Sync& completer) override {
    NotImplemented_("OneWayNamedComposed", completer);
  }
  virtual void TwoWayNamedComposed(
      TwoWayNamedComposedRequestView request,
      TwoWayNamedComposedCompleter::Sync& completer) override {
    NotImplemented_("TwoWayNamedComposed", completer);
  }
  virtual void TwoWayNamedComposedWithError(
      TwoWayNamedComposedWithErrorRequestView request,
      TwoWayNamedComposedWithErrorCompleter::Sync& completer) override {
    NotImplemented_("TwoWayNamedComposedWithError", completer);
  }
  virtual void OneWayImport(OneWayImportRequestView request,
                            OneWayImportCompleter::Sync& completer) override {
    NotImplemented_("OneWayImport", completer);
  }
  virtual void TwoWayImport(TwoWayImportRequestView request,
                            TwoWayImportCompleter::Sync& completer) override {
    NotImplemented_("TwoWayImport", completer);
  }
  virtual void TwoWayImportWithError(
      TwoWayImportWithErrorRequestView request,
      TwoWayImportWithErrorCompleter::Sync& completer) override {
    NotImplemented_("TwoWayImportWithError", completer);
  }
  virtual void OneWayLocal(OneWayLocalRequestView request,
                           OneWayLocalCompleter::Sync& completer) override {
    NotImplemented_("OneWayLocal", completer);
  }
  virtual void TwoWayLocal(TwoWayLocalRequestView request,
                           TwoWayLocalCompleter::Sync& completer) override {
    NotImplemented_("TwoWayLocal", completer);
  }
  virtual void TwoWayLocalWithError(
      TwoWayLocalWithErrorRequestView request,
      TwoWayLocalWithErrorCompleter::Sync& completer) override {
    NotImplemented_("TwoWayLocalWithError", completer);
  }
  virtual void OneWayAnon(OneWayAnonRequestView request,
                          OneWayAnonCompleter::Sync& completer) override {
    NotImplemented_("OneWayAnon", completer);
  }
  virtual void TwoWayAnon(TwoWayAnonRequestView request,
                          TwoWayAnonCompleter::Sync& completer) override {
    NotImplemented_("TwoWayAnon", completer);
  }
  virtual void TwoWayAnonWithError(
      TwoWayAnonWithErrorRequestView request,
      TwoWayAnonWithErrorCompleter::Sync& completer) override {
    NotImplemented_("TwoWayAnonWithError", completer);
  }
};

template <>
class ::fidl::testing::WireSyncEventHandlerTestBase<
    ::test_protocollayouts::MainProtocol>
    : public ::fidl::WireSyncEventHandler<
          ::test_protocollayouts::MainProtocol> {
 public:
  virtual ~WireSyncEventHandlerTestBase<
      ::test_protocollayouts::MainProtocol>() = default;
  virtual void NotImplemented_(const std::string& name) = 0;
  virtual void OnAnonComposed(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonComposed>*
          event) override {
    NotImplemented_("OnAnonComposed");
  }
  virtual void OnAnonComposedWithError(
      ::fidl::WireEvent<
          ::test_protocollayouts::MainProtocol::OnAnonComposedWithError>* event)
      override {
    NotImplemented_("OnAnonComposedWithError");
  }
  virtual void OnNamedComposed(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnNamedComposed>*
          event) override {
    NotImplemented_("OnNamedComposed");
  }
  virtual void OnNamedComposedWithError(
      ::fidl::WireEvent<
          ::test_protocollayouts::MainProtocol::OnNamedComposedWithError>*
          event) override {
    NotImplemented_("OnNamedComposedWithError");
  }
  virtual void OnImport(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnImport>* event)
      override {
    NotImplemented_("OnImport");
  }
  virtual void OnImportWithError(
      ::fidl::WireEvent<
          ::test_protocollayouts::MainProtocol::OnImportWithError>* event)
      override {
    NotImplemented_("OnImportWithError");
  }
  virtual void OnLocal(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocal>* event)
      override {
    NotImplemented_("OnLocal");
  }
  virtual void OnLocalWithError(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnLocalWithError>*
          event) override {
    NotImplemented_("OnLocalWithError");
  }
  virtual void OnAnon(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnon>* event)
      override {
    NotImplemented_("OnAnon");
  }
  virtual void OnAnonWithError(
      ::fidl::WireEvent<::test_protocollayouts::MainProtocol::OnAnonWithError>*
          event) override {
    NotImplemented_("OnAnonWithError");
  }
};
}  // namespace testing
}  // namespace fidl
