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

import (
	"testing"

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

	"google.golang.org/protobuf/internal/detrand"
	"google.golang.org/protobuf/internal/encoding/pack"
	"google.golang.org/protobuf/proto"
	"google.golang.org/protobuf/reflect/protoreflect"

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

func init() {
	detrand.Disable()
}

func TestTransform(t *testing.T) {
	t.Skip()
	tests := []struct {
		in         proto.Message
		want       Message
		wantString string
	}{{
		in: &testpb.TestAllTypes{
			OptionalBool:          proto.Bool(false),
			OptionalInt32:         proto.Int32(-32),
			OptionalInt64:         proto.Int64(-64),
			OptionalUint32:        proto.Uint32(32),
			OptionalUint64:        proto.Uint64(64),
			OptionalFloat:         proto.Float32(32.32),
			OptionalDouble:        proto.Float64(64.64),
			OptionalString:        proto.String("string"),
			OptionalBytes:         []byte("bytes"),
			OptionalNestedEnum:    testpb.TestAllTypes_NEG.Enum(),
			OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{A: proto.Int32(5)},
		},
		want: Message{
			messageTypeKey:            messageTypeOf(&testpb.TestAllTypes{}),
			"optional_bool":           bool(false),
			"optional_int32":          int32(-32),
			"optional_int64":          int64(-64),
			"optional_uint32":         uint32(32),
			"optional_uint64":         uint64(64),
			"optional_float":          float32(32.32),
			"optional_double":         float64(64.64),
			"optional_string":         string("string"),
			"optional_bytes":          []byte("bytes"),
			"optional_nested_enum":    enumOf(testpb.TestAllTypes_NEG),
			"optional_nested_message": Message{messageTypeKey: messageTypeOf(&testpb.TestAllTypes_NestedMessage{}), "a": int32(5)},
		},
		wantString: `{optional_int32:-32, optional_int64:-64, optional_uint32:32, optional_uint64:64, optional_float:32.32, optional_double:64.64, optional_bool:false, optional_string:"string", optional_bytes:"bytes", optional_nested_message:{a:5}, optional_nested_enum:NEG}`,
	}, {
		in: &testpb.TestAllTypes{
			RepeatedBool:   []bool{false, true},
			RepeatedInt32:  []int32{32, -32},
			RepeatedInt64:  []int64{64, -64},
			RepeatedUint32: []uint32{0, 32},
			RepeatedUint64: []uint64{0, 64},
			RepeatedFloat:  []float32{0, 32.32},
			RepeatedDouble: []float64{0, 64.64},
			RepeatedString: []string{"s1", "s2"},
			RepeatedBytes:  [][]byte{{1}, {2}},
			RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{
				testpb.TestAllTypes_FOO,
				testpb.TestAllTypes_BAR,
			},
			RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{
				{A: proto.Int32(5)},
				{A: proto.Int32(-5)},
			},
		},
		want: Message{
			messageTypeKey:    messageTypeOf(&testpb.TestAllTypes{}),
			"repeated_bool":   []bool{false, true},
			"repeated_int32":  []int32{32, -32},
			"repeated_int64":  []int64{64, -64},
			"repeated_uint32": []uint32{0, 32},
			"repeated_uint64": []uint64{0, 64},
			"repeated_float":  []float32{0, 32.32},
			"repeated_double": []float64{0, 64.64},
			"repeated_string": []string{"s1", "s2"},
			"repeated_bytes":  [][]byte{{1}, {2}},
			"repeated_nested_enum": []Enum{
				enumOf(testpb.TestAllTypes_FOO),
				enumOf(testpb.TestAllTypes_BAR),
			},
			"repeated_nested_message": []Message{
				{messageTypeKey: messageTypeOf(&testpb.TestAllTypes_NestedMessage{}), "a": int32(5)},
				{messageTypeKey: messageTypeOf(&testpb.TestAllTypes_NestedMessage{}), "a": int32(-5)},
			},
		},
		wantString: `{repeated_int32:[32, -32], repeated_int64:[64, -64], repeated_uint32:[0, 32], repeated_uint64:[0, 64], repeated_float:[0, 32.32], repeated_double:[0, 64.64], repeated_bool:[false, true], repeated_string:["s1", "s2"], repeated_bytes:["\x01", "\x02"], repeated_nested_message:[{a:5}, {a:-5}], repeated_nested_enum:[FOO, BAR]}`,
	}, {
		in: &testpb.TestAllTypes{
			MapBoolBool:     map[bool]bool{true: false},
			MapInt32Int32:   map[int32]int32{-32: 32},
			MapInt64Int64:   map[int64]int64{-64: 64},
			MapUint32Uint32: map[uint32]uint32{0: 32},
			MapUint64Uint64: map[uint64]uint64{0: 64},
			MapInt32Float:   map[int32]float32{32: 32.32},
			MapInt32Double:  map[int32]float64{64: 64.64},
			MapStringString: map[string]string{"k": "v"},
			MapStringBytes:  map[string][]byte{"k": []byte("v")},
			MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{
				"k": testpb.TestAllTypes_FOO,
			},
			MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{
				"k": {A: proto.Int32(5)},
			},
		},
		want: Message{
			messageTypeKey:      messageTypeOf(&testpb.TestAllTypes{}),
			"map_bool_bool":     map[bool]bool{true: false},
			"map_int32_int32":   map[int32]int32{-32: 32},
			"map_int64_int64":   map[int64]int64{-64: 64},
			"map_uint32_uint32": map[uint32]uint32{0: 32},
			"map_uint64_uint64": map[uint64]uint64{0: 64},
			"map_int32_float":   map[int32]float32{32: 32.32},
			"map_int32_double":  map[int32]float64{64: 64.64},
			"map_string_string": map[string]string{"k": "v"},
			"map_string_bytes":  map[string][]byte{"k": []byte("v")},
			"map_string_nested_enum": map[string]Enum{
				"k": enumOf(testpb.TestAllTypes_FOO),
			},
			"map_string_nested_message": map[string]Message{
				"k": {messageTypeKey: messageTypeOf(&testpb.TestAllTypes_NestedMessage{}), "a": int32(5)},
			},
		},
		wantString: `{map_int32_int32:{-32:32}, map_int64_int64:{-64:64}, map_uint32_uint32:{0:32}, map_uint64_uint64:{0:64}, map_int32_float:{32:32.32}, map_int32_double:{64:64.64}, map_bool_bool:{true:false}, map_string_string:{"k":"v"}, map_string_bytes:{"k":"v"}, map_string_nested_message:{"k":{a:5}}, map_string_nested_enum:{"k":FOO}}`,
	}, {
		in: func() proto.Message {
			m := &testpb.TestAllExtensions{}
			proto.SetExtension(m, testpb.E_OptionalBoolExtension, bool(false))
			proto.SetExtension(m, testpb.E_OptionalInt32Extension, int32(-32))
			proto.SetExtension(m, testpb.E_OptionalInt64Extension, int64(-64))
			proto.SetExtension(m, testpb.E_OptionalUint32Extension, uint32(32))
			proto.SetExtension(m, testpb.E_OptionalUint64Extension, uint64(64))
			proto.SetExtension(m, testpb.E_OptionalFloatExtension, float32(32.32))
			proto.SetExtension(m, testpb.E_OptionalDoubleExtension, float64(64.64))
			proto.SetExtension(m, testpb.E_OptionalStringExtension, string("string"))
			proto.SetExtension(m, testpb.E_OptionalBytesExtension, []byte("bytes"))
			proto.SetExtension(m, testpb.E_OptionalNestedEnumExtension, testpb.TestAllTypes_NEG)
			proto.SetExtension(m, testpb.E_OptionalNestedMessageExtension, &testpb.TestAllTypes_NestedMessage{A: proto.Int32(5)})
			return m
		}(),
		want: Message{
			messageTypeKey: messageTypeOf(&testpb.TestAllExtensions{}),
			"[goproto.proto.test.optional_bool_extension]":           bool(false),
			"[goproto.proto.test.optional_int32_extension]":          int32(-32),
			"[goproto.proto.test.optional_int64_extension]":          int64(-64),
			"[goproto.proto.test.optional_uint32_extension]":         uint32(32),
			"[goproto.proto.test.optional_uint64_extension]":         uint64(64),
			"[goproto.proto.test.optional_float_extension]":          float32(32.32),
			"[goproto.proto.test.optional_double_extension]":         float64(64.64),
			"[goproto.proto.test.optional_string_extension]":         string("string"),
			"[goproto.proto.test.optional_bytes_extension]":          []byte("bytes"),
			"[goproto.proto.test.optional_nested_enum_extension]":    enumOf(testpb.TestAllTypes_NEG),
			"[goproto.proto.test.optional_nested_message_extension]": Message{messageTypeKey: messageTypeOf(&testpb.TestAllTypes_NestedMessage{}), "a": int32(5)},
		},
		wantString: `{[goproto.proto.test.optional_bool_extension]:false, [goproto.proto.test.optional_bytes_extension]:"bytes", [goproto.proto.test.optional_double_extension]:64.64, [goproto.proto.test.optional_float_extension]:32.32, [goproto.proto.test.optional_int32_extension]:-32, [goproto.proto.test.optional_int64_extension]:-64, [goproto.proto.test.optional_nested_enum_extension]:NEG, [goproto.proto.test.optional_nested_message_extension]:{a:5}, [goproto.proto.test.optional_string_extension]:"string", [goproto.proto.test.optional_uint32_extension]:32, [goproto.proto.test.optional_uint64_extension]:64}`,
	}, {
		in: func() proto.Message {
			m := &testpb.TestAllExtensions{}
			proto.SetExtension(m, testpb.E_RepeatedBoolExtension, []bool{false, true})
			proto.SetExtension(m, testpb.E_RepeatedInt32Extension, []int32{32, -32})
			proto.SetExtension(m, testpb.E_RepeatedInt64Extension, []int64{64, -64})
			proto.SetExtension(m, testpb.E_RepeatedUint32Extension, []uint32{0, 32})
			proto.SetExtension(m, testpb.E_RepeatedUint64Extension, []uint64{0, 64})
			proto.SetExtension(m, testpb.E_RepeatedFloatExtension, []float32{0, 32.32})
			proto.SetExtension(m, testpb.E_RepeatedDoubleExtension, []float64{0, 64.64})
			proto.SetExtension(m, testpb.E_RepeatedStringExtension, []string{"s1", "s2"})
			proto.SetExtension(m, testpb.E_RepeatedBytesExtension, [][]byte{{1}, {2}})
			proto.SetExtension(m, testpb.E_RepeatedNestedEnumExtension, []testpb.TestAllTypes_NestedEnum{
				testpb.TestAllTypes_FOO,
				testpb.TestAllTypes_BAR,
			})
			proto.SetExtension(m, testpb.E_RepeatedNestedMessageExtension, []*testpb.TestAllTypes_NestedMessage{
				{A: proto.Int32(5)},
				{A: proto.Int32(-5)},
			})
			return m
		}(),
		want: Message{
			messageTypeKey: messageTypeOf(&testpb.TestAllExtensions{}),
			"[goproto.proto.test.repeated_bool_extension]":   []bool{false, true},
			"[goproto.proto.test.repeated_int32_extension]":  []int32{32, -32},
			"[goproto.proto.test.repeated_int64_extension]":  []int64{64, -64},
			"[goproto.proto.test.repeated_uint32_extension]": []uint32{0, 32},
			"[goproto.proto.test.repeated_uint64_extension]": []uint64{0, 64},
			"[goproto.proto.test.repeated_float_extension]":  []float32{0, 32.32},
			"[goproto.proto.test.repeated_double_extension]": []float64{0, 64.64},
			"[goproto.proto.test.repeated_string_extension]": []string{"s1", "s2"},
			"[goproto.proto.test.repeated_bytes_extension]":  [][]byte{{1}, {2}},
			"[goproto.proto.test.repeated_nested_enum_extension]": []Enum{
				enumOf(testpb.TestAllTypes_FOO),
				enumOf(testpb.TestAllTypes_BAR),
			},
			"[goproto.proto.test.repeated_nested_message_extension]": []Message{
				{messageTypeKey: messageTypeOf(&testpb.TestAllTypes_NestedMessage{}), "a": int32(5)},
				{messageTypeKey: messageTypeOf(&testpb.TestAllTypes_NestedMessage{}), "a": int32(-5)},
			},
		},
		wantString: `{[goproto.proto.test.repeated_bool_extension]:[false, true], [goproto.proto.test.repeated_bytes_extension]:["\x01", "\x02"], [goproto.proto.test.repeated_double_extension]:[0, 64.64], [goproto.proto.test.repeated_float_extension]:[0, 32.32], [goproto.proto.test.repeated_int32_extension]:[32, -32], [goproto.proto.test.repeated_int64_extension]:[64, -64], [goproto.proto.test.repeated_nested_enum_extension]:[FOO, BAR], [goproto.proto.test.repeated_nested_message_extension]:[{a:5}, {a:-5}], [goproto.proto.test.repeated_string_extension]:["s1", "s2"], [goproto.proto.test.repeated_uint32_extension]:[0, 32], [goproto.proto.test.repeated_uint64_extension]:[0, 64]}`,
	}, {
		in: func() proto.Message {
			m := &testpb.TestAllTypes{}
			m.ProtoReflect().SetUnknown(pack.Message{
				pack.Tag{Number: 50000, Type: pack.VarintType}, pack.Uvarint(100),
				pack.Tag{Number: 50001, Type: pack.Fixed32Type}, pack.Uint32(200),
				pack.Tag{Number: 50002, Type: pack.Fixed64Type}, pack.Uint64(300),
				pack.Tag{Number: 50003, Type: pack.BytesType}, pack.String("hello"),
				pack.Message{
					pack.Tag{Number: 50004, Type: pack.StartGroupType},
					pack.Tag{Number: 1, Type: pack.VarintType}, pack.Uvarint(100),
					pack.Tag{Number: 1, Type: pack.Fixed32Type}, pack.Uint32(200),
					pack.Tag{Number: 1, Type: pack.Fixed64Type}, pack.Uint64(300),
					pack.Tag{Number: 1, Type: pack.BytesType}, pack.String("hello"),
					pack.Message{
						pack.Tag{Number: 1, Type: pack.StartGroupType},
						pack.Tag{Number: 1, Type: pack.VarintType}, pack.Uvarint(100),
						pack.Tag{Number: 1, Type: pack.Fixed32Type}, pack.Uint32(200),
						pack.Tag{Number: 1, Type: pack.Fixed64Type}, pack.Uint64(300),
						pack.Tag{Number: 1, Type: pack.BytesType}, pack.String("hello"),
						pack.Tag{Number: 1, Type: pack.EndGroupType},
					},
					pack.Tag{Number: 50004, Type: pack.EndGroupType},
				},
			}.Marshal())
			return m
		}(),
		want: Message{
			messageTypeKey: messageTypeOf(&testpb.TestAllTypes{}),
			"50000":        protoreflect.RawFields(pack.Message{pack.Tag{Number: 50000, Type: pack.VarintType}, pack.Uvarint(100)}.Marshal()),
			"50001":        protoreflect.RawFields(pack.Message{pack.Tag{Number: 50001, Type: pack.Fixed32Type}, pack.Uint32(200)}.Marshal()),
			"50002":        protoreflect.RawFields(pack.Message{pack.Tag{Number: 50002, Type: pack.Fixed64Type}, pack.Uint64(300)}.Marshal()),
			"50003":        protoreflect.RawFields(pack.Message{pack.Tag{Number: 50003, Type: pack.BytesType}, pack.String("hello")}.Marshal()),
			"50004": protoreflect.RawFields(pack.Message{
				pack.Tag{Number: 50004, Type: pack.StartGroupType},
				pack.Tag{Number: 1, Type: pack.VarintType}, pack.Uvarint(100),
				pack.Tag{Number: 1, Type: pack.Fixed32Type}, pack.Uint32(200),
				pack.Tag{Number: 1, Type: pack.Fixed64Type}, pack.Uint64(300),
				pack.Tag{Number: 1, Type: pack.BytesType}, pack.String("hello"),
				pack.Message{
					pack.Tag{Number: 1, Type: pack.StartGroupType},
					pack.Tag{Number: 1, Type: pack.VarintType}, pack.Uvarint(100),
					pack.Tag{Number: 1, Type: pack.Fixed32Type}, pack.Uint32(200),
					pack.Tag{Number: 1, Type: pack.Fixed64Type}, pack.Uint64(300),
					pack.Tag{Number: 1, Type: pack.BytesType}, pack.String("hello"),
					pack.Tag{Number: 1, Type: pack.EndGroupType},
				},
				pack.Tag{Number: 50004, Type: pack.EndGroupType},
			}.Marshal()),
		},
		wantString: `{50000:100, 50001:200, 50002:300, 50003:"hello", 50004:{1:[100, 200, 300, "hello", {1:[100, 200, 300, "hello"]}]}}`,
	}}
	for _, tt := range tests {
		t.Run("", func(t *testing.T) {
			got := transformMessage(tt.in.ProtoReflect())
			if diff := cmp.Diff(tt.want, got); diff != "" {
				t.Errorf("Transform() mismatch (-want +got):\n%v", diff)
			}
			if diff := cmp.Diff(tt.wantString, got.String()); diff != "" {
				t.Errorf("Transform().String() mismatch (-want +got):\n%v", diff)
			}
		})
	}
}

func enumOf(e protoreflect.Enum) Enum {
	return Enum{e.Number(), e.Descriptor()}
}

func messageTypeOf(m protoreflect.ProtoMessage) messageType {
	return messageType{md: m.ProtoReflect().Descriptor()}
}
