// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc.  All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd

// Code generated by protoc-gen-go. DO NOT EDIT.
// source: conformance/conformance.proto

package conformance

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
	unsafe "unsafe"
)

type WireFormat int32

const (
	WireFormat_UNSPECIFIED WireFormat = 0
	WireFormat_PROTOBUF    WireFormat = 1
	WireFormat_JSON        WireFormat = 2
	WireFormat_JSPB        WireFormat = 3 // Only used inside Google. Opensource testees just skip it.
	WireFormat_TEXT_FORMAT WireFormat = 4
)

// Enum value maps for WireFormat.
var (
	WireFormat_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "PROTOBUF",
		2: "JSON",
		3: "JSPB",
		4: "TEXT_FORMAT",
	}
	WireFormat_value = map[string]int32{
		"UNSPECIFIED": 0,
		"PROTOBUF":    1,
		"JSON":        2,
		"JSPB":        3,
		"TEXT_FORMAT": 4,
	}
)

func (x WireFormat) Enum() *WireFormat {
	p := new(WireFormat)
	*p = x
	return p
}

func (x WireFormat) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (WireFormat) Descriptor() protoreflect.EnumDescriptor {
	return file_conformance_conformance_proto_enumTypes[0].Descriptor()
}

func (WireFormat) Type() protoreflect.EnumType {
	return &file_conformance_conformance_proto_enumTypes[0]
}

func (x WireFormat) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use WireFormat.Descriptor instead.
func (WireFormat) EnumDescriptor() ([]byte, []int) {
	return file_conformance_conformance_proto_rawDescGZIP(), []int{0}
}

type TestCategory int32

const (
	TestCategory_UNSPECIFIED_TEST TestCategory = 0
	TestCategory_BINARY_TEST      TestCategory = 1 // Test binary wire format.
	TestCategory_JSON_TEST        TestCategory = 2 // Test json wire format.
	// Similar to JSON_TEST. However, during parsing json, testee should ignore
	// unknown fields. This feature is optional. Each implementation can decide
	// whether to support it.  See
	// https://developers.google.com/protocol-buffers/docs/proto3#json_options
	// for more detail.
	TestCategory_JSON_IGNORE_UNKNOWN_PARSING_TEST TestCategory = 3
	// Test jspb wire format. Only used inside Google. Opensource testees just
	// skip it.
	TestCategory_JSPB_TEST TestCategory = 4
	// Test text format. For cpp, java and python, testees can already deal with
	// this type. Testees of other languages can simply skip it.
	TestCategory_TEXT_FORMAT_TEST TestCategory = 5
)

// Enum value maps for TestCategory.
var (
	TestCategory_name = map[int32]string{
		0: "UNSPECIFIED_TEST",
		1: "BINARY_TEST",
		2: "JSON_TEST",
		3: "JSON_IGNORE_UNKNOWN_PARSING_TEST",
		4: "JSPB_TEST",
		5: "TEXT_FORMAT_TEST",
	}
	TestCategory_value = map[string]int32{
		"UNSPECIFIED_TEST":                 0,
		"BINARY_TEST":                      1,
		"JSON_TEST":                        2,
		"JSON_IGNORE_UNKNOWN_PARSING_TEST": 3,
		"JSPB_TEST":                        4,
		"TEXT_FORMAT_TEST":                 5,
	}
)

func (x TestCategory) Enum() *TestCategory {
	p := new(TestCategory)
	*p = x
	return p
}

func (x TestCategory) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (TestCategory) Descriptor() protoreflect.EnumDescriptor {
	return file_conformance_conformance_proto_enumTypes[1].Descriptor()
}

func (TestCategory) Type() protoreflect.EnumType {
	return &file_conformance_conformance_proto_enumTypes[1]
}

func (x TestCategory) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use TestCategory.Descriptor instead.
func (TestCategory) EnumDescriptor() ([]byte, []int) {
	return file_conformance_conformance_proto_rawDescGZIP(), []int{1}
}

