// 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"
	pref "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    pref.ExtensionType
		value interface{}
	}{
		{
			xt:    testpb.E_OptionalInt32Extension,
			value: int32(0),
		},
		{
			xt:    testpb.E_OptionalInt64Extension,
			value: int64(0),
		},
		{
			xt:    testpb.E_OptionalUint32Extension,
			value: uint32(0),
		},
		{
			xt:    testpb.E_OptionalUint64Extension,
			value: uint64(0),
		},
		{
			xt:    testpb.E_OptionalFloatExtension,
			value: float32(0),
		},
		{
			xt:    testpb.E_OptionalDoubleExtension,
			value: float64(0),
		},
		{
			xt:    testpb.E_OptionalBoolExtension,
			value: true,
		},
		{
			xt:    testpb.E_OptionalStringExtension,
			value: "",
		},
		{
			xt:    testpb.E_OptionalBytesExtension,
			value: []byte{},
		},
		{
			xt:    testpb.E_OptionalNestedMessageExtension,
			value: &testpb.TestAllExtensions_NestedMessage{},
		},
		{
			xt:    testpb.E_OptionalNestedEnumExtension,
			value: testpb.TestAllTypes_FOO,
		},
		{
			xt:    testpb.E_RepeatedInt32Extension,
			value: []int32{0},
		},
		{
			xt:    testpb.E_RepeatedInt64Extension,
			value: []int64{0},
		},
		{
			xt:    testpb.E_RepeatedUint32Extension,
			value: []uint32{0},
		},
		{
			xt:    testpb.E_RepeatedUint64Extension,
			value: []uint64{0},
		},
		{
			xt:    testpb.E_RepeatedFloatExtension,
			value: []float32{0},
		},
		{
			xt:    testpb.E_RepeatedDoubleExtension,
			value: []float64{0},
		},
		{
			xt:    testpb.E_RepeatedBoolExtension,
			value: []bool{true},
		},
		{
			xt:    testpb.E_RepeatedStringExtension,
			value: []string{""},
		},
		{
			xt:    testpb.E_RepeatedBytesExtension,
			value: [][]byte{nil},
		},
		{
			xt:    testpb.E_RepeatedNestedMessageExtension,
			value: []*testpb.TestAllExtensions_NestedMessage{{}},
		},
		{
			xt:    testpb.E_RepeatedNestedEnumExtension,
			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)
			}
		})
	}
}
