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

// fidl_experiment = output_index_json

#pragma once

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

class UnknownInteractionsProtocol_TestBase : public ::test::unknowninteractions::UnknownInteractionsProtocol {
 public:
  virtual ~UnknownInteractionsProtocol_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void StrictOneWay() override {
    NotImplemented_("StrictOneWay");
  }
  void FlexibleOneWay() override {
    NotImplemented_("FlexibleOneWay");
  }
  void StrictTwoWay(StrictTwoWayCallback callback) override {
    NotImplemented_("StrictTwoWay");
  }
  void StrictTwoWayFields(StrictTwoWayFieldsCallback callback) override {
    NotImplemented_("StrictTwoWayFields");
  }
  void StrictTwoWayUnion(StrictTwoWayUnionCallback callback) override {
    NotImplemented_("StrictTwoWayUnion");
  }
  void StrictTwoWayTable(StrictTwoWayTableCallback callback) override {
    NotImplemented_("StrictTwoWayTable");
  }
  void StrictTwoWayErr(StrictTwoWayErrCallback callback) override {
    NotImplemented_("StrictTwoWayErr");
  }
  void StrictTwoWayFieldsErr(StrictTwoWayFieldsErrCallback callback) override {
    NotImplemented_("StrictTwoWayFieldsErr");
  }
  void StrictTwoWayUnionErr(StrictTwoWayUnionErrCallback callback) override {
    NotImplemented_("StrictTwoWayUnionErr");
  }
  void StrictTwoWayTableErr(StrictTwoWayTableErrCallback callback) override {
    NotImplemented_("StrictTwoWayTableErr");
  }
  void FlexibleTwoWay(FlexibleTwoWayCallback callback) override {
    NotImplemented_("FlexibleTwoWay");
  }
  void FlexibleTwoWayFields(FlexibleTwoWayFieldsCallback callback) override {
    NotImplemented_("FlexibleTwoWayFields");
  }
  void FlexibleTwoWayUnion(FlexibleTwoWayUnionCallback callback) override {
    NotImplemented_("FlexibleTwoWayUnion");
  }
  void FlexibleTwoWayTable(FlexibleTwoWayTableCallback callback) override {
    NotImplemented_("FlexibleTwoWayTable");
  }
  void FlexibleTwoWayErr(FlexibleTwoWayErrCallback callback) override {
    NotImplemented_("FlexibleTwoWayErr");
  }
  void FlexibleTwoWayFieldsErr(FlexibleTwoWayFieldsErrCallback callback) override {
    NotImplemented_("FlexibleTwoWayFieldsErr");
  }
  void FlexibleTwoWayUnionErr(FlexibleTwoWayUnionErrCallback callback) override {
    NotImplemented_("FlexibleTwoWayUnionErr");
  }
  void FlexibleTwoWayTableErr(FlexibleTwoWayTableErrCallback callback) override {
    NotImplemented_("FlexibleTwoWayTableErr");
  }
  void handle_unknown_method(uint64_t ordinal, bool method_has_response) override {
    NotImplemented_("handle_unknown_method");
  }
};

class UnknownInteractionsAjarProtocol_TestBase : public ::test::unknowninteractions::UnknownInteractionsAjarProtocol {
 public:
  virtual ~UnknownInteractionsAjarProtocol_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void StrictOneWay() override {
    NotImplemented_("StrictOneWay");
  }
  void FlexibleOneWay() override {
    NotImplemented_("FlexibleOneWay");
  }
  void StrictTwoWay(StrictTwoWayCallback callback) override {
    NotImplemented_("StrictTwoWay");
  }
  void StrictTwoWayFields(StrictTwoWayFieldsCallback callback) override {
    NotImplemented_("StrictTwoWayFields");
  }
  void StrictTwoWayUnion(StrictTwoWayUnionCallback callback) override {
    NotImplemented_("StrictTwoWayUnion");
  }
  void StrictTwoWayTable(StrictTwoWayTableCallback callback) override {
    NotImplemented_("StrictTwoWayTable");
  }
  void StrictTwoWayErr(StrictTwoWayErrCallback callback) override {
    NotImplemented_("StrictTwoWayErr");
  }
  void StrictTwoWayFieldsErr(StrictTwoWayFieldsErrCallback callback) override {
    NotImplemented_("StrictTwoWayFieldsErr");
  }
  void StrictTwoWayUnionErr(StrictTwoWayUnionErrCallback callback) override {
    NotImplemented_("StrictTwoWayUnionErr");
  }
  void StrictTwoWayTableErr(StrictTwoWayTableErrCallback callback) override {
    NotImplemented_("StrictTwoWayTableErr");
  }
  void handle_unknown_method(uint64_t ordinal) override {
    NotImplemented_("handle_unknown_method");
  }
};

class UnknownInteractionsClosedProtocol_TestBase : public ::test::unknowninteractions::UnknownInteractionsClosedProtocol {
 public:
  virtual ~UnknownInteractionsClosedProtocol_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void StrictOneWay() override {
    NotImplemented_("StrictOneWay");
  }
  void StrictTwoWay(StrictTwoWayCallback callback) override {
    NotImplemented_("StrictTwoWay");
  }
  void StrictTwoWayFields(StrictTwoWayFieldsCallback callback) override {
    NotImplemented_("StrictTwoWayFields");
  }
  void StrictTwoWayUnion(StrictTwoWayUnionCallback callback) override {
    NotImplemented_("StrictTwoWayUnion");
  }
  void StrictTwoWayTable(StrictTwoWayTableCallback callback) override {
    NotImplemented_("StrictTwoWayTable");
  }
  void StrictTwoWayErr(StrictTwoWayErrCallback callback) override {
    NotImplemented_("StrictTwoWayErr");
  }
  void StrictTwoWayFieldsErr(StrictTwoWayFieldsErrCallback callback) override {
    NotImplemented_("StrictTwoWayFieldsErr");
  }
  void StrictTwoWayUnionErr(StrictTwoWayUnionErrCallback callback) override {
    NotImplemented_("StrictTwoWayUnionErr");
  }
  void StrictTwoWayTableErr(StrictTwoWayTableErrCallback callback) override {
    NotImplemented_("StrictTwoWayTableErr");
  }
};
}  // namespace testing
}  // namespace unknowninteractions
}  // namespace test