// Meant to encapsulate all types of tests: successes, skips, failures, etc.
// Therefore, this may or may not have a failure message. Failure messages
// may be truncated for our failure lists.
type TestStatus struct {
	state          protoimpl.MessageState `protogen:"open.v1"`
	Name           string                 `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	FailureMessage string                 `protobuf:"bytes,2,opt,name=failure_message,json=failureMessage,proto3" json:"failure_message,omitempty"`
	// What an actual test name matched to in a failure list. Can be wildcarded or
	// an exact match without wildcards.
	MatchedName   string `protobuf:"bytes,3,opt,name=matched_name,json=matchedName,proto3" json:"matched_name,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *TestStatus) Reset() {
	*x = TestStatus{}
	mi := &file_conformance_conformance_proto_msgTypes[0]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *TestStatus) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TestStatus) ProtoMessage() {}

func (x *TestStatus) ProtoReflect() protoreflect.Message {
	mi := &file_conformance_conformance_proto_msgTypes[0]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TestStatus.ProtoReflect.Descriptor instead.
func (*TestStatus) Descriptor() ([]byte, []int) {
	return file_conformance_conformance_proto_rawDescGZIP(), []int{0}
}

func (x *TestStatus) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *TestStatus) GetFailureMessage() string {
	if x != nil {
		return x.FailureMessage
	}
	return ""
}

func (x *TestStatus) GetMatchedName() string {
	if x != nil {
		return x.MatchedName
	}
	return ""
}

