| // 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) |
| } |
| } |