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

import (
	"reflect"
	"testing"

	ptype "github.com/golang/protobuf/v2/internal/prototype"
	pref "github.com/golang/protobuf/v2/reflect/protoreflect"
	"github.com/google/go-cmp/cmp"
	"github.com/google/go-cmp/cmp/cmpopts"
)

func Test(t *testing.T) {
	m := &ptype.StandaloneMessage{
		Syntax:   pref.Proto3,
		FullName: "golang.org.example.FooMessage",
		Fields: []ptype.Field{{
			Name:        "foo_field",
			Number:      1337,
			Cardinality: pref.Repeated,
			Kind:        pref.BytesKind,
			JSONName:    "fooField",
			Default:     pref.ValueOf([]byte("hello, \xde\xad\xbe\xef\n")),
		}},
	}
	md, err := ptype.NewMessage(m)
	if err != nil {
		t.Fatalf("unexpected NewMessage error: %v", err)
	}

	// Marshal test.
	gotTag := Marshal(md.Fields().Get(0), "")
	wantTag := `bytes,1337,rep,name=foo_field,json=fooField,proto3,def=hello, \336\255\276\357\n`
	if gotTag != wantTag {
		t.Errorf("Marshal() = `%v`, want `%v`", gotTag, wantTag)
	}

	// Unmarshal test.
	gotField := Unmarshal(wantTag, reflect.TypeOf([]byte{}))
	wantField := m.Fields[0]
	opts := cmp.Options{
		cmp.Transformer("UnwrapValue", func(x pref.Value) interface{} {
			return x.Interface()
		}),
		cmpopts.IgnoreUnexported(ptype.Field{}),
		cmpopts.IgnoreFields(ptype.Field{}, "Options"),
	}
	if diff := cmp.Diff(wantField, gotField, opts); diff != "" {
		t.Errorf("Unmarshal() mismatch (-want +got):\n%v", diff)
	}
}
