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

#pragma once

#include <test/protocolpayloads/cpp/fidl.h>
#include <test/protocolpayloads/imported/cpp/fidl.h>
namespace test {
namespace protocolpayloads {
namespace testing {
class MainProtocol_TestBase : public ::test::protocolpayloads::MainProtocol {
 public:
  virtual ~MainProtocol_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void OneWayComposed(int32_t a) override {
    NotImplemented_("OneWayComposed");
  }
  void TwoWayComposed(int32_t a, TwoWayComposedCallback callback) override {
    NotImplemented_("TwoWayComposed");
  }
  void TwoWayComposedWithError(int32_t a, TwoWayComposedWithErrorCallback callback) override {
    NotImplemented_("TwoWayComposedWithError");
  }
  void OneWayLocal(uint32_t a, uint32_t b) override {
    NotImplemented_("OneWayLocal");
  }
  void TwoWayLocal(uint32_t a, uint32_t b, TwoWayLocalCallback callback) override {
    NotImplemented_("TwoWayLocal");
  }
  void TwoWayLocalWithError(uint32_t a, uint32_t b, TwoWayLocalWithErrorCallback callback) override {
    NotImplemented_("TwoWayLocalWithError");
  }
  void OneWayImport(int32_t a) override {
    NotImplemented_("OneWayImport");
  }
  void TwoWayImport(int32_t a, TwoWayImportCallback callback) override {
    NotImplemented_("TwoWayImport");
  }
  void TwoWayImportWithError(int32_t a, TwoWayImportWithErrorCallback callback) override {
    NotImplemented_("TwoWayImportWithError");
  }
  void OneWayAnon(uint32_t a, uint32_t b) override {
    NotImplemented_("OneWayAnon");
  }
  void TwoWayAnon(uint32_t a, uint32_t b, TwoWayAnonCallback callback) override {
    NotImplemented_("TwoWayAnon");
  }
  void TwoWayAnonWithError(uint32_t a, uint32_t b, TwoWayAnonWithErrorCallback callback) override {
    NotImplemented_("TwoWayAnonWithError");
  }
};
}  // namespace testing
}  // namespace protocolpayloads
}  // namespace test
