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 }