// 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 (
	"fmt"
	"strings"
	"testing"

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

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

func TestIsInitializedErrors(t *testing.T) {
	type test struct {
		m    proto.Message
		want string
		skip bool
	}
	tests := []test{{
		m:    &testpb.TestRequired{},
		want: `goproto.proto.test.TestRequired.required_field`,
	}, {
		m: &testpb.TestRequiredForeign{
			OptionalMessage: &testpb.TestRequired{},
		},
		want: `goproto.proto.test.TestRequired.required_field`,
	}, {
		m: &testpb.TestRequiredForeign{
			RepeatedMessage: []*testpb.TestRequired{
				{RequiredField: proto.Int32(1)},
				{},
			},
		},
		want: `goproto.proto.test.TestRequired.required_field`,
	}, {
		m: &testpb.TestRequiredForeign{
			MapMessage: map[int32]*testpb.TestRequired{
				1: {},
			},
		},
		want: `goproto.proto.test.TestRequired.required_field`,
	}, {
		m:    &testpb.TestWeak{},
		want: `<nil>`,
		skip: !flags.ProtoLegacy,
	}, {
		m: func() proto.Message {
			m := &testpb.TestWeak{}
			m.SetWeakMessage1(&weakpb.WeakImportMessage1{})
			return m
		}(),
		want: `goproto.proto.test.weak.WeakImportMessage1.a`,
		skip: !flags.ProtoLegacy,
	}, {
		m: func() proto.Message {
			m := &testpb.TestWeak{}
			m.SetWeakMessage1(&weakpb.WeakImportMessage1{
				A: proto.Int32(1),
			})
			return m
		}(),
		want: `<nil>`,
		skip: !flags.ProtoLegacy,
	}}

	for _, tt := range tests {
		t.Run("", func(t *testing.T) {
			if tt.skip {
				t.SkipNow()
			}

			err := proto.IsInitialized(tt.m)
			got := "<nil>"
			if err != nil {
				got = fmt.Sprintf("%q", err)
			}
			if !strings.Contains(got, tt.want) {
				t.Errorf("IsInitialized(m):\n got: %v\nwant contains: %v\nMessage:\n%v", got, tt.want, marshalText(tt.m))
			}
		})
	}
}