// The conformance runner will request a list of failures as the first request.
// This will be known by message_type == "conformance.FailureSet", a conformance
// test should return a serialized FailureSet in protobuf_payload.
type FailureSet struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Test          []*TestStatus          `protobuf:"bytes,2,rep,name=test,proto3" json:"test,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *FailureSet) Reset() {
	*x = FailureSet{}
	mi := &file_conformance_conformance_proto_msgTypes[1]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *FailureSet) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FailureSet) ProtoMessage() {}

func (x *FailureSet) ProtoReflect() protoreflect.Message {
	mi := &file_conformance_conformance_proto_msgTypes[1]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use FailureSet.ProtoReflect.Descriptor instead.
func (*FailureSet) Descriptor() ([]byte, []int) {
	return file_conformance_conformance_proto_rawDescGZIP(), []int{1}
}

func (x *FailureSet) GetTest() []*TestStatus {
	if x != nil {
		return x.Test
	}
	return nil
}

// Represents a single test case's input.  The testee should:
//
//  1. parse this proto (which should always succeed)
//  2. parse the protobuf or JSON payload in "payload" (which may fail)
//  3. if the parse succeeded, serialize the message in the requested format.
type ConformanceRequest struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The payload (whether protobuf of JSON) is always for a
	// protobuf_test_messages.proto3.TestAllTypes proto (as defined in
	// src/google/protobuf/proto3_test_messages.proto).
	//
	// Types that are valid to be assigned to Payload:
	//
	//	*ConformanceRequest_ProtobufPayload
	//	*ConformanceRequest_JsonPayload
	//	*ConformanceRequest_JspbPayload
	//	*ConformanceRequest_TextPayload
	Payload isConformanceRequest_Payload `protobuf_oneof:"payload"`
	// Which format should the testee serialize its message to?
	RequestedOutputFormat WireFormat `protobuf:"varint,3,opt,name=requested_output_format,json=requestedOutputFormat,proto3,enum=conformance.WireFormat" json:"requested_output_format,omitempty"`
	// The full name for the test message to use; for the moment, either:
	// protobuf_test_messages.proto3.TestAllTypesProto3 or
	// protobuf_test_messages.proto2.TestAllTypesProto2 or
	// protobuf_test_messages.editions.proto2.TestAllTypesProto2 or
	// protobuf_test_messages.editions.proto3.TestAllTypesProto3 or
	// protobuf_test_messages.editions.TestAllTypesEdition2023.
	MessageType string `protobuf:"bytes,4,opt,name=message_type,json=messageType,proto3" json:"message_type,omitempty"`
	// Each test is given a specific test category. Some category may need
	// specific support in testee programs. Refer to the definition of
	// TestCategory for more information.
	TestCategory TestCategory `protobuf:"varint,5,opt,name=test_category,json=testCategory,proto3,enum=conformance.TestCategory" json:"test_category,omitempty"`
	// Specify details for how to encode jspb.
	JspbEncodingOptions *JspbEncodingConfig `protobuf:"bytes,6,opt,name=jspb_encoding_options,json=jspbEncodingOptions,proto3" json:"jspb_encoding_options,omitempty"`
	// This can be used in json and text format. If true, testee should print
	// unknown fields instead of ignore. This feature is optional.
	PrintUnknownFields bool `protobuf:"varint,9,opt,name=print_unknown_fields,json=printUnknownFields,proto3" json:"print_unknown_fields,omitempty"`
	unknownFields      protoimpl.UnknownFields
	sizeCache          protoimpl.SizeCache
}

func (x *ConformanceRequest) Reset() {
	*x = ConformanceRequest{}
	mi := &file_conformance_conformance_proto_msgTypes[2]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ConformanceRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ConformanceRequest) ProtoMessage() {}

func (x *ConformanceRequest) ProtoReflect() protoreflect.Message {
	mi := &file_conformance_conformance_proto_msgTypes[2]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ConformanceRequest.ProtoReflect.Descriptor instead.
func (*ConformanceRequest) Descriptor() ([]byte, []int) {
	return file_conformance_conformance_proto_rawDescGZIP(), []int{2}
}

func (x *ConformanceRequest) GetPayload() isConformanceRequest_Payload {
	if x != nil {
		return x.Payload
	}
	return nil
}

func (x *ConformanceRequest) GetProtobufPayload() []byte {
	if x != nil {
		if x, ok := x.Payload.(*ConformanceRequest_ProtobufPayload); ok {
			return x.ProtobufPayload
		}
	}
	return nil
}

func (x *ConformanceRequest) GetJsonPayload() string {
	if x != nil {
		if x, ok := x.Payload.(*ConformanceRequest_JsonPayload); ok {
			return x.JsonPayload
		}
	}
	return ""
}

func (x *ConformanceRequest) GetJspbPayload() string {
	if x != nil {
		if x, ok := x.Payload.(*ConformanceRequest_JspbPayload); ok {
			return x.JspbPayload
		}
	}
	return ""
}

func (x *ConformanceRequest) GetTextPayload() string {
	if x != nil {
		if x, ok := x.Payload.(*ConformanceRequest_TextPayload); ok {
			return x.TextPayload
		}
	}
	return ""
}

func (x *ConformanceRequest) GetRequestedOutputFormat() WireFormat {
	if x != nil {
		return x.RequestedOutputFormat
	}
	return WireFormat_UNSPECIFIED
}

func (x *ConformanceRequest) GetMessageType() string {
	if x != nil {
		return x.MessageType
	}
	return ""
}

func (x *ConformanceRequest) GetTestCategory() TestCategory {
	if x != nil {
		return x.TestCategory
	}
	return TestCategory_UNSPECIFIED_TEST
}

func (x *ConformanceRequest) GetJspbEncodingOptions() *JspbEncodingConfig {
	if x != nil {
		return x.JspbEncodingOptions
	}
	return nil
}

func (x *ConformanceRequest) GetPrintUnknownFields() bool {
	if x != nil {
		return x.PrintUnknownFields
	}
	return false
}

type isConformanceRequest_Payload interface {
	isConformanceRequest_Payload()
}

type ConformanceRequest_ProtobufPayload struct {
	ProtobufPayload []byte `protobuf:"bytes,1,opt,name=protobuf_payload,json=protobufPayload,proto3,oneof"`
}

type ConformanceRequest_JsonPayload struct {
	JsonPayload string `protobuf:"bytes,2,opt,name=json_payload,json=jsonPayload,proto3,oneof"`
}

type ConformanceRequest_JspbPayload struct {
	// Only used inside Google.  Opensource testees just skip it.
	JspbPayload string `protobuf:"bytes,7,opt,name=jspb_payload,json=jspbPayload,proto3,oneof"`
}

type ConformanceRequest_TextPayload struct {
	TextPayload string `protobuf:"bytes,8,opt,name=text_payload,json=textPayload,proto3,oneof"`
}

func (*ConformanceRequest_ProtobufPayload) isConformanceRequest_Payload() {}

func (*ConformanceRequest_JsonPayload) isConformanceRequest_Payload() {}

func (*ConformanceRequest_JspbPayload) isConformanceRequest_Payload() {}

func (*ConformanceRequest_TextPayload) isConformanceRequest_Payload() {}

// Represents a single test case's output.
type ConformanceResponse struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// Types that are valid to be assigned to Result:
	//
	//	*ConformanceResponse_ParseError
	//	*ConformanceResponse_SerializeError
	//	*ConformanceResponse_TimeoutError
	//	*ConformanceResponse_RuntimeError
	//	*ConformanceResponse_ProtobufPayload
	//	*ConformanceResponse_JsonPayload
	//	*ConformanceResponse_Skipped
	//	*ConformanceResponse_JspbPayload
	//	*ConformanceResponse_TextPayload
	Result        isConformanceResponse_Result `protobuf_oneof:"result"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ConformanceResponse) Reset() {
	*x = ConformanceResponse{}
	mi := &file_conformance_conformance_proto_msgTypes[3]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ConformanceResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ConformanceResponse) ProtoMessage() {}

