// Copyright 2019 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 impl_test

import (
	"fmt"
	"testing"

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

	"google.golang.org/protobuf/proto"
	"google.golang.org/protobuf/reflect/protoreflect"

	testpb "google.golang.org/protobuf/internal/testprotos/test"
)

func TestExtensionType(t *testing.T) {
	cmpOpts := cmp.Options{
		cmp.Comparer(func(x, y proto.Message) bool {
			return proto.Equal(x, y)
		}),
	}
	for _, test := range []struct {
		xt    protoreflect.ExtensionType
		value any
	}{
		{
			xt:    testpb.E_OptionalInt32,
			value: int32(0),
		},
		{
			xt:    testpb.E_OptionalInt64,
			value: int64(0),
		},
		{
			xt:    testpb.E_OptionalUint32,
			value: uint32(0),
		},
		{
			xt:    testpb.E_OptionalUint64,
			value: uint64(0),
		},
		{
			xt:    testpb.E_OptionalFloat,
			value: float32(0),
		},
		{
			xt:    testpb.E_OptionalDouble,
			value: float64(0),
		},
		{
			xt:    testpb.E_OptionalBool,
			value: true,
		},
		{
			xt:    testpb.E_OptionalString,
			value: "",
		},
		{
			xt:    testpb.E_OptionalBytes,
			value: []byte{},
		},
		{
			xt:    testpb.E_OptionalNestedMessage,
			value: &testpb.TestAllExtensions_NestedMessage{},
		},
		{
			xt:    testpb.E_OptionalNestedEnum,
			value: testpb.TestAllTypes_FOO,
		},
		{
			xt:    testpb.E_RepeatedInt32,
			value: []int32{0},
		},
		{
			xt:    testpb.E_RepeatedInt64,
			value: []int64{0},
		},
		{
			xt:    testpb.E_RepeatedUint32,
			value: []uint32{0},
		},
		{
			xt:    testpb.E_RepeatedUint64,
			value: []uint64{0},
		},
		{
			xt:    testpb.E_RepeatedFloat,
			value: []float32{0},
		},
		{
			xt:    testpb.E_RepeatedDouble,
			value: []float64{0},
		},
		{
			xt:    testpb.E_RepeatedBool,
			value: []bool{true},
		},
		{
			xt:    testpb.E_RepeatedString,
			value: []string{""},
		},
		{
			xt:    testpb.E_RepeatedBytes,
			value: [][]byte{nil},
		},
		{
			xt:    testpb.E_RepeatedNestedMessage,
			value: []*testpb.TestAllExtensions_NestedMessage{{}},
		},
		{
			xt:    testpb.E_RepeatedNestedEnum,
			value: []testpb.TestAllTypes_NestedEnum{testpb.TestAllTypes_FOO},
		},
	} {
		name := test.xt.TypeDescriptor().FullName()
		t.Run(fmt.Sprint(name), func(t *testing.T) {
			if !test.xt.IsValidInterface(test.value) {
				t.Fatalf("IsValidInterface(%[1]T(%[1]v)) = false, want true", test.value)
			}
			v := test.xt.ValueOf(test.value)
			if !test.xt.IsValidValue(v) {
				t.Fatalf("IsValidValue(%[1]T(%[1]v)) = false, want true", v)
			}
			if got, want := test.xt.InterfaceOf(v), test.value; !cmp.Equal(got, want, cmpOpts) {
				t.Fatalf("round trip InterfaceOf(ValueOf(x)) = %v, want %v", got, want)
			}
		})
	}
}
