blob: 3432d5cf951d8499854a15304b807c7648bfd548 [file] [log] [blame]
Damien Neil92f76182019-08-02 16:58:08 -07001// Copyright 2019 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style.
3// license that can be found in the LICENSE file.
4
5package proto_test
6
7import (
8 "fmt"
9 "testing"
10
11 "github.com/google/go-cmp/cmp"
12 "google.golang.org/protobuf/proto"
13 pref "google.golang.org/protobuf/reflect/protoreflect"
14 "google.golang.org/protobuf/runtime/protoimpl"
15
16 legacy1pb "google.golang.org/protobuf/internal/testprotos/legacy/proto2.v0.0.0-20160225-2fc053c5"
17 testpb "google.golang.org/protobuf/internal/testprotos/test"
18)
19
20func TestExtensionFuncs(t *testing.T) {
21 for _, test := range []struct {
22 message proto.Message
23 ext pref.ExtensionType
24 wantDefault interface{}
25 value interface{}
26 }{
27 {
28 message: &testpb.TestAllExtensions{},
29 ext: testpb.E_OptionalInt32Extension,
30 wantDefault: int32(0),
31 value: int32(1),
32 },
33 {
34 message: &testpb.TestAllExtensions{},
35 ext: testpb.E_RepeatedStringExtension,
36 // TODO: Represent repeated extension fields as []T.
37 // https://github.com/golang/protobuf/issues/901
38 wantDefault: (*[]string)(nil),
39 value: &[]string{"a", "b", "c"},
40 },
41 {
42 message: protoimpl.X.MessageOf(&legacy1pb.Message{}).Interface(),
43 ext: legacy1pb.E_Message_ExtensionOptionalBool,
44 wantDefault: false,
45 value: true,
46 },
47 } {
Damien Neil79bfdbe2019-08-28 11:08:22 -070048 desc := fmt.Sprintf("Extension %v, value %v", test.ext.TypeDescriptor().FullName(), test.value)
Damien Neil92f76182019-08-02 16:58:08 -070049 if proto.HasExtension(test.message, test.ext) {
50 t.Errorf("%v:\nbefore setting extension HasExtension(...) = true, want false", desc)
51 }
52 got := proto.GetExtension(test.message, test.ext)
53 if d := cmp.Diff(test.wantDefault, got); d != "" {
54 t.Errorf("%v:\nbefore setting extension GetExtension(...) returns unexpected value (-want,+got):\n%v", desc, d)
55 }
56 proto.SetExtension(test.message, test.ext, test.value)
57 if !proto.HasExtension(test.message, test.ext) {
58 t.Errorf("%v:\nafter setting extension HasExtension(...) = false, want true", desc)
59 }
60 got = proto.GetExtension(test.message, test.ext)
61 if d := cmp.Diff(test.value, got); d != "" {
62 t.Errorf("%v:\nafter setting extension GetExtension(...) returns unexpected value (-want,+got):\n%v", desc, d)
63 }
64 proto.ClearExtension(test.message, test.ext)
65 if proto.HasExtension(test.message, test.ext) {
66 t.Errorf("%v:\nafter clearing extension HasExtension(...) = true, want false", desc)
67 }
68
69 }
70}