go-hep.org/x/hep@v0.38.1/groot/rdict/visit_test.go (about)

     1  // Copyright ©2018 The go-hep Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package rdict_test
     6  
     7  import (
     8  	"reflect"
     9  	"testing"
    10  
    11  	"go-hep.org/x/hep/groot/rbytes"
    12  	"go-hep.org/x/hep/groot/rdict"
    13  	"go-hep.org/x/hep/groot/rmeta"
    14  	_ "go-hep.org/x/hep/groot/ztypes"
    15  )
    16  
    17  type VisitT1 struct {
    18  	Name   string
    19  	F64    float64
    20  	ArrF64 [2]float64
    21  	// SliF64 []float64 // FIXME(sbinet)
    22  }
    23  
    24  type VisitT2 struct {
    25  	VisitT1
    26  	ArrF64 [2]float64
    27  }
    28  
    29  func TestVisit(t *testing.T) {
    30  	rdict.StreamerInfos.Add(rdict.StreamerOf(rdict.StreamerInfos, reflect.TypeOf([2]float64{})))
    31  	rdict.StreamerInfos.Add(rdict.StreamerOf(rdict.StreamerInfos, reflect.TypeOf([]float64{})))
    32  
    33  	rdict.StreamerInfos.Add(rdict.StreamerOf(rdict.StreamerInfos, reflect.TypeOf((*VisitT1)(nil)).Elem()))
    34  	rdict.StreamerInfos.Add(rdict.StreamerOf(rdict.StreamerInfos, reflect.TypeOf((*VisitT2)(nil)).Elem()))
    35  
    36  	for _, tc := range []struct {
    37  		si   rbytes.StreamerInfo
    38  		want []string
    39  	}{
    40  		{
    41  			si:   loadSI(t, "TObject"),
    42  			want: []string{"fUniqueID", "fBits"},
    43  		},
    44  		{
    45  			si:   loadSI(t, "TNamed"),
    46  			want: []string{"TObject", "fUniqueID", "fBits", "fName", "fTitle"},
    47  		},
    48  		{
    49  			si:   loadSI(t, "TObjString"),
    50  			want: []string{"TObject", "fUniqueID", "fBits", "fString"},
    51  		},
    52  		{
    53  			si:   loadSI(t, "VisitT1"),
    54  			want: []string{"Name", "F64", "ArrF64"},
    55  		},
    56  		{
    57  			si:   loadSI(t, "VisitT2"),
    58  			want: []string{"VisitT1", "Name", "F64", "ArrF64", "ArrF64"},
    59  		},
    60  		{
    61  			si: rdict.NewStreamerInfo("struct_with_vectors_of_builtins", 1, []rbytes.StreamerElement{
    62  				rdict.NewStreamerSTL("F32s", rmeta.STLvector, rmeta.Float32),
    63  				rdict.NewStreamerSTL("F64s", rmeta.STLvector, rmeta.Float64),
    64  			}),
    65  			want: []string{"F32s", "F64s"},
    66  		},
    67  	} {
    68  		t.Run(tc.si.Name(), func(t *testing.T) {
    69  			var got []string
    70  			err := rdict.Visit(nil, tc.si, func(depth int, se rbytes.StreamerElement) error {
    71  				got = append(got, se.Name())
    72  				return nil
    73  			})
    74  			if err != nil {
    75  				t.Fatalf("could not visit %q: %v", tc.si.Name(), err)
    76  			}
    77  
    78  			if !reflect.DeepEqual(got, tc.want) {
    79  				t.Fatalf("invalid element list.\ngot= %v\nwant=%v\n", got, tc.want)
    80  			}
    81  		})
    82  	}
    83  }
    84  
    85  func loadSI(t *testing.T, name string) rbytes.StreamerInfo {
    86  	t.Helper()
    87  
    88  	si, err := rdict.StreamerInfos.StreamerInfo(name, -1)
    89  	if err != nil {
    90  		t.Fatal(err)
    91  	}
    92  	return si
    93  }