func (x *ConformanceResponse) ProtoReflect() protoreflect.Message {
	mi := &file_conformance_conformance_proto_msgTypes[3]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ConformanceResponse.ProtoReflect.Descriptor instead.
func (*ConformanceResponse) Descriptor() ([]byte, []int) {
	return file_conformance_conformance_proto_rawDescGZIP(), []int{3}
}

func (x *ConformanceResponse) GetResult() isConformanceResponse_Result {
	if x != nil {
		return x.Result
	}
	return nil
}

func (x *ConformanceResponse) GetParseError() string {
	if x != nil {
		if x, ok := x.Result.(*ConformanceResponse_ParseError); ok {
			return x.ParseError
		}
	}
	return ""
}

func (x *ConformanceResponse) GetSerializeError() string {
	if x != nil {
		if x, ok := x.Result.(*ConformanceResponse_SerializeError); ok {
			return x.SerializeError
		}
	}
	return ""
}

func (x *ConformanceResponse) GetTimeoutError() string {
	if x != nil {
		if x, ok := x.Result.(*ConformanceResponse_TimeoutError); ok {
			return x.TimeoutError
		}
	}
	return ""
}

func (x *ConformanceResponse) GetRuntimeError() string {
	if x != nil {
		if x, ok := x.Result.(*ConformanceResponse_RuntimeError); ok {
			return x.RuntimeError
		}
	}
	return ""
}

func (x *ConformanceResponse) GetProtobufPayload() []byte {
	if x != nil {
		if x, ok := x.Result.(*ConformanceResponse_ProtobufPayload); ok {
			return x.ProtobufPayload
		}
	}
	return nil
}

func (x *ConformanceResponse) GetJsonPayload() string {
	if x != nil {
		if x, ok := x.Result.(*ConformanceResponse_JsonPayload); ok {
			return x.JsonPayload
		}
	}
	return ""
}

func (x *ConformanceResponse) GetSkipped() string {
	if x != nil {
		if x, ok := x.Result.(*ConformanceResponse_Skipped); ok {
			return x.Skipped
		}
	}
	return ""
}

func (x *ConformanceResponse) GetJspbPayload() string {
	if x != nil {
		if x, ok := x.Result.(*ConformanceResponse_JspbPayload); ok {
			return x.JspbPayload
		}
	}
	return ""
}

func (x *ConformanceResponse) GetTextPayload() string {
	if x != nil {
		if x, ok := x.Result.(*ConformanceResponse_TextPayload); ok {
			return x.TextPayload
		}
	}
	return ""
}

type isConformanceResponse_Result interface {
	isConformanceResponse_Result()
}

type ConformanceResponse_ParseError struct {
	// This string should be set to indicate parsing failed.  The string can
	// provide more information about the parse error if it is available.
	//
	// Setting this string does not necessarily mean the testee failed the
	// test.  Some of the test cases are intentionally invalid input.
	ParseError string `protobuf:"bytes,1,opt,name=parse_error,json=parseError,proto3,oneof"`
}

type ConformanceResponse_SerializeError struct {
	// If the input was successfully parsed but errors occurred when
	// serializing it to the requested output format, set the error message in
	// this field.
	SerializeError string `protobuf:"bytes,6,opt,name=serialize_error,json=serializeError,proto3,oneof"`
}

type ConformanceResponse_TimeoutError struct {
	// This should be set if the test program timed out.  The string should
	// provide more information about what the child process was doing when it
	// was killed.
	TimeoutError string `protobuf:"bytes,9,opt,name=timeout_error,json=timeoutError,proto3,oneof"`
}

type ConformanceResponse_RuntimeError struct {
	// This should be set if some other error occurred.  This will always
	// indicate that the test failed.  The string can provide more information
	// about the failure.
	RuntimeError string `protobuf:"bytes,2,opt,name=runtime_error,json=runtimeError,proto3,oneof"`
}

type ConformanceResponse_ProtobufPayload struct {
	// If the input was successfully parsed and the requested output was
	// protobuf, serialize it to protobuf and set it in this field.
	ProtobufPayload []byte `protobuf:"bytes,3,opt,name=protobuf_payload,json=protobufPayload,proto3,oneof"`
}

type ConformanceResponse_JsonPayload struct {
	// If the input was successfully parsed and the requested output was JSON,
	// serialize to JSON and set it in this field.
	JsonPayload string `protobuf:"bytes,4,opt,name=json_payload,json=jsonPayload,proto3,oneof"`
}

type ConformanceResponse_Skipped struct {
	// For when the testee skipped the test, likely because a certain feature
	// wasn't supported, like JSON input/output.
	Skipped string `protobuf:"bytes,5,opt,name=skipped,proto3,oneof"`
}

type ConformanceResponse_JspbPayload struct {
	// If the input was successfully parsed and the requested output was JSPB,
	// serialize to JSPB and set it in this field. JSPB is only used inside
	// Google. Opensource testees can just skip it.
	JspbPayload string `protobuf:"bytes,7,opt,name=jspb_payload,json=jspbPayload,proto3,oneof"`
}

type ConformanceResponse_TextPayload struct {
	// If the input was successfully parsed and the requested output was
	// TEXT_FORMAT, serialize to TEXT_FORMAT and set it in this field.
	TextPayload string `protobuf:"bytes,8,opt,name=text_payload,json=textPayload,proto3,oneof"`
}

func (*ConformanceResponse_ParseError) isConformanceResponse_Result() {}

func (*ConformanceResponse_SerializeError) isConformanceResponse_Result() {}

func (*ConformanceResponse_TimeoutError) isConformanceResponse_Result() {}

func (*ConformanceResponse_RuntimeError) isConformanceResponse_Result() {}

func (*ConformanceResponse_ProtobufPayload) isConformanceResponse_Result() {}

func (*ConformanceResponse_JsonPayload) isConformanceResponse_Result() {}

func (*ConformanceResponse_Skipped) isConformanceResponse_Result() {}

func (*ConformanceResponse_JspbPayload) isConformanceResponse_Result() {}

func (*ConformanceResponse_TextPayload) isConformanceResponse_Result() {}

// Encoding options for jspb format.
type JspbEncodingConfig struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// Encode the value field of Any as jspb array if true, otherwise binary.
	UseJspbArrayAnyFormat bool `protobuf:"varint,1,opt,name=use_jspb_array_any_format,json=useJspbArrayAnyFormat,proto3" json:"use_jspb_array_any_format,omitempty"`
	unknownFields         protoimpl.UnknownFields
	sizeCache             protoimpl.SizeCache
}

