| // 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/encoding/prototext" | 
 | 	"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 TestCheckInitializedErrors(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.CheckInitialized(tt.m) | 
 | 			got := "<nil>" | 
 | 			if err != nil { | 
 | 				got = fmt.Sprintf("%q", err) | 
 | 			} | 
 | 			if !strings.Contains(got, tt.want) { | 
 | 				t.Errorf("CheckInitialized(m):\n got: %v\nwant contains: %v\nMessage:\n%v", got, tt.want, prototext.Format(tt.m)) | 
 | 			} | 
 | 		}) | 
 | 	} | 
 | } |