protobuf-go/internal/descfmt/desc_test.go
Joe Tsai 387873dd53 all: implement support for proto3 optional semantics
In the upcoming 3.12.x release of protoc, the proto3 language will be
amended to support true presence for scalars. This CL adds support
to both the generator and runtime to support these semantics.

Newly added public API:
	protogen.Plugin.SupportedFeatures
	protoreflect.FieldDescriptor.HasPresence
	protoreflect.FieldDescriptor.HasOptionalKeyword
	protoreflect.OneofDescriptor.IsSynthetic

Change-Id: I7c86bf66d0ae56642109beb5f2132184593747ad
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/230698
Reviewed-by: Damien Neil <dneil@google.com>
2020-04-29 20:02:24 +00:00

63 lines
1.8 KiB
Go

// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package descfmt
import (
"testing"
)
// TestDescriptorAccessors tests that descriptorAccessors is up-to-date.
func TestDescriptorAccessors(t *testing.T) {
ignore := map[string]bool{
"ParentFile": true,
"Parent": true,
"Index": true,
"Syntax": true,
"Name": true,
"FullName": true,
"IsPlaceholder": true,
"Options": true,
"ProtoInternal": true,
"ProtoType": true,
"HasOptionalKeyword": true, // captured by HasPresence
"IsSynthetic": true, // captured by HasPresence
"SourceLocations": true, // specific to FileDescriptor
"ExtensionRangeOptions": true, // specific to MessageDescriptor
"DefaultEnumValue": true, // specific to FieldDescriptor
"MapKey": true, // specific to FieldDescriptor
"MapValue": true, // specific to FieldDescriptor
}
for rt, m := range descriptorAccessors {
got := map[string]bool{}
for _, s := range m {
got[s] = true
}
want := map[string]bool{}
for i := 0; i < rt.NumMethod(); i++ {
want[rt.Method(i).Name] = true
}
// Check if descriptorAccessors contains a non-existent accessor.
// If this test fails, remove the accessor from descriptorAccessors.
for s := range got {
if !want[s] && !ignore[s] {
t.Errorf("%v.%v does not exist", rt, s)
}
}
// Check if there are new protoreflect interface methods that are not
// handled by the formatter. If this fails, either add the method to
// ignore or add them to descriptorAccessors.
for s := range want {
if !got[s] && !ignore[s] {
t.Errorf("%v.%v is not called by formatter", rt, s)
}
}
}
}