func (x *JspbEncodingConfig) Reset() {
	*x = JspbEncodingConfig{}
	mi := &file_conformance_conformance_proto_msgTypes[4]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *JspbEncodingConfig) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*JspbEncodingConfig) ProtoMessage() {}

func (x *JspbEncodingConfig) ProtoReflect() protoreflect.Message {
	mi := &file_conformance_conformance_proto_msgTypes[4]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use JspbEncodingConfig.ProtoReflect.Descriptor instead.
func (*JspbEncodingConfig) Descriptor() ([]byte, []int) {
	return file_conformance_conformance_proto_rawDescGZIP(), []int{4}
}

func (x *JspbEncodingConfig) GetUseJspbArrayAnyFormat() bool {
	if x != nil {
		return x.UseJspbArrayAnyFormat
	}
	return false
}

var File_conformance_conformance_proto protoreflect.FileDescriptor

const file_conformance_conformance_proto_rawDesc = "" +
	"\n" +
	"\x1dconformance/conformance.proto\x12\vconformance\"l\n" +
	"\n" +
	"TestStatus\x12\x12\n" +
	"\x04name\x18\x01 \x01(\tR\x04name\x12'\n" +
	"\x0ffailure_message\x18\x02 \x01(\tR\x0efailureMessage\x12!\n" +
	"\fmatched_name\x18\x03 \x01(\tR\vmatchedName\"?\n" +
	"\n" +
	"FailureSet\x12+\n" +
	"\x04test\x18\x02 \x03(\v2\x17.conformance.TestStatusR\x04testJ\x04\b\x01\x10\x02\"\xf6\x03\n" +
	"\x12ConformanceRequest\x12+\n" +
	"\x10protobuf_payload\x18\x01 \x01(\fH\x00R\x0fprotobufPayload\x12#\n" +
	"\fjson_payload\x18\x02 \x01(\tH\x00R\vjsonPayload\x12#\n" +
	"\fjspb_payload\x18\a \x01(\tH\x00R\vjspbPayload\x12#\n" +
	"\ftext_payload\x18\b \x01(\tH\x00R\vtextPayload\x12O\n" +
	"\x17requested_output_format\x18\x03 \x01(\x0e2\x17.conformance.WireFormatR\x15requestedOutputFormat\x12!\n" +
	"\fmessage_type\x18\x04 \x01(\tR\vmessageType\x12>\n" +
	"\rtest_category\x18\x05 \x01(\x0e2\x19.conformance.TestCategoryR\ftestCategory\x12S\n" +
	"\x15jspb_encoding_options\x18\x06 \x01(\v2\x1f.conformance.JspbEncodingConfigR\x13jspbEncodingOptions\x120\n" +
	"\x14print_unknown_fields\x18\t \x01(\bR\x12printUnknownFieldsB\t\n" +
	"\apayload\"\xf3\x02\n" +
	"\x13ConformanceResponse\x12!\n" +
	"\vparse_error\x18\x01 \x01(\tH\x00R\n" +
	"parseError\x12)\n" +
	"\x0fserialize_error\x18\x06 \x01(\tH\x00R\x0eserializeError\x12%\n" +
	"\rtimeout_error\x18\t \x01(\tH\x00R\ftimeoutError\x12%\n" +
	"\rruntime_error\x18\x02 \x01(\tH\x00R\fruntimeError\x12+\n" +
	"\x10protobuf_payload\x18\x03 \x01(\fH\x00R\x0fprotobufPayload\x12#\n" +
	"\fjson_payload\x18\x04 \x01(\tH\x00R\vjsonPayload\x12\x1a\n" +
	"\askipped\x18\x05 \x01(\tH\x00R\askipped\x12#\n" +
	"\fjspb_payload\x18\a \x01(\tH\x00R\vjspbPayload\x12#\n" +
	"\ftext_payload\x18\b \x01(\tH\x00R\vtextPayloadB\b\n" +
	"\x06result\"N\n" +
	"\x12JspbEncodingConfig\x128\n" +
	"\x19use_jspb_array_any_format\x18\x01 \x01(\bR\x15useJspbArrayAnyFormat*P\n" +
	"\n" +
	"WireFormat\x12\x0f\n" +
	"\vUNSPECIFIED\x10\x00\x12\f\n" +
	"\bPROTOBUF\x10\x01\x12\b\n" +
	"\x04JSON\x10\x02\x12\b\n" +
	"\x04JSPB\x10\x03\x12\x0f\n" +
	"\vTEXT_FORMAT\x10\x04*\x8f\x01\n" +
	"\fTestCategory\x12\x14\n" +
	"\x10UNSPECIFIED_TEST\x10\x00\x12\x0f\n" +
	"\vBINARY_TEST\x10\x01\x12\r\n" +
	"\tJSON_TEST\x10\x02\x12$\n" +
	" JSON_IGNORE_UNKNOWN_PARSING_TEST\x10\x03\x12\r\n" +
	"\tJSPB_TEST\x10\x04\x12\x14\n" +
	"\x10TEXT_FORMAT_TEST\x10\x05B/\n" +
	"\x1fcom.google.protobuf.conformance\xa2\x02\vConformanceb\x06proto3"

var (
	file_conformance_conformance_proto_rawDescOnce sync.Once
	file_conformance_conformance_proto_rawDescData []byte
)

func file_conformance_conformance_proto_rawDescGZIP() []byte {
	file_conformance_conformance_proto_rawDescOnce.Do(func() {
		file_conformance_conformance_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_conformance_conformance_proto_rawDesc), len(file_conformance_conformance_proto_rawDesc)))
	})
	return file_conformance_conformance_proto_rawDescData
}

