go-hep.org/x/hep@v0.38.1/groot/rdict/gen_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
     6  
     7  import (
     8  	"strings"
     9  	"testing"
    10  
    11  	"go-hep.org/x/hep/internal/diff"
    12  )
    13  
    14  func TestGoName2Cxx(t *testing.T) {
    15  	for _, tc := range []struct {
    16  		name, want string
    17  	}{
    18  		{
    19  			name: "go-hep.org/x/hep/hbook.H1D",
    20  			want: "go_hep_org::x::hep::hbook::H1D",
    21  		},
    22  		{
    23  			name: "go-hep.org/x.H1D",
    24  			want: "go_hep_org::x::H1D",
    25  		},
    26  	} {
    27  		t.Run(tc.name, func(t *testing.T) {
    28  			got := GoName2Cxx(tc.name)
    29  			if tc.want != got {
    30  				t.Fatalf("got=%q, want=%q", got, tc.want)
    31  			}
    32  		})
    33  	}
    34  }
    35  
    36  func TestTypename(t *testing.T) {
    37  	for _, tc := range []struct {
    38  		name  string
    39  		title string
    40  		want  string
    41  		ok    bool
    42  	}{
    43  		{
    44  			name:  "go-hep.org/x/hep/hbook.H1D",
    45  			title: "Go;go-hep.org/x/hep/hbook.H1D",
    46  			want:  "go-hep.org/x/hep/hbook.H1D",
    47  			ok:    true,
    48  		},
    49  		{
    50  			name:  "go-hep.org/x/hep/hbook.H1D",
    51  			title: "",
    52  			want:  "go_hep_org::x::hep::hbook::H1D",
    53  			ok:    false,
    54  		},
    55  		{
    56  			name:  "go-hep.org/x/hep/hbook.H1D",
    57  			title: "Go;hbook.H1D",
    58  			want:  "hbook.H1D",
    59  			ok:    false,
    60  		},
    61  		{
    62  			name:  "go-hep.org/x/hep/hbook.H1D",
    63  			title: "Go; hbook.H1D",
    64  			want:  "hbook.H1D",
    65  			ok:    false,
    66  		},
    67  		{
    68  			name:  "go-hep.org/x/hep/hbook.H1D",
    69  			title: "Go; hbook.H1D ",
    70  			want:  "hbook.H1D",
    71  			ok:    false,
    72  		},
    73  		{
    74  			name:  "go-hep.org/x/hep/hbook.H1D",
    75  			title: "Rust; stl::hbook::H1D",
    76  			want:  "stl::hbook::H1D",
    77  			ok:    false,
    78  		},
    79  	} {
    80  		t.Run(tc.name, func(t *testing.T) {
    81  			name := GoName2Cxx(tc.name)
    82  			got, ok := Typename(name, tc.title)
    83  			if got != tc.want {
    84  				t.Fatalf("got=%q, want=%q", got, tc.want)
    85  			}
    86  			if ok != tc.ok {
    87  				t.Fatalf("got=%q, want=%q, ok=%v (want=%v)", got, tc.want, ok, tc.ok)
    88  			}
    89  		})
    90  	}
    91  
    92  	if _, ok := Typename("go_hep_org::x::hep::groot::redm::HLV", "Go;go-hep.org/x/hep/groot/redm.Event"); ok {
    93  		t.Fatalf("typename did not fail!")
    94  	}
    95  }
    96  
    97  func TestROOTComment(t *testing.T) {
    98  	var g genGoType
    99  	for _, tc := range []struct {
   100  		title string
   101  		meta  string
   102  		doc   string
   103  	}{
   104  		{
   105  			title: "A comment",
   106  			meta:  "",
   107  			doc:   "A comment",
   108  		},
   109  		{
   110  			title: " A comment ",
   111  			meta:  "",
   112  			doc:   "A comment",
   113  		},
   114  		{
   115  			title: "[N]",
   116  			meta:  "[N]",
   117  			doc:   "",
   118  		},
   119  		{
   120  			title: "[N] this is an array. ",
   121  			meta:  "[N]",
   122  			doc:   "this is an array.",
   123  		},
   124  		{
   125  			title: "[-1,1,2]",
   126  			meta:  "[-1,1,2]",
   127  			doc:   "",
   128  		},
   129  		{
   130  			title: "[-1,1,2] a Double32 with min,max,factor",
   131  			meta:  "[-1,1,2]",
   132  			doc:   "a Double32 with min,max,factor",
   133  		},
   134  		{
   135  			title: "[fN][-1,1,2] an array of Double32-s with min,max,factor",
   136  			meta:  "[fN][-1,1,2]",
   137  			doc:   "an array of Double32-s with min,max,factor",
   138  		},
   139  	} {
   140  		t.Run(tc.title, func(t *testing.T) {
   141  			meta, doc := g.rcomment(tc.title)
   142  			if meta != tc.meta {
   143  				t.Fatalf("meta: got=%q, want=%q", meta, tc.meta)
   144  			}
   145  			if doc != tc.doc {
   146  				t.Fatalf("doc: got=%q, want=%q", doc, tc.doc)
   147  			}
   148  		})
   149  	}
   150  }
   151  
   152  func TestGenCxxStreamerInfo(t *testing.T) {
   153  	for _, tc := range []struct {
   154  		name string
   155  		want string
   156  	}{
   157  		{
   158  			name: "TObject",
   159  			want: `NewCxxStreamerInfo("TObject", 1, 0x901bc02d, []rbytes.StreamerElement{
   160  	&StreamerBasicType{StreamerElement: Element{
   161  		Name:   *rbase.NewNamed("fUniqueID", "object unique identifier"),
   162  		Type:   rmeta.UInt,
   163  		Size:   4,
   164  		ArrLen: 0,
   165  		ArrDim: 0,
   166  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   167  		Offset: 0,
   168  		EName:  "unsigned int",
   169  		XMin:   0.000000,
   170  		XMax:   0.000000,
   171  		Factor: 0.000000,
   172  	}.New()},
   173  	&StreamerBasicType{StreamerElement: Element{
   174  		Name:   *rbase.NewNamed("fBits", "bit field status word"),
   175  		Type:   rmeta.Bits,
   176  		Size:   4,
   177  		ArrLen: 0,
   178  		ArrDim: 0,
   179  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   180  		Offset: 0,
   181  		EName:  "unsigned int",
   182  		XMin:   0.000000,
   183  		XMax:   0.000000,
   184  		Factor: 0.000000,
   185  	}.New()},
   186  })`,
   187  		},
   188  		{
   189  			name: "TObjString",
   190  			want: `NewCxxStreamerInfo("TObjString", 1, 0x9c8e4800, []rbytes.StreamerElement{
   191  	NewStreamerBase(Element{
   192  		Name:   *rbase.NewNamed("TObject", "Basic ROOT object"),
   193  		Type:   rmeta.Base,
   194  		Size:   0,
   195  		ArrLen: 0,
   196  		ArrDim: 0,
   197  		MaxIdx: [5]int32{0, -1877229523, 0, 0, 0},
   198  		Offset: 0,
   199  		EName:  "BASE",
   200  		XMin:   0.000000,
   201  		XMax:   0.000000,
   202  		Factor: 0.000000,
   203  	}.New(), 1),
   204  	&StreamerString{StreamerElement: Element{
   205  		Name:   *rbase.NewNamed("fString", "wrapped TString"),
   206  		Type:   rmeta.TString,
   207  		Size:   24,
   208  		ArrLen: 0,
   209  		ArrDim: 0,
   210  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   211  		Offset: 0,
   212  		EName:  "TString",
   213  		XMin:   0.000000,
   214  		XMax:   0.000000,
   215  		Factor: 0.000000,
   216  	}.New()},
   217  })`,
   218  		},
   219  		{
   220  			name: "TArray",
   221  			want: `NewCxxStreamerInfo("TArray", 1, 0x7021b2, []rbytes.StreamerElement{
   222  	&StreamerBasicType{StreamerElement: Element{
   223  		Name:   *rbase.NewNamed("fN", "Number of array elements"),
   224  		Type:   rmeta.Int,
   225  		Size:   4,
   226  		ArrLen: 0,
   227  		ArrDim: 0,
   228  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   229  		Offset: 0,
   230  		EName:  "int",
   231  		XMin:   0.000000,
   232  		XMax:   0.000000,
   233  		Factor: 0.000000,
   234  	}.New()},
   235  })`,
   236  		},
   237  		{
   238  			name: "TArrayC",
   239  			want: `NewCxxStreamerInfo("TArrayC", 1, 0xae879936, []rbytes.StreamerElement{
   240  	NewStreamerBase(Element{
   241  		Name:   *rbase.NewNamed("TArray", "Abstract array base class"),
   242  		Type:   rmeta.Base,
   243  		Size:   0,
   244  		ArrLen: 0,
   245  		ArrDim: 0,
   246  		MaxIdx: [5]int32{0, 7348658, 0, 0, 0},
   247  		Offset: 0,
   248  		EName:  "BASE",
   249  		XMin:   0.000000,
   250  		XMax:   0.000000,
   251  		Factor: 0.000000,
   252  	}.New(), 1),
   253  	NewStreamerBasicPointer(Element{
   254  		Name:   *rbase.NewNamed("fArray", "[fN] Array of fN chars"),
   255  		Type:   41,
   256  		Size:   1,
   257  		ArrLen: 0,
   258  		ArrDim: 0,
   259  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   260  		Offset: 0,
   261  		EName:  "char*",
   262  		XMin:   0.000000,
   263  		XMax:   0.000000,
   264  		Factor: 0.000000,
   265  	}.New(), 1, "fN", "TArray"),
   266  })`,
   267  		},
   268  		{
   269  			name: "TTree",
   270  			want: `NewCxxStreamerInfo("TTree", 20, 0x7264e07f, []rbytes.StreamerElement{
   271  	NewStreamerBase(Element{
   272  		Name:   *rbase.NewNamed("TNamed", "The basis for a named object (name, title)"),
   273  		Type:   rmeta.Base,
   274  		Size:   0,
   275  		ArrLen: 0,
   276  		ArrDim: 0,
   277  		MaxIdx: [5]int32{0, -541636036, 0, 0, 0},
   278  		Offset: 0,
   279  		EName:  "BASE",
   280  		XMin:   0.000000,
   281  		XMax:   0.000000,
   282  		Factor: 0.000000,
   283  	}.New(), 1),
   284  	NewStreamerBase(Element{
   285  		Name:   *rbase.NewNamed("TAttLine", "Line attributes"),
   286  		Type:   rmeta.Base,
   287  		Size:   0,
   288  		ArrLen: 0,
   289  		ArrDim: 0,
   290  		MaxIdx: [5]int32{0, -1811462839, 0, 0, 0},
   291  		Offset: 0,
   292  		EName:  "BASE",
   293  		XMin:   0.000000,
   294  		XMax:   0.000000,
   295  		Factor: 0.000000,
   296  	}.New(), 2),
   297  	NewStreamerBase(Element{
   298  		Name:   *rbase.NewNamed("TAttFill", "Fill area attributes"),
   299  		Type:   rmeta.Base,
   300  		Size:   0,
   301  		ArrLen: 0,
   302  		ArrDim: 0,
   303  		MaxIdx: [5]int32{0, -2545006, 0, 0, 0},
   304  		Offset: 0,
   305  		EName:  "BASE",
   306  		XMin:   0.000000,
   307  		XMax:   0.000000,
   308  		Factor: 0.000000,
   309  	}.New(), 2),
   310  	NewStreamerBase(Element{
   311  		Name:   *rbase.NewNamed("TAttMarker", "Marker attributes"),
   312  		Type:   rmeta.Base,
   313  		Size:   0,
   314  		ArrLen: 0,
   315  		ArrDim: 0,
   316  		MaxIdx: [5]int32{0, 689802220, 0, 0, 0},
   317  		Offset: 0,
   318  		EName:  "BASE",
   319  		XMin:   0.000000,
   320  		XMax:   0.000000,
   321  		Factor: 0.000000,
   322  	}.New(), 3),
   323  	&StreamerBasicType{StreamerElement: Element{
   324  		Name:   *rbase.NewNamed("fEntries", "Number of entries"),
   325  		Type:   rmeta.Long64,
   326  		Size:   8,
   327  		ArrLen: 0,
   328  		ArrDim: 0,
   329  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   330  		Offset: 0,
   331  		EName:  "Long64_t",
   332  		XMin:   0.000000,
   333  		XMax:   0.000000,
   334  		Factor: 0.000000,
   335  	}.New()},
   336  	&StreamerBasicType{StreamerElement: Element{
   337  		Name:   *rbase.NewNamed("fTotBytes", "Total number of bytes in all branches before compression"),
   338  		Type:   rmeta.Long64,
   339  		Size:   8,
   340  		ArrLen: 0,
   341  		ArrDim: 0,
   342  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   343  		Offset: 0,
   344  		EName:  "Long64_t",
   345  		XMin:   0.000000,
   346  		XMax:   0.000000,
   347  		Factor: 0.000000,
   348  	}.New()},
   349  	&StreamerBasicType{StreamerElement: Element{
   350  		Name:   *rbase.NewNamed("fZipBytes", "Total number of bytes in all branches after compression"),
   351  		Type:   rmeta.Long64,
   352  		Size:   8,
   353  		ArrLen: 0,
   354  		ArrDim: 0,
   355  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   356  		Offset: 0,
   357  		EName:  "Long64_t",
   358  		XMin:   0.000000,
   359  		XMax:   0.000000,
   360  		Factor: 0.000000,
   361  	}.New()},
   362  	&StreamerBasicType{StreamerElement: Element{
   363  		Name:   *rbase.NewNamed("fSavedBytes", "Number of autosaved bytes"),
   364  		Type:   rmeta.Long64,
   365  		Size:   8,
   366  		ArrLen: 0,
   367  		ArrDim: 0,
   368  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   369  		Offset: 0,
   370  		EName:  "Long64_t",
   371  		XMin:   0.000000,
   372  		XMax:   0.000000,
   373  		Factor: 0.000000,
   374  	}.New()},
   375  	&StreamerBasicType{StreamerElement: Element{
   376  		Name:   *rbase.NewNamed("fFlushedBytes", "Number of auto-flushed bytes"),
   377  		Type:   rmeta.Long64,
   378  		Size:   8,
   379  		ArrLen: 0,
   380  		ArrDim: 0,
   381  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   382  		Offset: 0,
   383  		EName:  "Long64_t",
   384  		XMin:   0.000000,
   385  		XMax:   0.000000,
   386  		Factor: 0.000000,
   387  	}.New()},
   388  	&StreamerBasicType{StreamerElement: Element{
   389  		Name:   *rbase.NewNamed("fWeight", "Tree weight (see TTree::SetWeight)"),
   390  		Type:   rmeta.Double,
   391  		Size:   8,
   392  		ArrLen: 0,
   393  		ArrDim: 0,
   394  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   395  		Offset: 0,
   396  		EName:  "double",
   397  		XMin:   0.000000,
   398  		XMax:   0.000000,
   399  		Factor: 0.000000,
   400  	}.New()},
   401  	&StreamerBasicType{StreamerElement: Element{
   402  		Name:   *rbase.NewNamed("fTimerInterval", "Timer interval in milliseconds"),
   403  		Type:   rmeta.Int,
   404  		Size:   4,
   405  		ArrLen: 0,
   406  		ArrDim: 0,
   407  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   408  		Offset: 0,
   409  		EName:  "int",
   410  		XMin:   0.000000,
   411  		XMax:   0.000000,
   412  		Factor: 0.000000,
   413  	}.New()},
   414  	&StreamerBasicType{StreamerElement: Element{
   415  		Name:   *rbase.NewNamed("fScanField", "Number of runs before prompting in Scan"),
   416  		Type:   rmeta.Int,
   417  		Size:   4,
   418  		ArrLen: 0,
   419  		ArrDim: 0,
   420  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   421  		Offset: 0,
   422  		EName:  "int",
   423  		XMin:   0.000000,
   424  		XMax:   0.000000,
   425  		Factor: 0.000000,
   426  	}.New()},
   427  	&StreamerBasicType{StreamerElement: Element{
   428  		Name:   *rbase.NewNamed("fUpdate", "Update frequency for EntryLoop"),
   429  		Type:   rmeta.Int,
   430  		Size:   4,
   431  		ArrLen: 0,
   432  		ArrDim: 0,
   433  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   434  		Offset: 0,
   435  		EName:  "int",
   436  		XMin:   0.000000,
   437  		XMax:   0.000000,
   438  		Factor: 0.000000,
   439  	}.New()},
   440  	&StreamerBasicType{StreamerElement: Element{
   441  		Name:   *rbase.NewNamed("fDefaultEntryOffsetLen", "Initial Length of fEntryOffset table in the basket buffers"),
   442  		Type:   rmeta.Int,
   443  		Size:   4,
   444  		ArrLen: 0,
   445  		ArrDim: 0,
   446  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   447  		Offset: 0,
   448  		EName:  "int",
   449  		XMin:   0.000000,
   450  		XMax:   0.000000,
   451  		Factor: 0.000000,
   452  	}.New()},
   453  	&StreamerBasicType{StreamerElement: Element{
   454  		Name:   *rbase.NewNamed("fNClusterRange", "Number of Cluster range in addition to the one defined by 'AutoFlush'"),
   455  		Type:   rmeta.Counter,
   456  		Size:   4,
   457  		ArrLen: 0,
   458  		ArrDim: 0,
   459  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   460  		Offset: 0,
   461  		EName:  "int",
   462  		XMin:   0.000000,
   463  		XMax:   0.000000,
   464  		Factor: 0.000000,
   465  	}.New()},
   466  	&StreamerBasicType{StreamerElement: Element{
   467  		Name:   *rbase.NewNamed("fMaxEntries", "Maximum number of entries in case of circular buffers"),
   468  		Type:   rmeta.Long64,
   469  		Size:   8,
   470  		ArrLen: 0,
   471  		ArrDim: 0,
   472  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   473  		Offset: 0,
   474  		EName:  "Long64_t",
   475  		XMin:   0.000000,
   476  		XMax:   0.000000,
   477  		Factor: 0.000000,
   478  	}.New()},
   479  	&StreamerBasicType{StreamerElement: Element{
   480  		Name:   *rbase.NewNamed("fMaxEntryLoop", "Maximum number of entries to process"),
   481  		Type:   rmeta.Long64,
   482  		Size:   8,
   483  		ArrLen: 0,
   484  		ArrDim: 0,
   485  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   486  		Offset: 0,
   487  		EName:  "Long64_t",
   488  		XMin:   0.000000,
   489  		XMax:   0.000000,
   490  		Factor: 0.000000,
   491  	}.New()},
   492  	&StreamerBasicType{StreamerElement: Element{
   493  		Name:   *rbase.NewNamed("fMaxVirtualSize", "Maximum total size of buffers kept in memory"),
   494  		Type:   rmeta.Long64,
   495  		Size:   8,
   496  		ArrLen: 0,
   497  		ArrDim: 0,
   498  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   499  		Offset: 0,
   500  		EName:  "Long64_t",
   501  		XMin:   0.000000,
   502  		XMax:   0.000000,
   503  		Factor: 0.000000,
   504  	}.New()},
   505  	&StreamerBasicType{StreamerElement: Element{
   506  		Name:   *rbase.NewNamed("fAutoSave", "Autosave tree when fAutoSave entries written or -fAutoSave (compressed) bytes produced"),
   507  		Type:   rmeta.Long64,
   508  		Size:   8,
   509  		ArrLen: 0,
   510  		ArrDim: 0,
   511  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   512  		Offset: 0,
   513  		EName:  "Long64_t",
   514  		XMin:   0.000000,
   515  		XMax:   0.000000,
   516  		Factor: 0.000000,
   517  	}.New()},
   518  	&StreamerBasicType{StreamerElement: Element{
   519  		Name:   *rbase.NewNamed("fAutoFlush", "Auto-flush tree when fAutoFlush entries written or -fAutoFlush (compressed) bytes produced"),
   520  		Type:   rmeta.Long64,
   521  		Size:   8,
   522  		ArrLen: 0,
   523  		ArrDim: 0,
   524  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   525  		Offset: 0,
   526  		EName:  "Long64_t",
   527  		XMin:   0.000000,
   528  		XMax:   0.000000,
   529  		Factor: 0.000000,
   530  	}.New()},
   531  	&StreamerBasicType{StreamerElement: Element{
   532  		Name:   *rbase.NewNamed("fEstimate", "Number of entries to estimate histogram limits"),
   533  		Type:   rmeta.Long64,
   534  		Size:   8,
   535  		ArrLen: 0,
   536  		ArrDim: 0,
   537  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   538  		Offset: 0,
   539  		EName:  "Long64_t",
   540  		XMin:   0.000000,
   541  		XMax:   0.000000,
   542  		Factor: 0.000000,
   543  	}.New()},
   544  	NewStreamerBasicPointer(Element{
   545  		Name:   *rbase.NewNamed("fClusterRangeEnd", "[fNClusterRange] Last entry of a cluster range."),
   546  		Type:   56,
   547  		Size:   8,
   548  		ArrLen: 0,
   549  		ArrDim: 0,
   550  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   551  		Offset: 0,
   552  		EName:  "Long64_t*",
   553  		XMin:   0.000000,
   554  		XMax:   0.000000,
   555  		Factor: 0.000000,
   556  	}.New(), 20, "fNClusterRange", "TTree"),
   557  	NewStreamerBasicPointer(Element{
   558  		Name:   *rbase.NewNamed("fClusterSize", "[fNClusterRange] Number of entries in each cluster for a given range."),
   559  		Type:   56,
   560  		Size:   8,
   561  		ArrLen: 0,
   562  		ArrDim: 0,
   563  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   564  		Offset: 0,
   565  		EName:  "Long64_t*",
   566  		XMin:   0.000000,
   567  		XMax:   0.000000,
   568  		Factor: 0.000000,
   569  	}.New(), 20, "fNClusterRange", "TTree"),
   570  	&StreamerObjectAny{StreamerElement: Element{
   571  		Name:   *rbase.NewNamed("fIOFeatures", "IO features to define for newly-written baskets and branches."),
   572  		Type:   rmeta.Any,
   573  		Size:   1,
   574  		ArrLen: 0,
   575  		ArrDim: 0,
   576  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   577  		Offset: 0,
   578  		EName:  "ROOT::TIOFeatures",
   579  		XMin:   0.000000,
   580  		XMax:   0.000000,
   581  		Factor: 0.000000,
   582  	}.New()},
   583  	&StreamerObject{StreamerElement: Element{
   584  		Name:   *rbase.NewNamed("fBranches", "List of Branches"),
   585  		Type:   rmeta.Object,
   586  		Size:   64,
   587  		ArrLen: 0,
   588  		ArrDim: 0,
   589  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   590  		Offset: 0,
   591  		EName:  "TObjArray",
   592  		XMin:   0.000000,
   593  		XMax:   0.000000,
   594  		Factor: 0.000000,
   595  	}.New()},
   596  	&StreamerObject{StreamerElement: Element{
   597  		Name:   *rbase.NewNamed("fLeaves", "Direct pointers to individual branch leaves"),
   598  		Type:   rmeta.Object,
   599  		Size:   64,
   600  		ArrLen: 0,
   601  		ArrDim: 0,
   602  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   603  		Offset: 0,
   604  		EName:  "TObjArray",
   605  		XMin:   0.000000,
   606  		XMax:   0.000000,
   607  		Factor: 0.000000,
   608  	}.New()},
   609  	&StreamerObjectPointer{StreamerElement: Element{
   610  		Name:   *rbase.NewNamed("fAliases", "List of aliases for expressions based on the tree branches."),
   611  		Type:   rmeta.ObjectP,
   612  		Size:   8,
   613  		ArrLen: 0,
   614  		ArrDim: 0,
   615  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   616  		Offset: 0,
   617  		EName:  "TList*",
   618  		XMin:   0.000000,
   619  		XMax:   0.000000,
   620  		Factor: 0.000000,
   621  	}.New()},
   622  	&StreamerObjectAny{StreamerElement: Element{
   623  		Name:   *rbase.NewNamed("fIndexValues", "Sorted index values"),
   624  		Type:   rmeta.Any,
   625  		Size:   24,
   626  		ArrLen: 0,
   627  		ArrDim: 0,
   628  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   629  		Offset: 0,
   630  		EName:  "TArrayD",
   631  		XMin:   0.000000,
   632  		XMax:   0.000000,
   633  		Factor: 0.000000,
   634  	}.New()},
   635  	&StreamerObjectAny{StreamerElement: Element{
   636  		Name:   *rbase.NewNamed("fIndex", "Index of sorted values"),
   637  		Type:   rmeta.Any,
   638  		Size:   24,
   639  		ArrLen: 0,
   640  		ArrDim: 0,
   641  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   642  		Offset: 0,
   643  		EName:  "TArrayI",
   644  		XMin:   0.000000,
   645  		XMax:   0.000000,
   646  		Factor: 0.000000,
   647  	}.New()},
   648  	&StreamerObjectPointer{StreamerElement: Element{
   649  		Name:   *rbase.NewNamed("fTreeIndex", "Pointer to the tree Index (if any)"),
   650  		Type:   rmeta.ObjectP,
   651  		Size:   8,
   652  		ArrLen: 0,
   653  		ArrDim: 0,
   654  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   655  		Offset: 0,
   656  		EName:  "TVirtualIndex*",
   657  		XMin:   0.000000,
   658  		XMax:   0.000000,
   659  		Factor: 0.000000,
   660  	}.New()},
   661  	&StreamerObjectPointer{StreamerElement: Element{
   662  		Name:   *rbase.NewNamed("fFriends", "pointer to list of friend elements"),
   663  		Type:   rmeta.ObjectP,
   664  		Size:   8,
   665  		ArrLen: 0,
   666  		ArrDim: 0,
   667  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   668  		Offset: 0,
   669  		EName:  "TList*",
   670  		XMin:   0.000000,
   671  		XMax:   0.000000,
   672  		Factor: 0.000000,
   673  	}.New()},
   674  	&StreamerObjectPointer{StreamerElement: Element{
   675  		Name:   *rbase.NewNamed("fUserInfo", "pointer to a list of user objects associated to this Tree"),
   676  		Type:   rmeta.ObjectP,
   677  		Size:   8,
   678  		ArrLen: 0,
   679  		ArrDim: 0,
   680  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   681  		Offset: 0,
   682  		EName:  "TList*",
   683  		XMin:   0.000000,
   684  		XMax:   0.000000,
   685  		Factor: 0.000000,
   686  	}.New()},
   687  	&StreamerObjectPointer{StreamerElement: Element{
   688  		Name:   *rbase.NewNamed("fBranchRef", "Branch supporting the TRefTable (if any)"),
   689  		Type:   rmeta.ObjectP,
   690  		Size:   8,
   691  		ArrLen: 0,
   692  		ArrDim: 0,
   693  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   694  		Offset: 0,
   695  		EName:  "TBranchRef*",
   696  		XMin:   0.000000,
   697  		XMax:   0.000000,
   698  		Factor: 0.000000,
   699  	}.New()},
   700  })`,
   701  		},
   702  		{
   703  			name: "TRefTable",
   704  			want: `NewCxxStreamerInfo("TRefTable", 3, 0x8c895b85, []rbytes.StreamerElement{
   705  	NewStreamerBase(Element{
   706  		Name:   *rbase.NewNamed("TObject", "Basic ROOT object"),
   707  		Type:   rmeta.Base,
   708  		Size:   0,
   709  		ArrLen: 0,
   710  		ArrDim: 0,
   711  		MaxIdx: [5]int32{0, -1877229523, 0, 0, 0},
   712  		Offset: 0,
   713  		EName:  "BASE",
   714  		XMin:   0.000000,
   715  		XMax:   0.000000,
   716  		Factor: 0.000000,
   717  	}.New(), 1),
   718  	&StreamerBasicType{StreamerElement: Element{
   719  		Name:   *rbase.NewNamed("fSize", "dummy for backward compatibility"),
   720  		Type:   rmeta.Int,
   721  		Size:   4,
   722  		ArrLen: 0,
   723  		ArrDim: 0,
   724  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   725  		Offset: 0,
   726  		EName:  "int",
   727  		XMin:   0.000000,
   728  		XMax:   0.000000,
   729  		Factor: 0.000000,
   730  	}.New()},
   731  	&StreamerObjectPointer{StreamerElement: Element{
   732  		Name:   *rbase.NewNamed("fParents", "array of Parent objects  (eg TTree branch) holding the referenced objects"),
   733  		Type:   rmeta.ObjectP,
   734  		Size:   8,
   735  		ArrLen: 0,
   736  		ArrDim: 0,
   737  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   738  		Offset: 0,
   739  		EName:  "TObjArray*",
   740  		XMin:   0.000000,
   741  		XMax:   0.000000,
   742  		Factor: 0.000000,
   743  	}.New()},
   744  	&StreamerObjectPointer{StreamerElement: Element{
   745  		Name:   *rbase.NewNamed("fOwner", "Object owning this TRefTable"),
   746  		Type:   rmeta.ObjectP,
   747  		Size:   8,
   748  		ArrLen: 0,
   749  		ArrDim: 0,
   750  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   751  		Offset: 0,
   752  		EName:  "TObject*",
   753  		XMin:   0.000000,
   754  		XMax:   0.000000,
   755  		Factor: 0.000000,
   756  	}.New()},
   757  	NewCxxStreamerSTL(Element{
   758  		Name:   *rbase.NewNamed("fProcessGUIDs", "UUIDs of TProcessIDs used in fParentIDs"),
   759  		Type:   rmeta.Streamer,
   760  		Size:   24,
   761  		ArrLen: 0,
   762  		ArrDim: 0,
   763  		MaxIdx: [5]int32{0, 0, 0, 0, 0},
   764  		Offset: 0,
   765  		EName:  "vector<string>",
   766  		XMin:   0.000000,
   767  		XMax:   0.000000,
   768  		Factor: 0.000000,
   769  	}.New(), 1, 61),
   770  })`,
   771  		},
   772  	} {
   773  		t.Run(tc.name, func(t *testing.T) {
   774  			got := new(strings.Builder)
   775  			si, ok := StreamerInfos.Get(tc.name, -1)
   776  			if !ok {
   777  				t.Fatalf("could not get streamer for %q", tc.name)
   778  			}
   779  			err := GenCxxStreamerInfo(got, si, true)
   780  			if err != nil {
   781  				t.Fatalf("could not generate textual representation of %q: %+v", tc.name, err)
   782  			}
   783  
   784  			if got, want := got.String(), tc.want; got != want {
   785  				t.Fatalf("invalid streamer representation for %q:\n%s", tc.name, diff.Format(got, want))
   786  			}
   787  		})
   788  	}
   789  }