blob: 029bfa4afcce72e8a5f8d4e962c0c32c671f0816 [file] [log] [blame]
// Copyright 2024 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.
// Tests the opaque builders.
package builder_test
import (
"testing"
testhybridpb "google.golang.org/protobuf/internal/testprotos/testeditions/testeditions_hybrid"
testopaquepb "google.golang.org/protobuf/internal/testprotos/testeditions/testeditions_opaque"
"google.golang.org/protobuf/proto"
)
var enableLazy = proto.UnmarshalOptions{}
var disableLazy = proto.UnmarshalOptions{
NoLazyDecoding: true,
}
func roundtrip(t *testing.T, m proto.Message, unmarshalOpts proto.UnmarshalOptions) {
b, err := proto.Marshal(m)
if err != nil {
t.Fatalf("unable to Marshal proto: %v", err)
}
if err := unmarshalOpts.Unmarshal(b, m); err != nil {
t.Fatalf("roundtrip: unable to unmarshal proto: %v", err)
}
}
func TestOpaqueBuilderLazy(t *testing.T) {
testLazyOptionalBuilder(t, enableLazy)
}
func TestOpaqueBuilderEager(t *testing.T) {
testLazyOptionalBuilder(t, disableLazy)
}
// testLazyOptionalBuilder exercises all optional fields in the testall_opaque_optional3_go_proto builder
func testLazyOptionalBuilder(t *testing.T, unmarshalOpts proto.UnmarshalOptions) {
// Create empty proto from builder
m := testopaquepb.TestAllTypes_builder{}.Build()
roundtrip(t, m, unmarshalOpts)
// Check lazy message field
m = testopaquepb.TestAllTypes_builder{
OptionalLazyNestedMessage: testopaquepb.TestAllTypes_NestedMessage_builder{
A: proto.Int32(1147),
}.Build(),
RepeatedNestedMessage: []*testopaquepb.TestAllTypes_NestedMessage{
testopaquepb.TestAllTypes_NestedMessage_builder{
A: proto.Int32(1247),
}.Build(),
},
OneofNestedMessage: testopaquepb.TestAllTypes_NestedMessage_builder{
A: proto.Int32(1347),
}.Build(),
MapStringNestedMessage: map[string]*testopaquepb.TestAllTypes_NestedMessage{
"a": testopaquepb.TestAllTypes_NestedMessage_builder{
A: proto.Int32(5),
}.Build(),
},
}.Build()
roundtrip(t, m, unmarshalOpts)
if got, want := m.HasOptionalLazyNestedMessage(), true; got != want {
t.Errorf("Builder for field NestedMessage did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalLazyNestedMessage().GetA(), int32(1147); got != want {
t.Errorf("Builder for field NestedMessage did not work, got %v, wanted %v", got, want)
}
if got, want := len(m.GetRepeatedNestedMessage()), 1; got != want {
t.Errorf("Builder for field RepeatedNestedMessage did not set a field of expected length, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedNestedMessage()[0].GetA(), int32(1247); got != want {
t.Errorf("Builder for field RepetedNestedMessage did not work, got %v, wanted %v", got, want)
}
if got, want := m.HasOneofNestedMessage(), true; got != want {
t.Errorf("Builder for field OneofNestedMessage did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.GetOneofNestedMessage().GetA(), int32(1347); got != want {
t.Errorf("Builder for field OneofNestedMessage did not work, got %v, wanted %v", got, want)
}
// Check map field
{
if got, want := len(m.GetMapStringNestedMessage()), 1; got != want {
t.Errorf("Builder for field MapStringNestedMessage did not work, got len %v, wanted len %v", got, want)
}
if got, want := m.GetMapStringNestedMessage()["a"].GetA(), int32(5); got != want {
t.Errorf("Builder for field MapStringNestedMessage did not work, got %v, wanted %v", got, want)
}
}
}
// TestHybridOptionalBuilder exercises all optional fields in the testall_opaque_optional3_go_proto builder
func TestHybridOptionalBuilder(t *testing.T) {
// Create empty proto from builder
m := testhybridpb.TestAllTypes_builder{}.Build()
// Check that no optional fields are present
// Check presence of each field
if got, want := m.HasOptionalInt32(), false; got != want {
t.Errorf("Builder for field OptionalInt32 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalInt64(), false; got != want {
t.Errorf("Builder for field OptionalInt64 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalUint32(), false; got != want {
t.Errorf("Builder for field OptionalUint32 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalUint64(), false; got != want {
t.Errorf("Builder for field OptionalUint64 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalSint32(), false; got != want {
t.Errorf("Builder for field OptionalSint32 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalSint64(), false; got != want {
t.Errorf("Builder for field OptionalSint64 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalFixed32(), false; got != want {
t.Errorf("Builder for field OptionalFixed32 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalFixed64(), false; got != want {
t.Errorf("Builder for field OptionalFixed64 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalSfixed32(), false; got != want {
t.Errorf("Builder for field OptionalSfixed32 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalSfixed64(), false; got != want {
t.Errorf("Builder for field OptionalSfixed64 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalFloat(), false; got != want {
t.Errorf("Builder for field OptionalFloat did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalDouble(), false; got != want {
t.Errorf("Builder for field OptionalDouble did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalBool(), false; got != want {
t.Errorf("Builder for field OptionalBool did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalString(), false; got != want {
t.Errorf("Builder for field OptionalString did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalBytes(), false; got != want {
t.Errorf("Builder for field OptionalBytes did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalNestedEnum(), false; got != want {
t.Errorf("Builder for field OptionalNestedEnum did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalNestedMessage(), false; got != want {
t.Errorf("Builder for field OptionalNestedMessage did not set presence, got %v, wanted %v", got, want)
}
// Create builder with every optional field filled in
b := testhybridpb.TestAllTypes_builder{
// Scalar fields (including bytes)
OptionalInt32: proto.Int32(3),
OptionalInt64: proto.Int64(64),
OptionalUint32: proto.Uint32(32),
OptionalUint64: proto.Uint64(4711),
OptionalSint32: proto.Int32(-23),
OptionalSint64: proto.Int64(-123132),
OptionalFixed32: proto.Uint32(6798421),
OptionalFixed64: proto.Uint64(876555776),
OptionalSfixed32: proto.Int32(-909038),
OptionalSfixed64: proto.Int64(-63728193629),
OptionalFloat: proto.Float32(781.0),
OptionalDouble: proto.Float64(-3456.3),
OptionalBool: proto.Bool(true),
OptionalString: proto.String("hello"),
OptionalBytes: []byte("goodbye"),
OptionalNestedEnum: testhybridpb.TestAllTypes_FOO.Enum(),
OptionalNestedMessage: testhybridpb.TestAllTypes_NestedMessage_builder{
A: proto.Int32(1147),
}.Build(),
}
m = b.Build()
// Check presence of each optional field
if got, want := m.HasOptionalInt32(), true; got != want {
t.Errorf("Builder for field OptionalInt32 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalInt64(), true; got != want {
t.Errorf("Builder for field OptionalInt64 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalUint32(), true; got != want {
t.Errorf("Builder for field OptionalUint32 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalUint64(), true; got != want {
t.Errorf("Builder for field OptionalUint64 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalSint32(), true; got != want {
t.Errorf("Builder for field OptionalSint32 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalSint64(), true; got != want {
t.Errorf("Builder for field OptionalSint64 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalFixed32(), true; got != want {
t.Errorf("Builder for field OptionalFixed32 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalFixed64(), true; got != want {
t.Errorf("Builder for field OptionalFixed64 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalSfixed32(), true; got != want {
t.Errorf("Builder for field OptionalSfixed32 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalSfixed64(), true; got != want {
t.Errorf("Builder for field OptionalSfixed64 did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalFloat(), true; got != want {
t.Errorf("Builder for field OptionalFloat did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalDouble(), true; got != want {
t.Errorf("Builder for field OptionalDouble did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalBool(), true; got != want {
t.Errorf("Builder for field OptionalBool did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalString(), true; got != want {
t.Errorf("Builder for field OptionalString did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalBytes(), true; got != want {
t.Errorf("Builder for field OptionalBytes did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalNestedEnum(), true; got != want {
t.Errorf("Builder for field OptionalNestedEnum did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalNestedMessage(), true; got != want {
t.Errorf("Builder for field OptionalNestedMessage did not set presence, got %v, wanted %v", got, want)
}
// Check each optional field against the corresponding field in the builder
if got, want := m.GetOptionalInt32(), *b.OptionalInt32; got != want {
t.Errorf("Builder for field OptionalInt32 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalInt64(), *b.OptionalInt64; got != want {
t.Errorf("Builder for field OptionalInt64 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalUint32(), *b.OptionalUint32; got != want {
t.Errorf("Builder for field OptionalUint32 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalUint64(), *b.OptionalUint64; got != want {
t.Errorf("Builder for field OptionalUint64 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalSint32(), *b.OptionalSint32; got != want {
t.Errorf("Builder for field OptionalSint32 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalSint64(), *b.OptionalSint64; got != want {
t.Errorf("Builder for field OptionalSint64 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalFixed32(), *b.OptionalFixed32; got != want {
t.Errorf("Builder for field OptionalFixed32 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalFixed64(), *b.OptionalFixed64; got != want {
t.Errorf("Builder for field OptionalFixed64 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalSfixed32(), *b.OptionalSfixed32; got != want {
t.Errorf("Builder for field OptionalSfixed32 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalSfixed64(), *b.OptionalSfixed64; got != want {
t.Errorf("Builder for field OptionalSfixed64 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalFloat(), *b.OptionalFloat; got != want {
t.Errorf("Builder for field OptionalFloat did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalDouble(), *b.OptionalDouble; got != want {
t.Errorf("Builder for field OptionalDouble did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalBool(), *b.OptionalBool; got != want {
t.Errorf("Builder for field OptionalBool did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalString(), *b.OptionalString; got != want {
t.Errorf("Builder for field OptionalString did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalBytes(), b.OptionalBytes; string(got) != string(want) {
t.Errorf("Builder for field OptionalBytes did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalNestedEnum(), *b.OptionalNestedEnum; got != want {
t.Errorf("Builder for field OptionalNestedEnum did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalNestedMessage().GetA(), int32(1147); got != want {
t.Errorf("Builder for field OptionalNestedMessage did not work, got %v, wanted %v", got, want)
}
}
// TestOpaqueBuilder exercises all non-oneof fields in the testall_opaque3_go_proto builder
func TestOpaqueBuilder(t *testing.T) {
// Create builder with every possible field filled in
b := testopaquepb.TestAllTypes_builder{
// Scalar fields (including bytes)
SingularInt32: 3,
SingularInt64: 64,
SingularUint32: 32,
SingularUint64: 4711,
SingularSint32: -23,
SingularSint64: -123132,
SingularFixed32: 6798421,
SingularFixed64: 876555776,
SingularSfixed32: -909038,
SingularSfixed64: -63728193629,
SingularFloat: 781.0,
SingularDouble: -3456.3,
SingularBool: true,
SingularString: "hello",
SingularBytes: []byte("goodbye"),
OptionalNestedEnum: testopaquepb.TestAllTypes_FOO.Enum(),
OptionalNestedMessage: testopaquepb.TestAllTypes_NestedMessage_builder{
A: proto.Int32(1147),
}.Build(),
RepeatedInt32: []int32{4},
RepeatedInt64: []int64{65},
RepeatedUint32: []uint32{33},
RepeatedUint64: []uint64{4712},
RepeatedSint32: []int32{-24},
RepeatedSint64: []int64{-123133},
RepeatedFixed32: []uint32{6798422},
RepeatedFixed64: []uint64{876555777},
RepeatedSfixed32: []int32{-909039},
RepeatedSfixed64: []int64{-63728193630},
RepeatedFloat: []float32{782.0},
RepeatedDouble: []float64{-3457.3},
RepeatedBool: []bool{false},
RepeatedString: []string{"hello!"},
RepeatedBytes: [][]byte{[]byte("goodbye!")},
RepeatedNestedEnum: []testopaquepb.TestAllTypes_NestedEnum{testopaquepb.TestAllTypes_BAZ},
RepeatedNestedMessage: []*testopaquepb.TestAllTypes_NestedMessage{testopaquepb.TestAllTypes_NestedMessage_builder{
A: proto.Int32(1148),
}.Build()},
MapInt32Int32: map[int32]int32{
89: 87,
87: 89,
},
MapInt64Int64: map[int64]int64{
345: 678,
2121: 5432,
},
MapUint32Uint32: map[uint32]uint32{
765476: 87658,
4324: 6543,
},
MapUint64Uint64: map[uint64]uint64{
2324: 543534,
7657654: 675,
},
MapSint32Sint32: map[int32]int32{
-45243: -543353,
-54343: -33,
},
MapSint64Sint64: map[int64]int64{
-6754389: 34,
467382: -676743,
},
MapFixed32Fixed32: map[uint32]uint32{
43432: 4444,
5555555: 666666,
},
MapFixed64Fixed64: map[uint64]uint64{
777777: 888888,
999999: 111111,
},
MapSfixed32Sfixed32: map[int32]int32{
-778989: -543,
-9999: 98765,
},
MapSfixed64Sfixed64: map[int64]int64{
65486723: 89,
-76843592: -33,
},
MapInt32Float: map[int32]float32{
543433: 7.5,
3434333: 3.14,
},
MapInt32Double: map[int32]float64{
876876: 34.34,
987650: 35.35,
},
MapBoolBool: map[bool]bool{
true: true,
false: true,
},
MapStringString: map[string]string{
"hello?": "goodbye?",
"hi": "bye",
},
MapStringBytes: map[string][]byte{
"hi?": []byte("bye!"),
"bye?": []byte("hi!"),
},
MapStringNestedMessage: map[string]*testopaquepb.TestAllTypes_NestedMessage{
"nest": testopaquepb.TestAllTypes_NestedMessage_builder{
A: proto.Int32(99),
}.Build(),
"mess": testopaquepb.TestAllTypes_NestedMessage_builder{
A: proto.Int32(100),
}.Build(),
},
MapStringNestedEnum: map[string]testopaquepb.TestAllTypes_NestedEnum{
"bar": testopaquepb.TestAllTypes_BAR,
"baz": testopaquepb.TestAllTypes_BAZ,
},
OneofUint32: proto.Uint32(77665544),
}
m := b.Build()
// Check each field against the corresponding field in the builder
if got, want := m.GetSingularInt32(), b.SingularInt32; got != want {
t.Errorf("Builder for field FInt32 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetSingularInt64(), b.SingularInt64; got != want {
t.Errorf("Builder for field FInt64 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetSingularUint32(), b.SingularUint32; got != want {
t.Errorf("Builder for field FUint32 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetSingularUint64(), b.SingularUint64; got != want {
t.Errorf("Builder for field FUint64 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetSingularSint32(), b.SingularSint32; got != want {
t.Errorf("Builder for field FSint32 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetSingularSint64(), b.SingularSint64; got != want {
t.Errorf("Builder for field FSint64 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetSingularFixed32(), b.SingularFixed32; got != want {
t.Errorf("Builder for field FFixed32 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetSingularFixed64(), b.SingularFixed64; got != want {
t.Errorf("Builder for field FFixed64 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetSingularSfixed32(), b.SingularSfixed32; got != want {
t.Errorf("Builder for field FSfixed32 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetSingularSfixed64(), b.SingularSfixed64; got != want {
t.Errorf("Builder for field FSfixed64 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetSingularFloat(), b.SingularFloat; got != want {
t.Errorf("Builder for field FFloat did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetSingularDouble(), b.SingularDouble; got != want {
t.Errorf("Builder for field FDouble did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetSingularBool(), b.SingularBool; got != want {
t.Errorf("Builder for field FBool did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetSingularString(), b.SingularString; got != want {
t.Errorf("Builder for field FString did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetSingularBytes(), b.SingularBytes; string(got) != string(want) {
t.Errorf("Builder for field FBytes did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalNestedEnum(), *b.OptionalNestedEnum; got != want {
t.Errorf("Builder for field FNestedEnum did not work, got %v, wanted %v", got, want)
}
if got, want := m.HasOptionalNestedMessage(), true; got != want {
t.Errorf("Builder for field FNestedMessage did not set presence, got %v, wanted %v", got, want)
}
if got, want := m.GetOptionalNestedMessage().GetA(), int32(1147); got != want {
t.Errorf("Builder for field FNestedMessage did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedInt32()[0], b.RepeatedInt32[0]; got != want {
t.Errorf("Builder for repeated field RepeatedInt32 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedInt64()[0], b.RepeatedInt64[0]; got != want {
t.Errorf("Builder for repeated field RepeatedInt64 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedUint32()[0], b.RepeatedUint32[0]; got != want {
t.Errorf("Builder for repeated field RepeatedUint32 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedUint64()[0], b.RepeatedUint64[0]; got != want {
t.Errorf("Builder for repeated field RepeatedUint64 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedSint32()[0], b.RepeatedSint32[0]; got != want {
t.Errorf("Builder for repeated field RepeatedSint32 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedSint64()[0], b.RepeatedSint64[0]; got != want {
t.Errorf("Builder for repeated field RepeatedSint64 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedFixed32()[0], b.RepeatedFixed32[0]; got != want {
t.Errorf("Builder for repeated field RepeatedFixed32 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedFixed64()[0], b.RepeatedFixed64[0]; got != want {
t.Errorf("Builder for repeated field RepeatedFixed64 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedSfixed32()[0], b.RepeatedSfixed32[0]; got != want {
t.Errorf("Builder for repeated field RepeatedSfixed32 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedSfixed64()[0], b.RepeatedSfixed64[0]; got != want {
t.Errorf("Builder for repeated field RepeatedSfixed64 did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedFloat()[0], b.RepeatedFloat[0]; got != want {
t.Errorf("Builder for repeated field RepeatedFloat did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedDouble()[0], b.RepeatedDouble[0]; got != want {
t.Errorf("Builder for repeated field RepeatedDouble did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedBool()[0], b.RepeatedBool[0]; got != want {
t.Errorf("Builder for repeated field RepeatedBool did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedString()[0], b.RepeatedString[0]; got != want {
t.Errorf("Builder for repeated field RepeatedString did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedBytes()[0], b.RepeatedBytes[0]; string(got) != string(want) {
t.Errorf("Builder for repeated field RepeatedBytes did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedNestedEnum()[0], b.RepeatedNestedEnum[0]; got != want {
t.Errorf("Builder for repeated field RepeatedNestedEnum did not work, got %v, wanted %v", got, want)
}
if got, want := m.GetRepeatedNestedMessage()[0].GetA(), int32(1148); got != want {
t.Errorf("Builder for repeated field RepeatedNestedMessage did not work, got %v, wanted %v", got, want)
}
for key, want := range b.MapInt32Int32 {
if got := m.GetMapInt32Int32()[key]; got != want {
t.Errorf("Builder for map field MapInt32Int32[%v] did not work, got %v, wanted %v", key, got, want)
}
}
for key, want := range b.MapInt64Int64 {
if got := m.GetMapInt64Int64()[key]; got != want {
t.Errorf("Builder for map field MapInt64Int64[%v] did not work, got %v, wanted %v", key, got, want)
}
}
for key, want := range b.MapUint32Uint32 {
if got := m.GetMapUint32Uint32()[key]; got != want {
t.Errorf("Builder for map field MapUint32Uint32[%v] did not work, got %v, wanted %v", key, got, want)
}
}
for key, want := range b.MapUint64Uint64 {
if got := m.GetMapUint64Uint64()[key]; got != want {
t.Errorf("Builder for map field MapUint64Uint64[%v] did not work, got %v, wanted %v", key, got, want)
}
}
for key, want := range b.MapSint32Sint32 {
if got := m.GetMapSint32Sint32()[key]; got != want {
t.Errorf("Builder for map field MapSint32Sint32[%v] did not work, got %v, wanted %v", key, got, want)
}
}
for key, want := range b.MapSint64Sint64 {
if got := m.GetMapSint64Sint64()[key]; got != want {
t.Errorf("Builder for map field MapSint64Sint64[%v] did not work, got %v, wanted %v", key, got, want)
}
}
for key, want := range b.MapFixed32Fixed32 {
if got := m.GetMapFixed32Fixed32()[key]; got != want {
t.Errorf("Builder for map field MapFixed32Fixed32[%v] did not work, got %v, wanted %v", key, got, want)
}
}
for key, want := range b.MapFixed64Fixed64 {
if got := m.GetMapFixed64Fixed64()[key]; got != want {
t.Errorf("Builder for map field MapFixed64Fixed64[%v] did not work, got %v, wanted %v", key, got, want)
}
}
for key, want := range b.MapSfixed32Sfixed32 {
if got := m.GetMapSfixed32Sfixed32()[key]; got != want {
t.Errorf("Builder for map field MapSfixed32Sfixed32[%v] did not work, got %v, wanted %v", key, got, want)
}
}
for key, want := range b.MapSfixed64Sfixed64 {
if got := m.GetMapSfixed64Sfixed64()[key]; got != want {
t.Errorf("Builder for map field MapSfixed64Sfixed64[%v] did not work, got %v, wanted %v", key, got, want)
}
}
for key, want := range b.MapInt32Float {
if got := m.GetMapInt32Float()[key]; got != want {
t.Errorf("Builder for map field MapInt32Float[%v] did not work, got %v, wanted %v", key, got, want)
}
}
for key, want := range b.MapInt32Double {
if got := m.GetMapInt32Double()[key]; got != want {
t.Errorf("Builder for map field MapInt32Double[%v] did not work, got %v, wanted %v", key, got, want)
}
}
for key, want := range b.MapBoolBool {
if got := m.GetMapBoolBool()[key]; got != want {
t.Errorf("Builder for map field MapBoolBool[%v] did not work, got %v, wanted %v", key, got, want)
}
}
for key, want := range b.MapStringString {
if got := m.GetMapStringString()[key]; got != want {
t.Errorf("Builder for map field MapStringString[%v] did not work, got %v, wanted %v", key, got, want)
}
}
for key, want := range b.MapStringBytes {
if got := m.GetMapStringBytes()[key]; string(got) != string(want) {
t.Errorf("Builder for map field MapStringBytes[%v] did not work, got %v, wanted %v", key, got, want)
}
}
for key, want := range b.MapStringNestedMessage {
if got := m.GetMapStringNestedMessage()[key]; got.GetA() != want.GetA() {
t.Errorf("Builder for map field MapStringNestedMessage[%v] did not work, got %v, wanted %v", key, got, want)
}
}
for key, want := range b.MapStringNestedEnum {
if got := m.GetMapStringNestedEnum()[key]; got != want {
t.Errorf("Builder for map field MapStringNestedEnum[%v] did not work, got %v, wanted %v", key, got, want)
}
}
if got, want := m.GetOneofUint32(), *b.OneofUint32; got != want {
t.Errorf("Builder for field OneofUint32 did not work, got %v, wanted %v", got, want)
}
}
func TestOpaqueBuilderOneofsLazy(t *testing.T) {
testOpaqueBuilderOneofs(t, enableLazy)
}
func TestOpaqueBuilderOneofsEager(t *testing.T) {
testOpaqueBuilderOneofs(t, disableLazy)
}
// TestOpaqueBuilderOneofs test each oneof option in the builder separately
func testOpaqueBuilderOneofs(t *testing.T, unmarshalOpts proto.UnmarshalOptions) {
for _, task := range []struct {
set func() (any, int, *testopaquepb.TestAllTypes)
check func(any, *testopaquepb.TestAllTypes) (bool, any)
}{
{
// uint32
set: func() (any, int, *testopaquepb.TestAllTypes) {
val := uint32(6754)
return val, int(testopaquepb.TestAllTypes_OneofUint32_case), testopaquepb.TestAllTypes_builder{OneofUint32: &val}.Build()
},
check: func(x any, m *testopaquepb.TestAllTypes) (bool, any) {
want := x.(uint32)
got := m.GetOneofUint32()
return want == got, got
},
},
{
// message
set: func() (any, int, *testopaquepb.TestAllTypes) {
val := testopaquepb.TestAllTypes_NestedMessage_builder{A: proto.Int32(5432678)}.Build()
return val, int(testopaquepb.TestAllTypes_OneofNestedMessage_case), testopaquepb.TestAllTypes_builder{OneofNestedMessage: val}.Build()
},
check: func(x any, m *testopaquepb.TestAllTypes) (bool, any) {
want := x.(*testopaquepb.TestAllTypes_NestedMessage)
got := m.GetOneofNestedMessage()
return want.GetA() == got.GetA(), got
},
},
{
// string
set: func() (any, int, *testopaquepb.TestAllTypes) {
val := "random"
return val, int(testopaquepb.TestAllTypes_OneofString_case), testopaquepb.TestAllTypes_builder{OneofString: &val}.Build()
},
check: func(x any, m *testopaquepb.TestAllTypes) (bool, any) {
want := x.(string)
got := m.GetOneofString()
return want == got, got
},
},
{
// bytes
set: func() (any, int, *testopaquepb.TestAllTypes) {
val := []byte("randombytes")
return val, int(testopaquepb.TestAllTypes_OneofBytes_case), testopaquepb.TestAllTypes_builder{OneofBytes: val}.Build()
},
check: func(x any, m *testopaquepb.TestAllTypes) (bool, any) {
want := x.([]byte)
got := m.GetOneofBytes()
return string(want) == string(got), got
},
},
{
// uint64
set: func() (any, int, *testopaquepb.TestAllTypes) {
val := uint64(65934287653)
return val, int(testopaquepb.TestAllTypes_OneofUint64_case), testopaquepb.TestAllTypes_builder{OneofUint64: &val}.Build()
},
check: func(x any, m *testopaquepb.TestAllTypes) (bool, any) {
want := x.(uint64)
got := m.GetOneofUint64()
return want == got, got
},
},
{
// bool
set: func() (any, int, *testopaquepb.TestAllTypes) {
val := true
return val, int(testopaquepb.TestAllTypes_OneofBool_case), testopaquepb.TestAllTypes_builder{OneofBool: &val}.Build()
},
check: func(x any, m *testopaquepb.TestAllTypes) (bool, any) {
want := x.(bool)
got := m.GetOneofBool()
return want == got, got
},
},
{
// float
set: func() (any, int, *testopaquepb.TestAllTypes) {
val := float32(-54.45)
return val, int(testopaquepb.TestAllTypes_OneofFloat_case), testopaquepb.TestAllTypes_builder{OneofFloat: &val}.Build()
},
check: func(x any, m *testopaquepb.TestAllTypes) (bool, any) {
want := x.(float32)
got := m.GetOneofFloat()
return want == got, got
},
},
{
// double
set: func() (any, int, *testopaquepb.TestAllTypes) {
val := float64(-45.54)
return val, int(testopaquepb.TestAllTypes_OneofDouble_case), testopaquepb.TestAllTypes_builder{OneofDouble: &val}.Build()
},
check: func(x any, m *testopaquepb.TestAllTypes) (bool, any) {
want := x.(float64)
got := m.GetOneofDouble()
return want == got, got
},
},
{
// enum
set: func() (any, int, *testopaquepb.TestAllTypes) {
val := testopaquepb.TestAllTypes_BAR
return val, int(testopaquepb.TestAllTypes_OneofEnum_case), testopaquepb.TestAllTypes_builder{OneofEnum: &val}.Build()
},
check: func(x any, m *testopaquepb.TestAllTypes) (bool, any) {
want := x.(testopaquepb.TestAllTypes_NestedEnum)
got := m.GetOneofEnum()
return want == got, got
},
},
} {
want, cas, m := task.set()
gotCase := int(m.WhichOneofField())
if gotCase != cas {
t.Errorf("Builder did not make which function return correct value, got %v, wanted %v for type %T", gotCase, cas, want)
}
ok, got := task.check(want, m)
if !ok {
t.Errorf("Builder did not set oneof field correctly, got %v, wanted %v for type %T", got, want, want)
}
}
}