var file_conformance_conformance_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_conformance_conformance_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
var file_conformance_conformance_proto_goTypes = []any{
	(WireFormat)(0),             // 0: conformance.WireFormat
	(TestCategory)(0),           // 1: conformance.TestCategory
	(*TestStatus)(nil),          // 2: conformance.TestStatus
	(*FailureSet)(nil),          // 3: conformance.FailureSet
	(*ConformanceRequest)(nil),  // 4: conformance.ConformanceRequest
	(*ConformanceResponse)(nil), // 5: conformance.ConformanceResponse
	(*JspbEncodingConfig)(nil),  // 6: conformance.JspbEncodingConfig
}
var file_conformance_conformance_proto_depIdxs = []int32{
	2, // 0: conformance.FailureSet.test:type_name -> conformance.TestStatus
	0, // 1: conformance.ConformanceRequest.requested_output_format:type_name -> conformance.WireFormat
	1, // 2: conformance.ConformanceRequest.test_category:type_name -> conformance.TestCategory
	6, // 3: conformance.ConformanceRequest.jspb_encoding_options:type_name -> conformance.JspbEncodingConfig
	4, // [4:4] is the sub-list for method output_type
	4, // [4:4] is the sub-list for method input_type
	4, // [4:4] is the sub-list for extension type_name
	4, // [4:4] is the sub-list for extension extendee
	0, // [0:4] is the sub-list for field type_name
}

