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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.union/cpp/wire.h>

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

namespace fidl {
namespace testing {

template <>
class WireTestBase<::test_union::TestProtocol> : public ::fidl::WireServer<::test_union::TestProtocol> {
 public:
  virtual ~WireTestBase<::test_union::TestProtocol>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
  virtual void StrictUnionHenceResponseMayBeStackAllocated(
      StrictUnionHenceResponseMayBeStackAllocatedCompleter::Sync& completer) override {
    NotImplemented_("StrictUnionHenceResponseMayBeStackAllocated", completer);
  }
  virtual void FlexibleUnionHenceResponseMustBeHeapAllocated(
      FlexibleUnionHenceResponseMustBeHeapAllocatedCompleter::Sync& completer) override {
    NotImplemented_("FlexibleUnionHenceResponseMustBeHeapAllocated", completer);
  }
};

template <>
class WireSyncEventHandlerTestBase<::test_union::TestProtocol> : public ::fidl::WireSyncEventHandler<::test_union::TestProtocol> {
 public:
  virtual ~WireSyncEventHandlerTestBase<::test_union::TestProtocol>() = default;
  virtual void NotImplemented_(const std::string& name) = 0;
};
#pragma clang diagnostic pop

}  // namespace testing
}  // namespace fidl
