|  | // Copyright 2018 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 defval_test | 
|  |  | 
|  | import ( | 
|  | "math" | 
|  | "reflect" | 
|  | "testing" | 
|  |  | 
|  | "google.golang.org/protobuf/internal/encoding/defval" | 
|  | "google.golang.org/protobuf/internal/filedesc" | 
|  | "google.golang.org/protobuf/reflect/protoreflect" | 
|  | ) | 
|  |  | 
|  | func Test(t *testing.T) { | 
|  | evs := filedesc.EnumValues{List: []filedesc.EnumValue{{}}} | 
|  | evs.List[0].L0.ParentFile = filedesc.SurrogateProto2 | 
|  | evs.List[0].L0.FullName = "ALPHA" | 
|  | evs.List[0].L1.Number = 1 | 
|  |  | 
|  | V := protoreflect.ValueOf | 
|  | tests := []struct { | 
|  | val   protoreflect.Value | 
|  | enum  protoreflect.EnumValueDescriptor | 
|  | enums protoreflect.EnumValueDescriptors | 
|  | kind  protoreflect.Kind | 
|  | strPB string | 
|  | strGo string | 
|  | }{{ | 
|  | val:   V(bool(true)), | 
|  | enum:  nil, | 
|  | enums: nil, | 
|  | kind:  protoreflect.BoolKind, | 
|  | strPB: "true", | 
|  | strGo: "1", | 
|  | }, { | 
|  | val:   V(int32(-0x1234)), | 
|  | enum:  nil, | 
|  | enums: nil, | 
|  | kind:  protoreflect.Int32Kind, | 
|  | strPB: "-4660", | 
|  | strGo: "-4660", | 
|  | }, { | 
|  | val:   V(float32(math.Pi)), | 
|  | enum:  nil, | 
|  | enums: nil, | 
|  | kind:  protoreflect.FloatKind, | 
|  | strPB: "3.1415927", | 
|  | strGo: "3.1415927", | 
|  | }, { | 
|  | val:   V(float64(math.Pi)), | 
|  | enum:  nil, | 
|  | enums: nil, | 
|  | kind:  protoreflect.DoubleKind, | 
|  | strPB: "3.141592653589793", | 
|  | strGo: "3.141592653589793", | 
|  | }, { | 
|  | val:   V(string("hello, \xde\xad\xbe\xef\n")), | 
|  | enum:  nil, | 
|  | enums: nil, | 
|  | kind:  protoreflect.StringKind, | 
|  | strPB: "hello, \xde\xad\xbe\xef\n", | 
|  | strGo: "hello, \xde\xad\xbe\xef\n", | 
|  | }, { | 
|  | val:   V([]byte("hello, \xde\xad\xbe\xef\n")), | 
|  | enum:  nil, | 
|  | enums: nil, | 
|  | kind:  protoreflect.BytesKind, | 
|  | strPB: "hello, \\336\\255\\276\\357\\n", | 
|  | strGo: "hello, \\336\\255\\276\\357\\n", | 
|  | }, { | 
|  | val:   V(protoreflect.EnumNumber(1)), | 
|  | enum:  &evs.List[0], | 
|  | enums: &evs, | 
|  | kind:  protoreflect.EnumKind, | 
|  | strPB: "ALPHA", | 
|  | strGo: "1", | 
|  | }} | 
|  |  | 
|  | for _, tt := range tests { | 
|  | t.Run("", func(t *testing.T) { | 
|  | gotStr, _ := defval.Marshal(tt.val, tt.enum, tt.kind, defval.Descriptor) | 
|  | if gotStr != tt.strPB { | 
|  | t.Errorf("Marshal(%v, %v, Descriptor) = %q, want %q", tt.val, tt.kind, gotStr, tt.strPB) | 
|  | } | 
|  |  | 
|  | gotStr, _ = defval.Marshal(tt.val, tt.enum, tt.kind, defval.GoTag) | 
|  | if gotStr != tt.strGo { | 
|  | t.Errorf("Marshal(%v, %v, GoTag) = %q, want %q", tt.val, tt.kind, gotStr, tt.strGo) | 
|  | } | 
|  |  | 
|  | gotVal, gotEnum, _ := defval.Unmarshal(tt.strPB, tt.kind, tt.enums, defval.Descriptor) | 
|  | if !reflect.DeepEqual(gotVal.Interface(), tt.val.Interface()) || gotEnum != tt.enum { | 
|  | t.Errorf("Unmarshal(%v, %v, Descriptor) = (%q, %v), want (%q, %v)", tt.strPB, tt.kind, gotVal, gotEnum, tt.val, tt.enum) | 
|  | } | 
|  |  | 
|  | gotVal, gotEnum, _ = defval.Unmarshal(tt.strGo, tt.kind, tt.enums, defval.GoTag) | 
|  | if !reflect.DeepEqual(gotVal.Interface(), tt.val.Interface()) || gotEnum != tt.enum { | 
|  | t.Errorf("Unmarshal(%v, %v, GoTag) = (%q, %v), want (%q, %v)", tt.strGo, tt.kind, gotVal, gotEnum, tt.val, tt.enum) | 
|  | } | 
|  | }) | 
|  | } | 
|  | } |