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

import (
	"testing"

	"google.golang.org/protobuf/internal/scalar"
	"google.golang.org/protobuf/proto"

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

func TestReset(t *testing.T) {
	m := &testpb.TestAllTypes{
		OptionalSfixed64:       scalar.Int64(5),
		RepeatedInt32:          []int32{},
		RepeatedFloat:          []float32{1.234, 5.678},
		MapFixed64Fixed64:      map[uint64]uint64{5: 7},
		MapStringString:        map[string]string{},
		OptionalForeignMessage: &testpb.ForeignMessage{},
		OneofField:             (*testpb.TestAllTypes_OneofUint32)(nil),
	}
	m.ProtoReflect().SetUnknown([]byte{})

	proto.Reset(m)

	if m.OptionalSfixed64 != nil {
		t.Errorf("m.OptionalSfixed64 = %p, want nil", m.OptionalSfixed64)
	}
	if m.RepeatedInt32 != nil {
		t.Errorf("m.RepeatedInt32 = %p, want nil", m.RepeatedInt32)
	}
	if m.RepeatedFloat != nil {
		t.Errorf("m.RepeatedFloat = %p, want nil", m.RepeatedFloat)
	}
	if m.MapFixed64Fixed64 != nil {
		t.Errorf("m.MapFixed64Fixed64 = %p, want nil", m.MapFixed64Fixed64)
	}
	if m.MapStringString != nil {
		t.Errorf("m.MapStringString = %p, want nil", m.MapStringString)
	}
	if m.OptionalForeignMessage != nil {
		t.Errorf("m.OptionalForeignMessage = %p, want nil", m.OptionalForeignMessage)
	}
	if m.OneofField != nil {
		t.Errorf("m.OneofField = %p, want nil", m.OneofField)
	}

	if got := m.ProtoReflect().GetUnknown(); got != nil {
		t.Errorf("m.ProtoReflect().GetUnknown() = %d, want nil", got)
	}
}
