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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.unknowninteractions/cpp/fidl.h>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"

namespace fidl {
namespace testing {

template <>
class TestBase<::test_unknowninteractions::UnknownInteractionsProtocol> : public ::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol> {
 public:
  virtual ~TestBase<::test_unknowninteractions::UnknownInteractionsProtocol>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
  virtual void StrictOneWay(
      StrictOneWayCompleter::Sync& completer) {
    NotImplemented_("StrictOneWay", completer);
  }
  virtual void FlexibleOneWay(
      FlexibleOneWayCompleter::Sync& completer) {
    NotImplemented_("FlexibleOneWay", completer);
  }
  virtual void StrictTwoWay(
      StrictTwoWayCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWay", completer);
  }
  virtual void StrictTwoWayFields(
      StrictTwoWayFieldsCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayFields", completer);
  }
  virtual void StrictTwoWayUnion(
      StrictTwoWayUnionCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayUnion", completer);
  }
  virtual void StrictTwoWayTable(
      StrictTwoWayTableCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayTable", completer);
  }
  virtual void StrictTwoWayErr(
      StrictTwoWayErrCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayErr", completer);
  }
  virtual void StrictTwoWayFieldsErr(
      StrictTwoWayFieldsErrCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayFieldsErr", completer);
  }
  virtual void StrictTwoWayUnionErr(
      StrictTwoWayUnionErrCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayUnionErr", completer);
  }
  virtual void StrictTwoWayTableErr(
      StrictTwoWayTableErrCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayTableErr", completer);
  }
  virtual void FlexibleTwoWay(
      FlexibleTwoWayCompleter::Sync& completer) {
    NotImplemented_("FlexibleTwoWay", completer);
  }
  virtual void FlexibleTwoWayFields(
      FlexibleTwoWayFieldsCompleter::Sync& completer) {
    NotImplemented_("FlexibleTwoWayFields", completer);
  }
  virtual void FlexibleTwoWayUnion(
      FlexibleTwoWayUnionCompleter::Sync& completer) {
    NotImplemented_("FlexibleTwoWayUnion", completer);
  }
  virtual void FlexibleTwoWayTable(
      FlexibleTwoWayTableCompleter::Sync& completer) {
    NotImplemented_("FlexibleTwoWayTable", completer);
  }
  virtual void FlexibleTwoWayErr(
      FlexibleTwoWayErrCompleter::Sync& completer) {
    NotImplemented_("FlexibleTwoWayErr", completer);
  }
  virtual void FlexibleTwoWayFieldsErr(
      FlexibleTwoWayFieldsErrCompleter::Sync& completer) {
    NotImplemented_("FlexibleTwoWayFieldsErr", completer);
  }
  virtual void FlexibleTwoWayUnionErr(
      FlexibleTwoWayUnionErrCompleter::Sync& completer) {
    NotImplemented_("FlexibleTwoWayUnionErr", completer);
  }
  virtual void FlexibleTwoWayTableErr(
      FlexibleTwoWayTableErrCompleter::Sync& completer) {
    NotImplemented_("FlexibleTwoWayTableErr", completer);
  }
};

template <>
class TestBase<::test_unknowninteractions::UnknownInteractionsAjarProtocol> : public ::fidl::Server<::test_unknowninteractions::UnknownInteractionsAjarProtocol> {
 public:
  virtual ~TestBase<::test_unknowninteractions::UnknownInteractionsAjarProtocol>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
  virtual void StrictOneWay(
      StrictOneWayCompleter::Sync& completer) {
    NotImplemented_("StrictOneWay", completer);
  }
  virtual void FlexibleOneWay(
      FlexibleOneWayCompleter::Sync& completer) {
    NotImplemented_("FlexibleOneWay", completer);
  }
  virtual void StrictTwoWay(
      StrictTwoWayCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWay", completer);
  }
  virtual void StrictTwoWayFields(
      StrictTwoWayFieldsCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayFields", completer);
  }
  virtual void StrictTwoWayUnion(
      StrictTwoWayUnionCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayUnion", completer);
  }
  virtual void StrictTwoWayTable(
      StrictTwoWayTableCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayTable", completer);
  }
  virtual void StrictTwoWayErr(
      StrictTwoWayErrCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayErr", completer);
  }
  virtual void StrictTwoWayFieldsErr(
      StrictTwoWayFieldsErrCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayFieldsErr", completer);
  }
  virtual void StrictTwoWayUnionErr(
      StrictTwoWayUnionErrCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayUnionErr", completer);
  }
  virtual void StrictTwoWayTableErr(
      StrictTwoWayTableErrCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayTableErr", completer);
  }
};

template <>
class TestBase<::test_unknowninteractions::UnknownInteractionsClosedProtocol> : public ::fidl::Server<::test_unknowninteractions::UnknownInteractionsClosedProtocol> {
 public:
  virtual ~TestBase<::test_unknowninteractions::UnknownInteractionsClosedProtocol>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
  virtual void StrictOneWay(
      StrictOneWayCompleter::Sync& completer) {
    NotImplemented_("StrictOneWay", completer);
  }
  virtual void StrictTwoWay(
      StrictTwoWayCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWay", completer);
  }
  virtual void StrictTwoWayFields(
      StrictTwoWayFieldsCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayFields", completer);
  }
  virtual void StrictTwoWayUnion(
      StrictTwoWayUnionCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayUnion", completer);
  }
  virtual void StrictTwoWayTable(
      StrictTwoWayTableCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayTable", completer);
  }
  virtual void StrictTwoWayErr(
      StrictTwoWayErrCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayErr", completer);
  }
  virtual void StrictTwoWayFieldsErr(
      StrictTwoWayFieldsErrCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayFieldsErr", completer);
  }
  virtual void StrictTwoWayUnionErr(
      StrictTwoWayUnionErrCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayUnionErr", completer);
  }
  virtual void StrictTwoWayTableErr(
      StrictTwoWayTableErrCompleter::Sync& completer) {
    NotImplemented_("StrictTwoWayTableErr", completer);
  }
};
#pragma clang diagnostic pop

}  // namespace testing
}  // namespace fidl
