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 }