Separate allFieldsAreSet function

This commit is contained in:
Quentin Mc Gaw 2025-02-12 14:31:42 +01:00
parent 5e413e4ab7
commit 6e646046c8
No known key found for this signature in database
GPG key ID: 6B26BAFFE648CAFB

View file

@ -342,7 +342,7 @@ func TestCopyHeader(t *testing.T) {
t.Run("filled_header", func(t *testing.T) { t.Run("filled_header", func(t *testing.T) {
t.Parallel() t.Parallel()
h := Header{ h := &Header{
ParentHash: common.Hash{1}, ParentHash: common.Hash{1},
UncleHash: common.Hash{2}, UncleHash: common.Hash{2},
Coinbase: common.Address{3}, Coinbase: common.Address{3},
@ -368,7 +368,7 @@ func TestCopyHeader(t *testing.T) {
allFieldsAreSet(t, h) allFieldsAreSet(t, h)
cpy := CopyHeader(&h) cpy := CopyHeader(h)
want := &Header{ want := &Header{
ParentHash: common.Hash{1}, ParentHash: common.Hash{1},
@ -396,7 +396,42 @@ func TestCopyHeader(t *testing.T) {
assert.Equal(t, want, cpy) assert.Equal(t, want, cpy)
// Mutate each non-value field to ensure they are not shared // Mutate each non-value field to ensure they are not shared
v := reflect.ValueOf(&h).Elem() fieldsAreDeepCopied(t, h, cpy)
})
}
func ptrTo[T any](x T) *T { return &x }
func allFieldsAreSet(t *testing.T, x any) {
t.Helper()
require.Equal(t, reflect.Ptr.String(), reflect.TypeOf(x).Kind().String(), "x must be a pointer")
v := reflect.ValueOf(x).Elem()
typ := v.Type()
require.Equal(t, reflect.Struct.String(), typ.Kind().String())
for i := 0; i < v.NumField(); i++ {
field := v.Field(i)
fieldName := typ.Field(i).Name
fieldValue := field
if unicode.IsLower(rune(fieldName[0])) { // unexported
require.Falsef(t, field.IsNil(), "field %q is nil", fieldName)
field = reflect.NewAt(field.Type(), unsafe.Pointer(field.UnsafeAddr())).Elem()
fieldValue = field
}
if field.Kind() == reflect.Pointer {
require.NotNilf(t, field.Interface(), "field %q is nil", fieldName)
fieldValue = field.Elem()
}
isSet := fieldValue.IsValid() && !fieldValue.IsZero()
require.True(t, isSet, "field %q is not set", fieldName)
}
}
func fieldsAreDeepCopied(t *testing.T, original, cpy any) {
t.Helper()
require.Equal(t, reflect.Ptr.String(), reflect.TypeOf(original).Kind().String(), "original must be a pointer")
require.Equal(t, reflect.Ptr.String(), reflect.TypeOf(cpy).Kind().String(), "cpy must be a pointer")
v := reflect.ValueOf(original).Elem()
for i := 0; i < v.NumField(); i++ { for i := 0; i < v.NumField(); i++ {
field := v.Field(i) field := v.Field(i)
fieldName := v.Type().Field(i).Name fieldName := v.Type().Field(i).Name
@ -430,32 +465,8 @@ func TestCopyHeader(t *testing.T) {
default: default:
t.Fatalf("unexpected field kind %v for %q", field.Kind(), fieldName) t.Fatalf("unexpected field kind %v for %q", field.Kind(), fieldName)
} }
cpyField := reflect.ValueOf(*cpy).Field(i).Interface()
cpyField := reflect.ValueOf(cpy).Elem().Field(i).Interface()
assert.NotEqualf(t, originalField, cpyField, "field %q", fieldName) assert.NotEqualf(t, originalField, cpyField, "field %q", fieldName)
} }
})
}
func ptrTo[T any](x T) *T { return &x }
func allFieldsAreSet(t *testing.T, x any) {
v := reflect.ValueOf(x)
typ := v.Type()
require.Equal(t, reflect.Struct, typ.Kind())
for i := 0; i < v.NumField(); i++ {
field := v.Field(i)
fieldName := typ.Field(i).Name
fieldValue := field
if unicode.IsLower(rune(fieldName[0])) { // unexported
require.Falsef(t, field.IsNil(), "field %q is nil", fieldName)
field = reflect.NewAt(field.Type(), unsafe.Pointer(field.UnsafeAddr())).Elem()
fieldValue = field
}
if field.Kind() == reflect.Pointer {
require.NotNilf(t, field.Interface(), "field %q is nil", fieldName)
fieldValue = field.Elem()
}
isSet := fieldValue.IsValid() && !fieldValue.IsZero()
require.True(t, isSet, "field %q is not set", fieldName)
}
} }