// 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 main

import (
	"fmt"
	"strings"
	"testing"

	"github.com/google/go-cmp/cmp"
	"github.com/google/go-cmp/cmp/cmpopts"

	pref "github.com/golang/protobuf/v2/reflect/protoreflect"
	ptype "github.com/golang/protobuf/v2/reflect/prototype"
)

func TestFields(t *testing.T) {
	type fieldsKind struct {
		kind   pref.Kind
		fields string
	}
	tests := []struct {
		inFields []fieldsKind
		wantMsg  ptype.Message
		wantErr  string
	}{{
		inFields: []fieldsKind{{pref.MessageKind, ""}},
		wantMsg:  ptype.Message{Name: "M"},
	}, {
		inFields: []fieldsKind{{pref.MessageKind, "987654321"}},
		wantErr:  "invalid field: 987654321",
	}, {
		inFields: []fieldsKind{{pref.MessageKind, "-1"}},
		wantErr:  "invalid field: -1",
	}, {
		inFields: []fieldsKind{{pref.MessageKind, "k"}},
		wantErr:  "invalid field: k",
	}, {
		inFields: []fieldsKind{{pref.MessageKind, "1.2"}, {pref.Int32Kind, "1"}},
		wantErr:  "field 1 of int32 type cannot have sub-fields",
	}, {
		inFields: []fieldsKind{{pref.Int32Kind, "1"}, {pref.MessageKind, "1.2"}},
		wantErr:  "field 1 of int32 type cannot have sub-fields",
	}, {
		inFields: []fieldsKind{{pref.Int32Kind, "30"}, {pref.Int32Kind, "30"}},
		wantErr:  "field 30 already set as int32 type",
	}, {
		inFields: []fieldsKind{
			{pref.Int32Kind, "10.20.31"},
			{pref.MessageKind, "  10.20.30, 10.21   "},
			{pref.GroupKind, "10"},
		},
		wantMsg: ptype.Message{
			Name: "M",
			Fields: []ptype.Field{
				{Name: "f10", Number: 10, Cardinality: pref.Optional, Kind: pref.GroupKind, MessageType: ptype.PlaceholderMessage("M.M10")},
			},
			Messages: []ptype.Message{{
				Name: "M10",
				Fields: []ptype.Field{
					{Name: "f20", Number: 20, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: ptype.PlaceholderMessage("M.M10.M20")},
					{Name: "f21", Number: 21, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: ptype.PlaceholderMessage("M.M10.M21")},
				},
				Messages: []ptype.Message{{
					Name: "M20",
					Fields: []ptype.Field{
						{Name: "f30", Number: 30, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: ptype.PlaceholderMessage("M.M10.M20.M30")},
						{Name: "f31", Number: 31, Cardinality: pref.Repeated, Kind: pref.Int32Kind},
					},
					Messages: []ptype.Message{{
						Name: "M30",
					}},
				}, {
					Name: "M21",
				}},
			}},
		},
	}}

	opts := cmp.Options{
		cmp.Comparer(func(x, y pref.Descriptor) bool {
			if x == nil || y == nil {
				return x == nil && y == nil
			}
			return x.FullName() == y.FullName()
		}),
		cmpopts.IgnoreFields(ptype.Field{}, "Default"),
		cmpopts.IgnoreFields(ptype.Field{}, "Options"),
		cmpopts.IgnoreUnexported(ptype.Message{}, ptype.Field{}),
	}
	for _, tt := range tests {
		t.Run("", func(t *testing.T) {
			var fields fields
			for i, tc := range tt.inFields {
				gotErr := fields.Set(tc.fields, tc.kind)
				if gotErr != nil {
					if tt.wantErr == "" || !strings.Contains(fmt.Sprint(gotErr), tt.wantErr) {
						t.Fatalf("fields %d, Set(%q, %v) = %v, want %v", i, tc.fields, tc.kind, gotErr, tt.wantErr)
					}
					return
				}
			}
			if tt.wantErr != "" {
				t.Errorf("all Set calls succeeded, want %v error", tt.wantErr)
			}
			gotMsg := fields.messageDescriptor("M")
			if diff := cmp.Diff(tt.wantMsg, gotMsg, opts); diff != "" {
				t.Errorf("messageDescriptor() mismatch (-want +got):\n%v", diff)
			}
			if _, err := fields.Descriptor(); err != nil {
				t.Errorf("Descriptor() = %v, want nil error", err)
			}
		})
	}
}
