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

#pragma once

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

template <>
class WireTestBase<::test_service::SecondProtocol>
    : public ::fidl::WireServer<::test_service::SecondProtocol> {
 public:
  virtual ~WireTestBase<::test_service::SecondProtocol>() = default;
  virtual void NotImplemented_(const std::string& name,
                               ::fidl::CompleterBase& completer) = 0;
  virtual void MethodOnSecond(
      MethodOnSecondRequestView request,
      MethodOnSecondCompleter::Sync& completer) override {
    NotImplemented_("MethodOnSecond", completer);
  }
};

template <>
class ::fidl::testing::WireSyncEventHandlerTestBase<
    ::test_service::SecondProtocol>
    : public ::fidl::WireSyncEventHandler<::test_service::SecondProtocol> {
 public:
  virtual ~WireSyncEventHandlerTestBase<::test_service::SecondProtocol>() =
      default;
  virtual void NotImplemented_(const std::string& name) = 0;
};

template <>
class WireTestBase<::test_service::FirstProtocol>
    : public ::fidl::WireServer<::test_service::FirstProtocol> {
 public:
  virtual ~WireTestBase<::test_service::FirstProtocol>() = default;
  virtual void NotImplemented_(const std::string& name,
                               ::fidl::CompleterBase& completer) = 0;
  virtual void MethodOnFirst(MethodOnFirstRequestView request,
                             MethodOnFirstCompleter::Sync& completer) override {
    NotImplemented_("MethodOnFirst", completer);
  }
};

template <>
class ::fidl::testing::WireSyncEventHandlerTestBase<
    ::test_service::FirstProtocol>
    : public ::fidl::WireSyncEventHandler<::test_service::FirstProtocol> {
 public:
  virtual ~WireSyncEventHandlerTestBase<::test_service::FirstProtocol>() =
      default;
  virtual void NotImplemented_(const std::string& name) = 0;
};
}  // namespace testing
}  // namespace fidl
