|  | // 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. | 
|  |  | 
|  | package proto_test | 
|  |  | 
|  | import ( | 
|  | "testing" | 
|  |  | 
|  | testhybridpb "google.golang.org/protobuf/internal/testprotos/testeditions/testeditions_hybrid" | 
|  | testopaquepb "google.golang.org/protobuf/internal/testprotos/testeditions/testeditions_opaque" | 
|  | ) | 
|  |  | 
|  | func TestOpenSetNilReceiver(t *testing.T) { | 
|  | var x *testhybridpb.TestAllTypes | 
|  | expectPanic(t, func() { | 
|  | x.SetOneofUint32(24) | 
|  | }, "Setting of oneof member on nil receiver did not panic.") | 
|  | expectPanic(t, func() { | 
|  | x.ClearOneofUint32() | 
|  | }, "Clearing of oneof member on nil receiver did not panic.") | 
|  | expectPanic(t, func() { | 
|  | x.ClearOneofField() | 
|  | }, "Clearing of oneof union on nil receiver did not panic.") | 
|  | } | 
|  |  | 
|  | func TestOpenSet(t *testing.T) { | 
|  | x := &testhybridpb.TestAllTypes{} | 
|  |  | 
|  | tab := []struct { | 
|  | fName string      // Field name (in proto) | 
|  | set   func()      // Set the field | 
|  | clear func()      // Clear the field | 
|  | has   func() bool // Has for the field | 
|  | }{ | 
|  | { | 
|  | fName: "oneof_uint32", | 
|  | set:   func() { x.SetOneofUint32(47) }, | 
|  | clear: func() { x.ClearOneofUint32() }, | 
|  | has:   func() bool { return x.HasOneofUint32() }, | 
|  | }, | 
|  | { | 
|  | fName: "oneof_nested_message", | 
|  | set:   func() { x.SetOneofNestedMessage(&testhybridpb.TestAllTypes_NestedMessage{}) }, | 
|  | clear: func() { x.ClearOneofNestedMessage() }, | 
|  | has:   func() bool { return x.HasOneofNestedMessage() }, | 
|  | }, | 
|  | { | 
|  | fName: "oneof_string", | 
|  | set:   func() { x.SetOneofString("test") }, | 
|  | clear: func() { x.ClearOneofString() }, | 
|  | has:   func() bool { return x.HasOneofString() }, | 
|  | }, | 
|  | { | 
|  | fName: "oneof_bytes", | 
|  | set:   func() { x.SetOneofBytes([]byte("test")) }, | 
|  | clear: func() { x.ClearOneofBytes() }, | 
|  | has:   func() bool { return x.HasOneofBytes() }, | 
|  | }, | 
|  | { | 
|  | fName: "oneof_bool", | 
|  | set:   func() { x.SetOneofBool(true) }, | 
|  | clear: func() { x.ClearOneofBool() }, | 
|  | has:   func() bool { return x.HasOneofBool() }, | 
|  | }, | 
|  | { | 
|  | fName: "oneof_uint64", | 
|  | set:   func() { x.SetOneofUint64(7438109473104) }, | 
|  | clear: func() { x.ClearOneofUint64() }, | 
|  | has:   func() bool { return x.HasOneofUint64() }, | 
|  | }, | 
|  | { | 
|  | fName: "oneof_float", | 
|  | set:   func() { x.SetOneofFloat(3.1415) }, | 
|  | clear: func() { x.ClearOneofFloat() }, | 
|  | has:   func() bool { return x.HasOneofFloat() }, | 
|  | }, | 
|  | { | 
|  | fName: "oneof_double", | 
|  | set:   func() { x.SetOneofDouble(3e+8) }, | 
|  | clear: func() { x.ClearOneofDouble() }, | 
|  | has:   func() bool { return x.HasOneofDouble() }, | 
|  | }, | 
|  | { | 
|  | fName: "oneof_enum", | 
|  | set:   func() { x.SetOneofEnum(testhybridpb.TestAllTypes_BAZ) }, | 
|  | clear: func() { x.ClearOneofEnum() }, | 
|  | has:   func() bool { return x.HasOneofEnum() }, | 
|  | }, | 
|  | } | 
|  |  | 
|  | for i, mv := range tab { | 
|  | x.ClearOneofField() | 
|  | if got, want := x.HasOneofField(), false; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v", got, want) | 
|  | } | 
|  | mv.set() | 
|  |  | 
|  | if got, want := x.HasOneofField(), true; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v (%s)", got, want, mv.fName) | 
|  | } | 
|  | if got, want := mv.has(), true; got != want { | 
|  | t.Errorf("Has on oneof member returned %v, expected %v (%s)", got, want, mv.fName) | 
|  | } | 
|  |  | 
|  | mv.clear() | 
|  | if got, want := x.HasOneofField(), false; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v (%s)", got, want, mv.fName) | 
|  | } | 
|  | if got, want := mv.has(), false; got != want { | 
|  | t.Errorf("Has on oneof member returned %v, expected %v (%s)", got, want, mv.fName) | 
|  | } | 
|  | other := tab[(i+1)%len(tab)] | 
|  | mv.set() | 
|  | other.set() | 
|  |  | 
|  | if got, want := x.HasOneofField(), true; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v (%s)", got, want, mv.fName) | 
|  | } | 
|  | if got, want := mv.has(), false; got != want { | 
|  | t.Errorf("Has on oneof member returned %v, expected %v (%s)", got, want, mv.fName) | 
|  | } | 
|  | other.clear() | 
|  | if got, want := x.HasOneofField(), false; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v (%s)", got, want, mv.fName) | 
|  | } | 
|  | } | 
|  | x.SetOneofUint32(47) | 
|  | if got, want := x.HasOneofField(), true; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v", got, want) | 
|  | } | 
|  | if got, want := x.HasOneofUint32(), true; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v", got, want) | 
|  | } | 
|  | x.SetOneofNestedMessage(nil) | 
|  | if got, want := x.HasOneofField(), false; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v", got, want) | 
|  | } | 
|  | if got, want := x.HasOneofUint32(), false; got != want { | 
|  | t.Errorf("HasOneofUint32 returned %v, expected %v", got, want) | 
|  | } | 
|  | if got, want := x.HasOneofNestedMessage(), false; got != want { | 
|  | t.Errorf("HasOneofNestedMessage returned %v, expected %v", got, want) | 
|  | } | 
|  | x.SetOneofUint32(47) | 
|  | if got, want := x.HasOneofField(), true; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v", got, want) | 
|  | } | 
|  | if got, want := x.HasOneofUint32(), true; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v", got, want) | 
|  | } | 
|  | x.SetOneofBytes(nil) | 
|  | if got, want := x.HasOneofField(), true; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v", got, want) | 
|  | } | 
|  | if got, want := x.HasOneofUint32(), false; got != want { | 
|  | t.Errorf("HasOneofUint32 returned %v, expected %v", got, want) | 
|  | } | 
|  | if got, want := x.HasOneofBytes(), true; got != want { | 
|  | t.Errorf("HasOneofNestedMessage returned %v, expected %v", got, want) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestOpaqueSetNilReceiver(t *testing.T) { | 
|  | var x *testopaquepb.TestAllTypes | 
|  | expectPanic(t, func() { | 
|  | x.SetOneofUint32(24) | 
|  | }, "Setting of oneof member on nil receiver did not panic.") | 
|  | expectPanic(t, func() { | 
|  | x.ClearOneofUint32() | 
|  | }, "Clearing of oneof member on nil receiver did not panic.") | 
|  | expectPanic(t, func() { | 
|  | x.ClearOneofField() | 
|  | }, "Clearing of oneof union on nil receiver did not panic.") | 
|  | } | 
|  |  | 
|  | func TestOpaqueSet(t *testing.T) { | 
|  | x := &testopaquepb.TestAllTypes{} | 
|  |  | 
|  | tab := []struct { | 
|  | fName string      // Field name (in proto) | 
|  | set   func()      // Set the field | 
|  | clear func()      // Clear the field | 
|  | has   func() bool // Has for the field | 
|  | }{ | 
|  | { | 
|  | fName: "oneof_uint32", | 
|  | set:   func() { x.SetOneofUint32(47) }, | 
|  | clear: func() { x.ClearOneofUint32() }, | 
|  | has:   func() bool { return x.HasOneofUint32() }, | 
|  | }, | 
|  | { | 
|  | fName: "oneof_nested_message", | 
|  | set:   func() { x.SetOneofNestedMessage(&testopaquepb.TestAllTypes_NestedMessage{}) }, | 
|  | clear: func() { x.ClearOneofNestedMessage() }, | 
|  | has:   func() bool { return x.HasOneofNestedMessage() }, | 
|  | }, | 
|  | { | 
|  | fName: "oneof_string", | 
|  | set:   func() { x.SetOneofString("test") }, | 
|  | clear: func() { x.ClearOneofString() }, | 
|  | has:   func() bool { return x.HasOneofString() }, | 
|  | }, | 
|  | { | 
|  | fName: "oneof_bytes", | 
|  | set:   func() { x.SetOneofBytes([]byte("test")) }, | 
|  | clear: func() { x.ClearOneofBytes() }, | 
|  | has:   func() bool { return x.HasOneofBytes() }, | 
|  | }, | 
|  | { | 
|  | fName: "oneof_bool", | 
|  | set:   func() { x.SetOneofBool(true) }, | 
|  | clear: func() { x.ClearOneofBool() }, | 
|  | has:   func() bool { return x.HasOneofBool() }, | 
|  | }, | 
|  | { | 
|  | fName: "oneof_uint64", | 
|  | set:   func() { x.SetOneofUint64(7438109473104) }, | 
|  | clear: func() { x.ClearOneofUint64() }, | 
|  | has:   func() bool { return x.HasOneofUint64() }, | 
|  | }, | 
|  | { | 
|  | fName: "oneof_float", | 
|  | set:   func() { x.SetOneofFloat(3.1415) }, | 
|  | clear: func() { x.ClearOneofFloat() }, | 
|  | has:   func() bool { return x.HasOneofFloat() }, | 
|  | }, | 
|  | { | 
|  | fName: "oneof_double", | 
|  | set:   func() { x.SetOneofDouble(3e+8) }, | 
|  | clear: func() { x.ClearOneofDouble() }, | 
|  | has:   func() bool { return x.HasOneofDouble() }, | 
|  | }, | 
|  | { | 
|  | fName: "oneof_enum", | 
|  | set:   func() { x.SetOneofEnum(testopaquepb.TestAllTypes_BAZ) }, | 
|  | clear: func() { x.ClearOneofEnum() }, | 
|  | has:   func() bool { return x.HasOneofEnum() }, | 
|  | }, | 
|  | } | 
|  |  | 
|  | for i, mv := range tab { | 
|  | x.ClearOneofField() | 
|  | if got, want := x.HasOneofField(), false; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v", got, want) | 
|  | } | 
|  | mv.set() | 
|  |  | 
|  | if got, want := x.HasOneofField(), true; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v (%s)", got, want, mv.fName) | 
|  | } | 
|  | if got, want := mv.has(), true; got != want { | 
|  | t.Errorf("Has on oneof member returned %v, expected %v (%s)", got, want, mv.fName) | 
|  | } | 
|  |  | 
|  | mv.clear() | 
|  | if got, want := x.HasOneofField(), false; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v (%s)", got, want, mv.fName) | 
|  | } | 
|  | if got, want := mv.has(), false; got != want { | 
|  | t.Errorf("Has on oneof member returned %v, expected %v (%s)", got, want, mv.fName) | 
|  | } | 
|  | other := tab[(i+1)%len(tab)] | 
|  | mv.set() | 
|  | other.set() | 
|  |  | 
|  | if got, want := x.HasOneofField(), true; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v (%s)", got, want, mv.fName) | 
|  | } | 
|  | if got, want := mv.has(), false; got != want { | 
|  | t.Errorf("Has on oneof member returned %v, expected %v (%s)", got, want, mv.fName) | 
|  | } | 
|  | other.clear() | 
|  | if got, want := x.HasOneofField(), false; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v (%s)", got, want, mv.fName) | 
|  | } | 
|  | } | 
|  | x.SetOneofUint32(47) | 
|  | if got, want := x.HasOneofField(), true; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v", got, want) | 
|  | } | 
|  | if got, want := x.HasOneofUint32(), true; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v", got, want) | 
|  | } | 
|  | x.SetOneofNestedMessage(nil) | 
|  | if got, want := x.HasOneofField(), false; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v", got, want) | 
|  | } | 
|  | if got, want := x.HasOneofUint32(), false; got != want { | 
|  | t.Errorf("HasOneofUint32 returned %v, expected %v", got, want) | 
|  | } | 
|  | if got, want := x.HasOneofNestedMessage(), false; got != want { | 
|  | t.Errorf("HasOneofNestedMessage returned %v, expected %v", got, want) | 
|  | } | 
|  | x.SetOneofUint32(47) | 
|  | if got, want := x.HasOneofField(), true; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v", got, want) | 
|  | } | 
|  | if got, want := x.HasOneofUint32(), true; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v", got, want) | 
|  | } | 
|  | x.SetOneofBytes(nil) | 
|  | if got, want := x.HasOneofField(), true; got != want { | 
|  | t.Errorf("HasOneofField returned %v, expected %v", got, want) | 
|  | } | 
|  | if got, want := x.HasOneofUint32(), false; got != want { | 
|  | t.Errorf("HasOneofUint32 returned %v, expected %v", got, want) | 
|  | } | 
|  | if got, want := x.HasOneofBytes(), true; got != want { | 
|  | t.Errorf("HasOneofNestedMessage returned %v, expected %v", got, want) | 
|  | } | 
|  | } |