// Copyright 2020 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 genid_test

import (
	"testing"

	"google.golang.org/protobuf/internal/genid"
	"google.golang.org/protobuf/reflect/protoreflect"

	"google.golang.org/protobuf/types/descriptorpb"
	"google.golang.org/protobuf/types/known/anypb"
	"google.golang.org/protobuf/types/known/apipb"
	"google.golang.org/protobuf/types/known/durationpb"
	"google.golang.org/protobuf/types/known/emptypb"
	"google.golang.org/protobuf/types/known/fieldmaskpb"
	"google.golang.org/protobuf/types/known/sourcecontextpb"
	"google.golang.org/protobuf/types/known/structpb"
	"google.golang.org/protobuf/types/known/timestamppb"
	"google.golang.org/protobuf/types/known/typepb"
	"google.golang.org/protobuf/types/known/wrapperspb"
	"google.golang.org/protobuf/types/pluginpb"
)

func TestWhich(t *testing.T) {
	tests := []struct {
		in   protoreflect.FileDescriptor
		want genid.ProtoFile
	}{
		{descriptorpb.File_google_protobuf_descriptor_proto, genid.Unknown_file},
		{pluginpb.File_google_protobuf_compiler_plugin_proto, genid.Unknown_file},
		{anypb.File_google_protobuf_any_proto, genid.Any_file},
		{timestamppb.File_google_protobuf_timestamp_proto, genid.Timestamp_file},
		{durationpb.File_google_protobuf_duration_proto, genid.Duration_file},
		{wrapperspb.File_google_protobuf_wrappers_proto, genid.Wrappers_file},
		{structpb.File_google_protobuf_struct_proto, genid.Struct_file},
		{fieldmaskpb.File_google_protobuf_field_mask_proto, genid.FieldMask_file},
		{apipb.File_google_protobuf_api_proto, genid.Api_file},
		{typepb.File_google_protobuf_type_proto, genid.Type_file},
		{sourcecontextpb.File_google_protobuf_source_context_proto, genid.SourceContext_file},
		{emptypb.File_google_protobuf_empty_proto, genid.Empty_file},
	}

	for _, tt := range tests {
		rangeDescriptors(tt.in, func(d protoreflect.Descriptor) {
			got := genid.WhichFile(d.FullName())
			if got != tt.want {
				t.Errorf("Which(%s) = %v, want %v", d.FullName(), got, tt.want)
			}
		})
	}
}

func rangeDescriptors(d interface {
	Enums() protoreflect.EnumDescriptors
	Messages() protoreflect.MessageDescriptors
}, f func(protoreflect.Descriptor)) {
	for i := 0; i < d.Enums().Len(); i++ {
		ed := d.Enums().Get(i)
		f(ed)
	}
	for i := 0; i < d.Messages().Len(); i++ {
		md := d.Messages().Get(i)
		if md.IsMapEntry() {
			continue
		}
		f(md)
		rangeDescriptors(md, f)
	}
}
