// 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 reflection_test import ( "testing" testopaquepb "google.golang.org/protobuf/internal/testprotos/testeditions/testeditions_opaque" "google.golang.org/protobuf/proto" ) func TestOpaqueRepeated(t *testing.T) { m := testopaquepb.TestAllTypes_builder{ RepeatedNestedMessage: []*testopaquepb.TestAllTypes_NestedMessage{ testopaquepb.TestAllTypes_NestedMessage_builder{ A: proto.Int32(42), }.Build(), }, }.Build() // Clear the repeated_nested_message field. This should not clear the presence bit. mr := m.ProtoReflect() fd := mr.Descriptor().Fields().ByNumber(48) mr.Clear(fd) if len(m.GetRepeatedNestedMessage()) != 0 { t.Errorf("protoreflect Clear did not empty the repeated field: got %v, expected []", m.GetRepeatedNestedMessage()) } // Append a new submessage to the input field and set its A field to 23. dst := mr.Mutable(fd).List() v := dst.NewElement() dst.Append(v) if len(m.GetRepeatedNestedMessage()) != 1 { t.Fatalf("unexpected number of elements in repeated field: got %v, expected 1", len(m.GetRepeatedNestedMessage())) } m.GetRepeatedNestedMessage()[0].SetA(23) if mr.Get(fd).List().Len() != 1 { t.Fatalf("presence bit (incorrectly) cleared") } }