func init() { file_conformance_conformance_proto_init() }
func file_conformance_conformance_proto_init() {
	if File_conformance_conformance_proto != nil {
		return
	}
	file_conformance_conformance_proto_msgTypes[2].OneofWrappers = []any{
		(*ConformanceRequest_ProtobufPayload)(nil),
		(*ConformanceRequest_JsonPayload)(nil),
		(*ConformanceRequest_JspbPayload)(nil),
		(*ConformanceRequest_TextPayload)(nil),
	}
	file_conformance_conformance_proto_msgTypes[3].OneofWrappers = []any{
		(*ConformanceResponse_ParseError)(nil),
		(*ConformanceResponse_SerializeError)(nil),
		(*ConformanceResponse_TimeoutError)(nil),
		(*ConformanceResponse_RuntimeError)(nil),
		(*ConformanceResponse_ProtobufPayload)(nil),
		(*ConformanceResponse_JsonPayload)(nil),
		(*ConformanceResponse_Skipped)(nil),
		(*ConformanceResponse_JspbPayload)(nil),
		(*ConformanceResponse_TextPayload)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: unsafe.Slice(unsafe.StringData(file_conformance_conformance_proto_rawDesc), len(file_conformance_conformance_proto_rawDesc)),
			NumEnums:      2,
			NumMessages:   5,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_conformance_conformance_proto_goTypes,
		DependencyIndexes: file_conformance_conformance_proto_depIdxs,
		EnumInfos:         file_conformance_conformance_proto_enumTypes,
		MessageInfos:      file_conformance_conformance_proto_msgTypes,
	}.Build()
	File_conformance_conformance_proto = out.File
	file_conformance_conformance_proto_goTypes = nil
	file_conformance_conformance_proto_depIdxs = nil
}
