go-hep.org/x/hep@v0.38.1/groot/rtree/tree_test.go (about) 1 // Copyright ©2017 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 rtree 6 7 import ( 8 "fmt" 9 "path/filepath" 10 "reflect" 11 "testing" 12 13 "go-hep.org/x/hep/groot/internal/rtests" 14 "go-hep.org/x/hep/groot/riofs" 15 _ "go-hep.org/x/hep/groot/riofs/plugin/http" 16 _ "go-hep.org/x/hep/groot/riofs/plugin/xrootd" 17 ) 18 19 func TestFlatTree(t *testing.T) { 20 t.Parallel() 21 22 f, err := riofs.Open("../testdata/small-flat-tree.root") 23 if err != nil { 24 t.Fatal(err.Error()) 25 } 26 defer f.Close() 27 28 obj, err := f.Get("tree") 29 if err != nil { 30 t.Fatal(err) 31 } 32 33 tree := obj.(Tree) 34 if got, want := tree.Name(), "tree"; got != want { 35 t.Fatalf("tree.Name: got=%q. want=%q", got, want) 36 } 37 38 for _, table := range []struct { 39 test string 40 value string 41 want string 42 }{ 43 {"Name", tree.Name(), "tree"}, // name when created 44 {"Title", tree.Title(), "my tree title"}, 45 {"Class", tree.Class(), "TTree"}, 46 } { 47 if table.value != table.want { 48 t.Fatalf("%v: got=[%v]. want=[%v]", table.test, table.value, table.want) 49 } 50 } 51 52 entries := tree.Entries() 53 if got, want := entries, int64(100); got != want { 54 t.Fatalf("tree.Entries: got=%v. want=%v", got, want) 55 } 56 } 57 58 type EventType struct { 59 Evt EventData `groot:"evt"` 60 } 61 62 type Vec3 struct { 63 X int32 `groot:"Px"` 64 Y float64 `groot:"Py"` 65 Z int32 `groot:"Pz"` 66 } 67 68 type EventData struct { 69 Beg string `groot:"Beg"` 70 I16 int16 `groot:"I16"` 71 I32 int32 `groot:"I32"` 72 I64 int64 `groot:"I64"` 73 U16 uint16 `groot:"U16"` 74 U32 uint32 `groot:"U32"` 75 U64 uint64 `groot:"U64"` 76 F32 float32 `groot:"F32"` 77 F64 float64 `groot:"F64"` 78 Str string `groot:"Str"` 79 Vec Vec3 `groot:"P3"` 80 ArrI16 [10]int16 `groot:"ArrayI16[10]"` 81 ArrI32 [10]int32 `groot:"ArrayI32[10]"` 82 ArrI64 [10]int64 `groot:"ArrayI64[10]"` 83 ArrU16 [10]uint16 `groot:"ArrayU16[10]"` 84 ArrU32 [10]uint32 `groot:"ArrayU32[10]"` 85 ArrU64 [10]uint64 `groot:"ArrayU64[10]"` 86 ArrF32 [10]float32 `groot:"ArrayF32[10]"` 87 ArrF64 [10]float64 `groot:"ArrayF64[10]"` 88 N int32 `groot:"N"` 89 SliI16 []int16 `groot:"SliceI16[N]"` 90 SliI32 []int32 `groot:"SliceI32[N]"` 91 SliI64 []int64 `groot:"SliceI64[N]"` 92 SliU16 []uint16 `groot:"SliceU16[N]"` 93 SliU32 []uint32 `groot:"SliceU32[N]"` 94 SliU64 []uint64 `groot:"SliceU64[N]"` 95 SliF32 []float32 `groot:"SliceF32[N]"` 96 SliF64 []float64 `groot:"SliceF64[N]"` 97 StdStr string `groot:"StdStr"` 98 VecI16 []int16 `groot:"StlVecI16"` 99 VecI32 []int32 `groot:"StlVecI32"` 100 VecI64 []int64 `groot:"StlVecI64"` 101 VecU16 []uint16 `groot:"StlVecU16"` 102 VecU32 []uint32 `groot:"StlVecU32"` 103 VecU64 []uint64 `groot:"StlVecU64"` 104 VecF32 []float32 `groot:"StlVecF32"` 105 VecF64 []float64 `groot:"StlVecF64"` 106 VecStr []string `groot:"StlVecStr"` 107 End string `groot:"End"` 108 } 109 110 func newEventType() *EventType { 111 var data EventType 112 data.Evt.SliI16 = make([]int16, int(data.Evt.N)) 113 data.Evt.SliI32 = make([]int32, int(data.Evt.N)) 114 data.Evt.SliI64 = make([]int64, int(data.Evt.N)) 115 data.Evt.SliU16 = make([]uint16, int(data.Evt.N)) 116 data.Evt.SliU32 = make([]uint32, int(data.Evt.N)) 117 data.Evt.SliU64 = make([]uint64, int(data.Evt.N)) 118 data.Evt.SliF32 = make([]float32, int(data.Evt.N)) 119 data.Evt.SliF64 = make([]float64, int(data.Evt.N)) 120 121 data.Evt.VecI16 = make([]int16, int(data.Evt.N)) 122 data.Evt.VecI32 = make([]int32, int(data.Evt.N)) 123 data.Evt.VecI64 = make([]int64, int(data.Evt.N)) 124 data.Evt.VecU16 = make([]uint16, int(data.Evt.N)) 125 data.Evt.VecU32 = make([]uint32, int(data.Evt.N)) 126 data.Evt.VecU64 = make([]uint64, int(data.Evt.N)) 127 data.Evt.VecF32 = make([]float32, int(data.Evt.N)) 128 data.Evt.VecF64 = make([]float64, int(data.Evt.N)) 129 data.Evt.VecStr = make([]string, int(data.Evt.N)) 130 131 return &data 132 } 133 134 func (EventType) want(i int64) EventType { 135 var data EventType 136 data.Evt.I16 = int16(i) 137 data.Evt.I32 = int32(i) 138 data.Evt.I64 = int64(i) 139 data.Evt.U16 = uint16(i) 140 data.Evt.U32 = uint32(i) 141 data.Evt.U64 = uint64(i) 142 data.Evt.F32 = float32(i) 143 data.Evt.F64 = float64(i) 144 data.Evt.Str = fmt.Sprintf("evt-%03d", i) 145 data.Evt.Vec = Vec3{ 146 X: int32(i - 1), 147 Y: float64(i), 148 Z: int32(i - 1), 149 } 150 data.Evt.StdStr = fmt.Sprintf("std-%03d", i) 151 for ii := range data.Evt.ArrI32 { 152 data.Evt.ArrI16[ii] = int16(i) 153 data.Evt.ArrI32[ii] = int32(i) 154 data.Evt.ArrI64[ii] = int64(i) 155 data.Evt.ArrU16[ii] = uint16(i) 156 data.Evt.ArrU32[ii] = uint32(i) 157 data.Evt.ArrU64[ii] = uint64(i) 158 data.Evt.ArrF32[ii] = float32(i) 159 data.Evt.ArrF64[ii] = float64(i) 160 } 161 data.Evt.N = int32(i) % 10 162 data.Evt.SliI16 = make([]int16, int(data.Evt.N)) 163 data.Evt.SliI32 = make([]int32, int(data.Evt.N)) 164 data.Evt.SliI64 = make([]int64, int(data.Evt.N)) 165 data.Evt.SliU16 = make([]uint16, int(data.Evt.N)) 166 data.Evt.SliU32 = make([]uint32, int(data.Evt.N)) 167 data.Evt.SliU64 = make([]uint64, int(data.Evt.N)) 168 data.Evt.SliF32 = make([]float32, int(data.Evt.N)) 169 data.Evt.SliF64 = make([]float64, int(data.Evt.N)) 170 for ii := range int(data.Evt.N) { 171 data.Evt.SliI16[ii] = int16(i) 172 data.Evt.SliI32[ii] = int32(i) 173 data.Evt.SliI64[ii] = int64(i) 174 data.Evt.SliU16[ii] = uint16(i) 175 data.Evt.SliU32[ii] = uint32(i) 176 data.Evt.SliU64[ii] = uint64(i) 177 data.Evt.SliF32[ii] = float32(i) 178 data.Evt.SliF64[ii] = float64(i) 179 } 180 181 data.Evt.Beg = fmt.Sprintf("beg-%03d", i) 182 data.Evt.VecI16 = make([]int16, int(data.Evt.N)) 183 data.Evt.VecI32 = make([]int32, int(data.Evt.N)) 184 data.Evt.VecI64 = make([]int64, int(data.Evt.N)) 185 data.Evt.VecU16 = make([]uint16, int(data.Evt.N)) 186 data.Evt.VecU32 = make([]uint32, int(data.Evt.N)) 187 data.Evt.VecU64 = make([]uint64, int(data.Evt.N)) 188 data.Evt.VecF32 = make([]float32, int(data.Evt.N)) 189 data.Evt.VecF64 = make([]float64, int(data.Evt.N)) 190 data.Evt.VecStr = make([]string, int(data.Evt.N)) 191 for ii := range int(data.Evt.N) { 192 data.Evt.VecI16[ii] = int16(i) 193 data.Evt.VecI32[ii] = int32(i) 194 data.Evt.VecI64[ii] = int64(i) 195 data.Evt.VecU16[ii] = uint16(i) 196 data.Evt.VecU32[ii] = uint32(i) 197 data.Evt.VecU64[ii] = uint64(i) 198 data.Evt.VecF32[ii] = float32(i) 199 data.Evt.VecF64[ii] = float64(i) 200 data.Evt.VecStr[ii] = fmt.Sprintf("vec-%03d", i) 201 } 202 data.Evt.End = fmt.Sprintf("end-%03d", i) 203 return data 204 } 205 206 func TestEventTree(t *testing.T) { 207 t.Parallel() 208 209 for _, test := range []struct { 210 name string 211 fname string 212 }{ 213 { 214 name: "nosplit", 215 fname: "../testdata/small-evnt-tree-nosplit.root", 216 }, 217 { 218 name: "fullsplit", 219 fname: "../testdata/small-evnt-tree-fullsplit.root", 220 }, 221 { 222 name: "nosplit-xrootd", 223 fname: rtests.XrdRemote("testdata/small-evnt-tree-nosplit.root"), 224 }, 225 { 226 name: "fullsplit-xrootd", 227 fname: rtests.XrdRemote("testdata/small-evnt-tree-fullsplit.root"), 228 }, 229 } { 230 t.Run(test.name, func(t *testing.T) { 231 testEventTree(t, test.name, test.fname) 232 }) 233 } 234 } 235 236 func testEventTree(t *testing.T, name, fname string) { 237 f, err := riofs.Open(fname) 238 if err != nil { 239 t.Errorf("%s: %v", name, err.Error()) 240 return 241 } 242 defer f.Close() 243 244 obj, err := f.Get("tree") 245 if err != nil { 246 t.Errorf("%s: %v", name, err) 247 return 248 } 249 250 tree := obj.(Tree) 251 if got, want := tree.Name(), "tree"; got != want { 252 t.Errorf("%s: tree.Name: got=%q. want=%q", name, got, want) 253 return 254 } 255 256 for _, table := range []struct { 257 test string 258 value string 259 want string 260 }{ 261 {"Name", tree.Name(), "tree"}, // name when created 262 {"Title", tree.Title(), "my tree title"}, 263 {"Class", tree.Class(), "TTree"}, 264 } { 265 if table.value != table.want { 266 t.Errorf("%s: %v: got=[%v]. want=[%v]", name, table.test, table.value, table.want) 267 return 268 } 269 } 270 271 entries := tree.Entries() 272 if got, want := entries, int64(100); got != want { 273 t.Errorf("%s: tree.Entries: got=%v. want=%v", name, got, want) 274 return 275 } 276 277 want := EventType{}.want 278 data := newEventType() 279 r, err := NewReader(tree, ReadVarsFromStruct(data)) 280 if err != nil { 281 t.Fatal(err) 282 } 283 defer r.Close() 284 285 ievt := 0 286 err = r.Read(func(ctx RCtx) error { 287 i := ctx.Entry 288 if !reflect.DeepEqual(*data, want(i)) { 289 return fmt.Errorf( 290 "%s: entry[%d]:\ngot= %#v\nwant=%#v\n", 291 name, i, *data, want(i), 292 ) 293 } 294 ievt++ 295 return nil 296 }) 297 if err != nil { 298 t.Errorf("%s: %v", name, err) 299 return 300 } 301 if ievt != int(tree.Entries()) { 302 t.Errorf("%s: read %d entries. want=%d", name, ievt, tree.Entries()) 303 return 304 } 305 } 306 307 func TestSimpleTree(t *testing.T) { 308 t.Parallel() 309 310 f, err := riofs.Open("../testdata/simple.root") 311 if err != nil { 312 t.Fatal(err.Error()) 313 } 314 defer f.Close() 315 316 obj, err := f.Get("tree") 317 if err != nil { 318 t.Fatal(err) 319 } 320 321 tree := obj.(Tree) 322 if got, want := tree.Name(), "tree"; got != want { 323 t.Fatalf("tree.Name: got=%q. want=%q", got, want) 324 } 325 326 for _, table := range []struct { 327 test string 328 value string 329 want string 330 }{ 331 {"Name", tree.Name(), "tree"}, // name when created 332 {"Title", tree.Title(), "fake data"}, 333 {"Class", tree.Class(), "TTree"}, 334 } { 335 if table.value != table.want { 336 t.Fatalf("%v: got=[%v]. want=[%v]", table.test, table.value, table.want) 337 } 338 } 339 340 entries := tree.Entries() 341 if got, want := entries, int64(4); got != want { 342 t.Fatalf("tree.Entries: got=%v. want=%v", got, want) 343 } 344 } 345 346 func TestSimpleTreeOverHTTP(t *testing.T) { 347 t.Parallel() 348 349 f, err := riofs.Open("https://codeberg.org/go-hep/hep/raw/branch/main/groot/testdata/simple.root") 350 if err != nil { 351 t.Fatal(err) 352 } 353 defer f.Close() 354 355 obj, err := f.Get("tree") 356 if err != nil { 357 t.Fatal(err) 358 } 359 360 tree := obj.(Tree) 361 if got, want := tree.Name(), "tree"; got != want { 362 t.Fatalf("tree.Name: got=%q. want=%q", got, want) 363 } 364 365 for _, table := range []struct { 366 test string 367 value string 368 want string 369 }{ 370 {"Name", tree.Name(), "tree"}, // name when created 371 {"Title", tree.Title(), "fake data"}, 372 {"Class", tree.Class(), "TTree"}, 373 } { 374 if table.value != table.want { 375 t.Fatalf("%v: got=[%v]. want=[%v]", table.test, table.value, table.want) 376 } 377 } 378 379 entries := tree.Entries() 380 if got, want := entries, int64(4); got != want { 381 t.Fatalf("tree.Entries: got=%v. want=%v", got, want) 382 } 383 } 384 385 func TestTreeWithBasketWithTKeyData(t *testing.T) { 386 files := []string{ 387 "../testdata/PhaseSpaceSimulation.root", 388 rtests.XrdRemote("testdata/PhaseSpaceSimulation.root"), 389 } 390 for i := range files { 391 fname := files[i] 392 t.Run(fname, func(t *testing.T) { 393 t.Parallel() 394 395 f, err := riofs.Open(fname) 396 if err != nil { 397 t.Skipf("error: %v", err) 398 } 399 defer f.Close() 400 401 obj, err := f.Get("PhaseSpaceTree") 402 if err != nil { 403 t.Fatal(err) 404 } 405 406 tree := obj.(Tree) 407 if got, want := tree.Name(), "PhaseSpaceTree"; got != want { 408 t.Fatalf("tree.Name: got=%q. want=%q", got, want) 409 } 410 411 entries := tree.Entries() 412 if got, want := entries, int64(50000); got != want { 413 t.Fatalf("tree.Entries: got=%v. want=%v", got, want) 414 } 415 }) 416 } 417 } 418 419 func TestUprootTrees(t *testing.T) { 420 type Data struct { 421 N int32 `groot:"n"` 422 B bool `groot:"b"` 423 Arrb [3]bool `groot:"ab"` 424 Ab []bool `groot:"Ab"` 425 I1 int8 `groot:"i1"` 426 Arri1 [3]int8 `groot:"ai1"` 427 Ai1 []int8 `groot:"Ai1"` 428 U1 int8 `groot:"u1"` 429 Arru1 [3]int8 `groot:"au1"` 430 Au1 []int8 `groot:"Au1"` 431 I2 int16 `groot:"i2"` 432 Arri2 [3]int16 `groot:"ai2"` 433 Ai2 []int16 `groot:"Ai2"` 434 U2 int16 `groot:"u2"` 435 Arru2 [3]int16 `groot:"au2"` 436 Au2 []int16 `groot:"Au2"` 437 I4 int32 `groot:"i4"` 438 Arri4 [3]int32 `groot:"ai4"` 439 Ai4 []int32 `groot:"Ai4"` 440 U4 int32 `groot:"u4"` 441 Arru4 [3]int32 `groot:"au4"` 442 Au4 []int32 `groot:"Au4"` 443 I8 int64 `groot:"i8"` 444 Arri8 [3]int64 `groot:"ai8"` 445 Ai8 []int64 `groot:"Ai8"` 446 U8 int64 `groot:"u8"` 447 Arru8 [3]int64 `groot:"au8"` 448 Au8 []int64 `groot:"Au8"` 449 F4 float32 `groot:"f4"` 450 Arrf4 [3]float32 `groot:"af4"` 451 Af4 []float32 `groot:"Af4"` 452 F8 float64 `groot:"f8"` 453 Arrf8 [3]float64 `groot:"af8"` 454 Af8 []float64 `groot:"Af8"` 455 Str string `groot:"str"` 456 } 457 458 var want = [...]Data{ 459 { 460 N: 0, 461 B: true, 462 Arrb: [3]bool{false, true, false}, 463 Ab: []bool{}, 464 I1: -15, 465 Arri1: [3]int8{-14, -13, -12}, 466 Ai1: []int8{}, 467 U1: 0, 468 Arru1: [3]int8{1, 2, 3}, 469 Au1: []int8{}, 470 I2: -15, 471 Arri2: [3]int16{-14, -13, -12}, 472 Ai2: []int16{}, 473 U2: 0, 474 Arru2: [3]int16{1, 2, 3}, 475 Au2: []int16{}, 476 I4: -15, 477 Arri4: [3]int32{-14, -13, -12}, 478 Ai4: []int32{}, 479 U4: 0, 480 Arru4: [3]int32{1, 2, 3}, 481 Au4: []int32{}, 482 I8: -15, 483 Arri8: [3]int64{-14, -13, -12}, 484 Ai8: []int64{}, 485 U8: 0, 486 Arru8: [3]int64{1, 2, 3}, 487 Au8: []int64{}, 488 F4: -14.9, 489 Arrf4: [3]float32{-13.9, -12.9, -11.9}, 490 Af4: []float32{}, 491 F8: -14.9, 492 Arrf8: [3]float64{-13.9, -12.9, -11.9}, 493 Af8: []float64{}, 494 Str: "hey-0", 495 }, 496 { 497 N: 1, 498 B: false, 499 Arrb: [3]bool{true, false, true}, 500 Ab: []bool{true}, 501 I1: -14, 502 Arri1: [3]int8{-13, -12, -11}, 503 Ai1: []int8{-15}, 504 U1: 1, 505 Arru1: [3]int8{2, 3, 4}, 506 Au1: []int8{0}, 507 I2: -14, 508 Arri2: [3]int16{-13, -12, -11}, 509 Ai2: []int16{-15}, 510 U2: 1, 511 Arru2: [3]int16{2, 3, 4}, 512 Au2: []int16{0}, 513 I4: -14, 514 Arri4: [3]int32{-13, -12, -11}, 515 Ai4: []int32{-15}, 516 U4: 1, 517 Arru4: [3]int32{2, 3, 4}, 518 Au4: []int32{0}, 519 I8: -14, 520 Arri8: [3]int64{-13, -12, -11}, 521 Ai8: []int64{-15}, 522 U8: 1, 523 Arru8: [3]int64{2, 3, 4}, 524 Au8: []int64{0}, 525 F4: -13.9, 526 Arrf4: [3]float32{-12.9, -11.9, -10.9}, 527 Af4: []float32{-15}, 528 F8: -13.9, 529 Arrf8: [3]float64{-12.9, -11.9, -10.9}, 530 Af8: []float64{-15}, 531 Str: "hey-1", 532 }, 533 { 534 N: 2, 535 B: true, 536 Arrb: [3]bool{false, true, false}, 537 Ab: []bool{true, true}, 538 I1: -13, 539 Arri1: [3]int8{-12, -11, -10}, 540 Ai1: []int8{-15, -13}, 541 U1: 2, 542 Arru1: [3]int8{3, 4, 5}, 543 Au1: []int8{0, 2}, 544 I2: -13, 545 Arri2: [3]int16{-12, -11, -10}, 546 Ai2: []int16{-15, -13}, 547 U2: 2, 548 Arru2: [3]int16{3, 4, 5}, 549 Au2: []int16{0, 2}, 550 I4: -13, 551 Arri4: [3]int32{-12, -11, -10}, 552 Ai4: []int32{-15, -13}, 553 U4: 2, 554 Arru4: [3]int32{3, 4, 5}, 555 Au4: []int32{0, 2}, 556 I8: -13, 557 Arri8: [3]int64{-12, -11, -10}, 558 Ai8: []int64{-15, -13}, 559 U8: 2, 560 Arru8: [3]int64{3, 4, 5}, 561 Au8: []int64{0, 2}, 562 F4: -12.9, 563 Arrf4: [3]float32{-11.9, -10.9, -9.9}, 564 Af4: []float32{-15, -13.9}, 565 F8: -12.9, 566 Arrf8: [3]float64{-11.9, -10.9, -9.9}, 567 Af8: []float64{-15, -13.9}, 568 Str: "hey-2", 569 }, 570 { 571 N: 3, 572 B: false, 573 Arrb: [3]bool{true, false, true}, 574 Ab: []bool{true, true, true}, 575 I1: -12, 576 Arri1: [3]int8{-11, -10, -9}, 577 Ai1: []int8{-15, -13, -11}, 578 U1: 3, 579 Arru1: [3]int8{4, 5, 6}, 580 Au1: []int8{0, 2, 4}, 581 I2: -12, 582 Arri2: [3]int16{-11, -10, -9}, 583 Ai2: []int16{-15, -13, -11}, 584 U2: 3, 585 Arru2: [3]int16{4, 5, 6}, 586 Au2: []int16{0, 2, 4}, 587 I4: -12, 588 Arri4: [3]int32{-11, -10, -9}, 589 Ai4: []int32{-15, -13, -11}, 590 U4: 3, 591 Arru4: [3]int32{4, 5, 6}, 592 Au4: []int32{0, 2, 4}, 593 I8: -12, 594 Arri8: [3]int64{-11, -10, -9}, 595 Ai8: []int64{-15, -13, -11}, 596 U8: 3, 597 Arru8: [3]int64{4, 5, 6}, 598 Au8: []int64{0, 2, 4}, 599 F4: -11.9, 600 Arrf4: [3]float32{-10.9, -9.9, -8.9}, 601 Af4: []float32{-15, -13.9, -12.8}, 602 F8: -11.9, 603 Arrf8: [3]float64{-10.9, -9.9, -8.9}, 604 Af8: []float64{-15, -13.9, -12.8}, 605 Str: "hey-3", 606 }, 607 { 608 N: 4, 609 B: true, 610 Arrb: [3]bool{false, true, false}, 611 Ab: []bool{true, true, true, true}, 612 I1: -11, 613 Arri1: [3]int8{-10, -9, -8}, 614 Ai1: []int8{-15, -13, -11, -9}, 615 U1: 4, 616 Arru1: [3]int8{5, 6, 7}, 617 Au1: []int8{0, 2, 4, 6}, 618 I2: -11, 619 Arri2: [3]int16{-10, -9, -8}, 620 Ai2: []int16{-15, -13, -11, -9}, 621 U2: 4, 622 Arru2: [3]int16{5, 6, 7}, 623 Au2: []int16{0, 2, 4, 6}, 624 I4: -11, 625 Arri4: [3]int32{-10, -9, -8}, 626 Ai4: []int32{-15, -13, -11, -9}, 627 U4: 4, 628 Arru4: [3]int32{5, 6, 7}, 629 Au4: []int32{0, 2, 4, 6}, 630 I8: -11, 631 Arri8: [3]int64{-10, -9, -8}, 632 Ai8: []int64{-15, -13, -11, -9}, 633 U8: 4, 634 Arru8: [3]int64{5, 6, 7}, 635 Au8: []int64{0, 2, 4, 6}, 636 F4: -10.9, 637 Arrf4: [3]float32{-9.9, -8.9, -7.9}, 638 Af4: []float32{-15, -13.9, -12.8, -11.7}, 639 F8: -10.9, 640 Arrf8: [3]float64{-9.9, -8.9, -7.9}, 641 Af8: []float64{-15, -13.9, -12.8, -11.7}, 642 Str: "hey-4", 643 }, 644 { 645 N: 0, 646 B: false, 647 Arrb: [3]bool{true, false, true}, 648 Ab: []bool{}, 649 I1: -10, 650 Arri1: [3]int8{-9, -8, -7}, 651 Ai1: []int8{}, 652 U1: 5, 653 Arru1: [3]int8{6, 7, 8}, 654 Au1: []int8{}, 655 I2: -10, 656 Arri2: [3]int16{-9, -8, -7}, 657 Ai2: []int16{}, 658 U2: 5, 659 Arru2: [3]int16{6, 7, 8}, 660 Au2: []int16{}, 661 I4: -10, 662 Arri4: [3]int32{-9, -8, -7}, 663 Ai4: []int32{}, 664 U4: 5, 665 Arru4: [3]int32{6, 7, 8}, 666 Au4: []int32{}, 667 I8: -10, 668 Arri8: [3]int64{-9, -8, -7}, 669 Ai8: []int64{}, 670 U8: 5, 671 Arru8: [3]int64{6, 7, 8}, 672 Au8: []int64{}, 673 F4: -9.9, 674 Arrf4: [3]float32{-8.9, -7.9, -6.9}, 675 Af4: []float32{}, 676 F8: -9.9, 677 Arrf8: [3]float64{-8.9, -7.9, -6.9}, 678 Af8: []float64{}, 679 Str: "hey-5", 680 }, 681 { 682 N: 1, 683 B: true, 684 Arrb: [3]bool{false, true, false}, 685 Ab: []bool{false}, 686 I1: -9, 687 Arri1: [3]int8{-8, -7, -6}, 688 Ai1: []int8{-10}, 689 U1: 6, 690 Arru1: [3]int8{7, 8, 9}, 691 Au1: []int8{5}, 692 I2: -9, 693 Arri2: [3]int16{-8, -7, -6}, 694 Ai2: []int16{-10}, 695 U2: 6, 696 Arru2: [3]int16{7, 8, 9}, 697 Au2: []int16{5}, 698 I4: -9, 699 Arri4: [3]int32{-8, -7, -6}, 700 Ai4: []int32{-10}, 701 U4: 6, 702 Arru4: [3]int32{7, 8, 9}, 703 Au4: []int32{5}, 704 I8: -9, 705 Arri8: [3]int64{-8, -7, -6}, 706 Ai8: []int64{-10}, 707 U8: 6, 708 Arru8: [3]int64{7, 8, 9}, 709 Au8: []int64{5}, 710 F4: -8.9, 711 Arrf4: [3]float32{-7.9, -6.9, -5.9}, 712 Af4: []float32{-10}, 713 F8: -8.9, 714 Arrf8: [3]float64{-7.9, -6.9, -5.9}, 715 Af8: []float64{-10}, 716 Str: "hey-6", 717 }, 718 { 719 N: 2, 720 B: false, 721 Arrb: [3]bool{true, false, true}, 722 Ab: []bool{false, false}, 723 I1: -8, 724 Arri1: [3]int8{-7, -6, -5}, 725 Ai1: []int8{-10, -8}, 726 U1: 7, 727 Arru1: [3]int8{8, 9, 10}, 728 Au1: []int8{5, 7}, 729 I2: -8, 730 Arri2: [3]int16{-7, -6, -5}, 731 Ai2: []int16{-10, -8}, 732 U2: 7, 733 Arru2: [3]int16{8, 9, 10}, 734 Au2: []int16{5, 7}, 735 I4: -8, 736 Arri4: [3]int32{-7, -6, -5}, 737 Ai4: []int32{-10, -8}, 738 U4: 7, 739 Arru4: [3]int32{8, 9, 10}, 740 Au4: []int32{5, 7}, 741 I8: -8, 742 Arri8: [3]int64{-7, -6, -5}, 743 Ai8: []int64{-10, -8}, 744 U8: 7, 745 Arru8: [3]int64{8, 9, 10}, 746 Au8: []int64{5, 7}, 747 F4: -7.9, 748 Arrf4: [3]float32{-6.9, -5.9, -4.9}, 749 Af4: []float32{-10, -8.9}, 750 F8: -7.9, 751 Arrf8: [3]float64{-6.9, -5.9, -4.9}, 752 Af8: []float64{-10, -8.9}, 753 Str: "hey-7", 754 }, 755 { 756 N: 3, 757 B: true, 758 Arrb: [3]bool{false, true, false}, 759 Ab: []bool{false, false, false}, 760 I1: -7, 761 Arri1: [3]int8{-6, -5, -4}, 762 Ai1: []int8{-10, -8, -6}, 763 U1: 8, 764 Arru1: [3]int8{9, 10, 11}, 765 Au1: []int8{5, 7, 9}, 766 I2: -7, 767 Arri2: [3]int16{-6, -5, -4}, 768 Ai2: []int16{-10, -8, -6}, 769 U2: 8, 770 Arru2: [3]int16{9, 10, 11}, 771 Au2: []int16{5, 7, 9}, 772 I4: -7, 773 Arri4: [3]int32{-6, -5, -4}, 774 Ai4: []int32{-10, -8, -6}, 775 U4: 8, 776 Arru4: [3]int32{9, 10, 11}, 777 Au4: []int32{5, 7, 9}, 778 I8: -7, 779 Arri8: [3]int64{-6, -5, -4}, 780 Ai8: []int64{-10, -8, -6}, 781 U8: 8, 782 Arru8: [3]int64{9, 10, 11}, 783 Au8: []int64{5, 7, 9}, 784 F4: -6.9, 785 Arrf4: [3]float32{-5.9, -4.9, -3.9}, 786 Af4: []float32{-10, -8.9, -7.8}, 787 F8: -6.9, 788 Arrf8: [3]float64{-5.9, -4.9, -3.9000000000000004}, 789 Af8: []float64{-10, -8.9, -7.8}, 790 Str: "hey-8", 791 }, 792 { 793 N: 4, 794 B: false, 795 Arrb: [3]bool{true, false, true}, 796 Ab: []bool{false, false, false, false}, 797 I1: -6, 798 Arri1: [3]int8{-5, -4, -3}, 799 Ai1: []int8{-10, -8, -6, -4}, 800 U1: 9, 801 Arru1: [3]int8{10, 11, 12}, 802 Au1: []int8{5, 7, 9, 11}, 803 I2: -6, 804 Arri2: [3]int16{-5, -4, -3}, 805 Ai2: []int16{-10, -8, -6, -4}, 806 U2: 9, 807 Arru2: [3]int16{10, 11, 12}, 808 Au2: []int16{5, 7, 9, 11}, 809 I4: -6, 810 Arri4: [3]int32{-5, -4, -3}, 811 Ai4: []int32{-10, -8, -6, -4}, 812 U4: 9, 813 Arru4: [3]int32{10, 11, 12}, 814 Au4: []int32{5, 7, 9, 11}, 815 I8: -6, 816 Arri8: [3]int64{-5, -4, -3}, 817 Ai8: []int64{-10, -8, -6, -4}, 818 U8: 9, 819 Arru8: [3]int64{10, 11, 12}, 820 Au8: []int64{5, 7, 9, 11}, 821 F4: -5.9, 822 Arrf4: [3]float32{-4.9, -3.9, -2.9}, 823 Af4: []float32{-10, -8.9, -7.8, -6.7}, 824 F8: -5.9, 825 Arrf8: [3]float64{-4.9, -3.9000000000000004, -2.9000000000000004}, 826 Af8: []float64{-10, -8.9, -7.8, -6.7}, 827 Str: "hey-9", 828 }, 829 { 830 N: 0, 831 B: true, 832 Arrb: [3]bool{false, true, false}, 833 Ab: []bool{}, 834 I1: -5, 835 Arri1: [3]int8{-4, -3, -2}, 836 Ai1: []int8{}, 837 U1: 10, 838 Arru1: [3]int8{11, 12, 13}, 839 Au1: []int8{}, 840 I2: -5, 841 Arri2: [3]int16{-4, -3, -2}, 842 Ai2: []int16{}, 843 U2: 10, 844 Arru2: [3]int16{11, 12, 13}, 845 Au2: []int16{}, 846 I4: -5, 847 Arri4: [3]int32{-4, -3, -2}, 848 Ai4: []int32{}, 849 U4: 10, 850 Arru4: [3]int32{11, 12, 13}, 851 Au4: []int32{}, 852 I8: -5, 853 Arri8: [3]int64{-4, -3, -2}, 854 Ai8: []int64{}, 855 U8: 10, 856 Arru8: [3]int64{11, 12, 13}, 857 Au8: []int64{}, 858 F4: -4.9, 859 Arrf4: [3]float32{-3.9, -2.9, -1.9}, 860 Af4: []float32{}, 861 F8: -4.9, 862 Arrf8: [3]float64{-3.9000000000000004, -2.9000000000000004, -1.9000000000000004}, 863 Af8: []float64{}, 864 Str: "hey-10", 865 }, 866 { 867 N: 1, 868 B: false, 869 Arrb: [3]bool{true, false, true}, 870 Ab: []bool{true}, 871 I1: -4, 872 Arri1: [3]int8{-3, -2, -1}, 873 Ai1: []int8{-5}, 874 U1: 11, 875 Arru1: [3]int8{12, 13, 14}, 876 Au1: []int8{10}, 877 I2: -4, 878 Arri2: [3]int16{-3, -2, -1}, 879 Ai2: []int16{-5}, 880 U2: 11, 881 Arru2: [3]int16{12, 13, 14}, 882 Au2: []int16{10}, 883 I4: -4, 884 Arri4: [3]int32{-3, -2, -1}, 885 Ai4: []int32{-5}, 886 U4: 11, 887 Arru4: [3]int32{12, 13, 14}, 888 Au4: []int32{10}, 889 I8: -4, 890 Arri8: [3]int64{-3, -2, -1}, 891 Ai8: []int64{-5}, 892 U8: 11, 893 Arru8: [3]int64{12, 13, 14}, 894 Au8: []int64{10}, 895 F4: -3.9, 896 Arrf4: [3]float32{-2.9, -1.9, -0.9}, 897 Af4: []float32{-5}, 898 F8: -3.9000000000000004, 899 Arrf8: [3]float64{-2.9000000000000004, -1.9000000000000004, -0.9000000000000004}, 900 Af8: []float64{-5}, 901 Str: "hey-11", 902 }, 903 { 904 N: 2, 905 B: true, 906 Arrb: [3]bool{false, true, false}, 907 Ab: []bool{true, true}, 908 I1: -3, 909 Arri1: [3]int8{-2, -1, 0}, 910 Ai1: []int8{-5, -3}, 911 U1: 12, 912 Arru1: [3]int8{13, 14, 15}, 913 Au1: []int8{10, 12}, 914 I2: -3, 915 Arri2: [3]int16{-2, -1, 0}, 916 Ai2: []int16{-5, -3}, 917 U2: 12, 918 Arru2: [3]int16{13, 14, 15}, 919 Au2: []int16{10, 12}, 920 I4: -3, 921 Arri4: [3]int32{-2, -1, 0}, 922 Ai4: []int32{-5, -3}, 923 U4: 12, 924 Arru4: [3]int32{13, 14, 15}, 925 Au4: []int32{10, 12}, 926 I8: -3, 927 Arri8: [3]int64{-2, -1, 0}, 928 Ai8: []int64{-5, -3}, 929 U8: 12, 930 Arru8: [3]int64{13, 14, 15}, 931 Au8: []int64{10, 12}, 932 F4: -2.9, 933 Arrf4: [3]float32{-1.9, -0.9, 0.1}, 934 Af4: []float32{-5, -3.9}, 935 F8: -2.9000000000000004, 936 Arrf8: [3]float64{-1.9000000000000004, -0.9000000000000004, 0.09999999999999964}, 937 Af8: []float64{-5, -3.9}, 938 Str: "hey-12", 939 }, 940 { 941 N: 3, 942 B: false, 943 Arrb: [3]bool{true, false, true}, 944 Ab: []bool{true, true, true}, 945 I1: -2, 946 Arri1: [3]int8{-1, 0, 1}, 947 Ai1: []int8{-5, -3, -1}, 948 U1: 13, 949 Arru1: [3]int8{14, 15, 16}, 950 Au1: []int8{10, 12, 14}, 951 I2: -2, 952 Arri2: [3]int16{-1, 0, 1}, 953 Ai2: []int16{-5, -3, -1}, 954 U2: 13, 955 Arru2: [3]int16{14, 15, 16}, 956 Au2: []int16{10, 12, 14}, 957 I4: -2, 958 Arri4: [3]int32{-1, 0, 1}, 959 Ai4: []int32{-5, -3, -1}, 960 U4: 13, 961 Arru4: [3]int32{14, 15, 16}, 962 Au4: []int32{10, 12, 14}, 963 I8: -2, 964 Arri8: [3]int64{-1, 0, 1}, 965 Ai8: []int64{-5, -3, -1}, 966 U8: 13, 967 Arru8: [3]int64{14, 15, 16}, 968 Au8: []int64{10, 12, 14}, 969 F4: -1.9, 970 Arrf4: [3]float32{-0.9, 0.1, 1.1}, 971 Af4: []float32{-5, -3.9, -2.8}, 972 F8: -1.9000000000000004, 973 Arrf8: [3]float64{-0.9000000000000004, 0.09999999999999964, 1.0999999999999996}, 974 Af8: []float64{-5, -3.9, -2.8}, 975 Str: "hey-13", 976 }, 977 { 978 N: 4, 979 B: true, 980 Arrb: [3]bool{false, true, false}, 981 Ab: []bool{true, true, true, true}, 982 I1: -1, 983 Arri1: [3]int8{0, 1, 2}, 984 Ai1: []int8{-5, -3, -1, 1}, 985 U1: 14, 986 Arru1: [3]int8{15, 16, 17}, 987 Au1: []int8{10, 12, 14, 16}, 988 I2: -1, 989 Arri2: [3]int16{0, 1, 2}, 990 Ai2: []int16{-5, -3, -1, 1}, 991 U2: 14, 992 Arru2: [3]int16{15, 16, 17}, 993 Au2: []int16{10, 12, 14, 16}, 994 I4: -1, 995 Arri4: [3]int32{0, 1, 2}, 996 Ai4: []int32{-5, -3, -1, 1}, 997 U4: 14, 998 Arru4: [3]int32{15, 16, 17}, 999 Au4: []int32{10, 12, 14, 16}, 1000 I8: -1, 1001 Arri8: [3]int64{0, 1, 2}, 1002 Ai8: []int64{-5, -3, -1, 1}, 1003 U8: 14, 1004 Arru8: [3]int64{15, 16, 17}, 1005 Au8: []int64{10, 12, 14, 16}, 1006 F4: -0.9, 1007 Arrf4: [3]float32{0.1, 1.1, 2.1}, 1008 Af4: []float32{-5, -3.9, -2.8, -1.7}, 1009 F8: -0.9000000000000004, 1010 Arrf8: [3]float64{0.09999999999999964, 1.0999999999999996, 2.0999999999999996}, 1011 Af8: []float64{-5, -3.9, -2.8, -1.7}, 1012 Str: "hey-14", 1013 }, 1014 { 1015 N: 0, 1016 B: false, 1017 Arrb: [3]bool{true, false, true}, 1018 Ab: []bool{}, 1019 I1: 0, 1020 Arri1: [3]int8{1, 2, 3}, 1021 Ai1: []int8{}, 1022 U1: 15, 1023 Arru1: [3]int8{16, 17, 18}, 1024 Au1: []int8{}, 1025 I2: 0, 1026 Arri2: [3]int16{1, 2, 3}, 1027 Ai2: []int16{}, 1028 U2: 15, 1029 Arru2: [3]int16{16, 17, 18}, 1030 Au2: []int16{}, 1031 I4: 0, 1032 Arri4: [3]int32{1, 2, 3}, 1033 Ai4: []int32{}, 1034 U4: 15, 1035 Arru4: [3]int32{16, 17, 18}, 1036 Au4: []int32{}, 1037 I8: 0, 1038 Arri8: [3]int64{1, 2, 3}, 1039 Ai8: []int64{}, 1040 U8: 15, 1041 Arru8: [3]int64{16, 17, 18}, 1042 Au8: []int64{}, 1043 F4: 0.1, 1044 Arrf4: [3]float32{1.1, 2.1, 3.1}, 1045 Af4: []float32{}, 1046 F8: 0.09999999999999964, 1047 Arrf8: [3]float64{1.0999999999999996, 2.0999999999999996, 3.0999999999999996}, 1048 Af8: []float64{}, 1049 Str: "hey-15", 1050 }, 1051 { 1052 N: 1, 1053 B: true, 1054 Arrb: [3]bool{false, true, false}, 1055 Ab: []bool{false}, 1056 I1: 1, 1057 Arri1: [3]int8{2, 3, 4}, 1058 Ai1: []int8{0}, 1059 U1: 16, 1060 Arru1: [3]int8{17, 18, 19}, 1061 Au1: []int8{15}, 1062 I2: 1, 1063 Arri2: [3]int16{2, 3, 4}, 1064 Ai2: []int16{0}, 1065 U2: 16, 1066 Arru2: [3]int16{17, 18, 19}, 1067 Au2: []int16{15}, 1068 I4: 1, 1069 Arri4: [3]int32{2, 3, 4}, 1070 Ai4: []int32{0}, 1071 U4: 16, 1072 Arru4: [3]int32{17, 18, 19}, 1073 Au4: []int32{15}, 1074 I8: 1, 1075 Arri8: [3]int64{2, 3, 4}, 1076 Ai8: []int64{0}, 1077 U8: 16, 1078 Arru8: [3]int64{17, 18, 19}, 1079 Au8: []int64{15}, 1080 F4: 1.1, 1081 Arrf4: [3]float32{2.1, 3.1, 4.1}, 1082 Af4: []float32{0}, 1083 F8: 1.0999999999999996, 1084 Arrf8: [3]float64{2.0999999999999996, 3.0999999999999996, 4.1}, 1085 Af8: []float64{0}, 1086 Str: "hey-16", 1087 }, 1088 { 1089 N: 2, 1090 B: false, 1091 Arrb: [3]bool{true, false, true}, 1092 Ab: []bool{false, false}, 1093 I1: 2, 1094 Arri1: [3]int8{3, 4, 5}, 1095 Ai1: []int8{0, 2}, 1096 U1: 17, 1097 Arru1: [3]int8{18, 19, 20}, 1098 Au1: []int8{15, 17}, 1099 I2: 2, 1100 Arri2: [3]int16{3, 4, 5}, 1101 Ai2: []int16{0, 2}, 1102 U2: 17, 1103 Arru2: [3]int16{18, 19, 20}, 1104 Au2: []int16{15, 17}, 1105 I4: 2, 1106 Arri4: [3]int32{3, 4, 5}, 1107 Ai4: []int32{0, 2}, 1108 U4: 17, 1109 Arru4: [3]int32{18, 19, 20}, 1110 Au4: []int32{15, 17}, 1111 I8: 2, 1112 Arri8: [3]int64{3, 4, 5}, 1113 Ai8: []int64{0, 2}, 1114 U8: 17, 1115 Arru8: [3]int64{18, 19, 20}, 1116 Au8: []int64{15, 17}, 1117 F4: 2.1, 1118 Arrf4: [3]float32{3.1, 4.1, 5.1}, 1119 Af4: []float32{0, 1.1}, 1120 F8: 2.0999999999999996, 1121 Arrf8: [3]float64{3.0999999999999996, 4.1, 5.1}, 1122 Af8: []float64{0, 1.1}, 1123 Str: "hey-17", 1124 }, 1125 { 1126 N: 3, 1127 B: true, 1128 Arrb: [3]bool{false, true, false}, 1129 Ab: []bool{false, false, false}, 1130 I1: 3, 1131 Arri1: [3]int8{4, 5, 6}, 1132 Ai1: []int8{0, 2, 4}, 1133 U1: 18, 1134 Arru1: [3]int8{19, 20, 21}, 1135 Au1: []int8{15, 17, 19}, 1136 I2: 3, 1137 Arri2: [3]int16{4, 5, 6}, 1138 Ai2: []int16{0, 2, 4}, 1139 U2: 18, 1140 Arru2: [3]int16{19, 20, 21}, 1141 Au2: []int16{15, 17, 19}, 1142 I4: 3, 1143 Arri4: [3]int32{4, 5, 6}, 1144 Ai4: []int32{0, 2, 4}, 1145 U4: 18, 1146 Arru4: [3]int32{19, 20, 21}, 1147 Au4: []int32{15, 17, 19}, 1148 I8: 3, 1149 Arri8: [3]int64{4, 5, 6}, 1150 Ai8: []int64{0, 2, 4}, 1151 U8: 18, 1152 Arru8: [3]int64{19, 20, 21}, 1153 Au8: []int64{15, 17, 19}, 1154 F4: 3.1, 1155 Arrf4: [3]float32{4.1, 5.1, 6.1}, 1156 Af4: []float32{0, 1.1, 2.2}, 1157 F8: 3.0999999999999996, 1158 Arrf8: [3]float64{4.1, 5.1, 6.1}, 1159 Af8: []float64{0, 1.1, 2.2}, 1160 Str: "hey-18", 1161 }, 1162 { 1163 N: 4, 1164 B: false, 1165 Arrb: [3]bool{true, false, true}, 1166 Ab: []bool{false, false, false, false}, 1167 I1: 4, 1168 Arri1: [3]int8{5, 6, 7}, 1169 Ai1: []int8{0, 2, 4, 6}, 1170 U1: 19, 1171 Arru1: [3]int8{20, 21, 22}, 1172 Au1: []int8{15, 17, 19, 21}, 1173 I2: 4, 1174 Arri2: [3]int16{5, 6, 7}, 1175 Ai2: []int16{0, 2, 4, 6}, 1176 U2: 19, 1177 Arru2: [3]int16{20, 21, 22}, 1178 Au2: []int16{15, 17, 19, 21}, 1179 I4: 4, 1180 Arri4: [3]int32{5, 6, 7}, 1181 Ai4: []int32{0, 2, 4, 6}, 1182 U4: 19, 1183 Arru4: [3]int32{20, 21, 22}, 1184 Au4: []int32{15, 17, 19, 21}, 1185 I8: 4, 1186 Arri8: [3]int64{5, 6, 7}, 1187 Ai8: []int64{0, 2, 4, 6}, 1188 U8: 19, 1189 Arru8: [3]int64{20, 21, 22}, 1190 Au8: []int64{15, 17, 19, 21}, 1191 F4: 4.1, 1192 Arrf4: [3]float32{5.1, 6.1, 7.1}, 1193 Af4: []float32{0, 1.1, 2.2, 3.3}, 1194 F8: 4.1, 1195 Arrf8: [3]float64{5.1, 6.1, 7.1}, 1196 Af8: []float64{0, 1.1, 2.2, 3.3}, 1197 Str: "hey-19", 1198 }, 1199 { 1200 N: 0, 1201 B: true, 1202 Arrb: [3]bool{false, true, false}, 1203 Ab: []bool{}, 1204 I1: 5, 1205 Arri1: [3]int8{6, 7, 8}, 1206 Ai1: []int8{}, 1207 U1: 20, 1208 Arru1: [3]int8{21, 22, 23}, 1209 Au1: []int8{}, 1210 I2: 5, 1211 Arri2: [3]int16{6, 7, 8}, 1212 Ai2: []int16{}, 1213 U2: 20, 1214 Arru2: [3]int16{21, 22, 23}, 1215 Au2: []int16{}, 1216 I4: 5, 1217 Arri4: [3]int32{6, 7, 8}, 1218 Ai4: []int32{}, 1219 U4: 20, 1220 Arru4: [3]int32{21, 22, 23}, 1221 Au4: []int32{}, 1222 I8: 5, 1223 Arri8: [3]int64{6, 7, 8}, 1224 Ai8: []int64{}, 1225 U8: 20, 1226 Arru8: [3]int64{21, 22, 23}, 1227 Au8: []int64{}, 1228 F4: 5.1, 1229 Arrf4: [3]float32{6.1, 7.1, 8.1}, 1230 Af4: []float32{}, 1231 F8: 5.1, 1232 Arrf8: [3]float64{6.1, 7.1, 8.1}, 1233 Af8: []float64{}, 1234 Str: "hey-20", 1235 }, 1236 { 1237 N: 1, 1238 B: false, 1239 Arrb: [3]bool{true, false, true}, 1240 Ab: []bool{true}, 1241 I1: 6, 1242 Arri1: [3]int8{7, 8, 9}, 1243 Ai1: []int8{5}, 1244 U1: 21, 1245 Arru1: [3]int8{22, 23, 24}, 1246 Au1: []int8{20}, 1247 I2: 6, 1248 Arri2: [3]int16{7, 8, 9}, 1249 Ai2: []int16{5}, 1250 U2: 21, 1251 Arru2: [3]int16{22, 23, 24}, 1252 Au2: []int16{20}, 1253 I4: 6, 1254 Arri4: [3]int32{7, 8, 9}, 1255 Ai4: []int32{5}, 1256 U4: 21, 1257 Arru4: [3]int32{22, 23, 24}, 1258 Au4: []int32{20}, 1259 I8: 6, 1260 Arri8: [3]int64{7, 8, 9}, 1261 Ai8: []int64{5}, 1262 U8: 21, 1263 Arru8: [3]int64{22, 23, 24}, 1264 Au8: []int64{20}, 1265 F4: 6.1, 1266 Arrf4: [3]float32{7.1, 8.1, 9.1}, 1267 Af4: []float32{5}, 1268 F8: 6.1, 1269 Arrf8: [3]float64{7.1, 8.1, 9.1}, 1270 Af8: []float64{5}, 1271 Str: "hey-21", 1272 }, 1273 { 1274 N: 2, 1275 B: true, 1276 Arrb: [3]bool{false, true, false}, 1277 Ab: []bool{true, true}, 1278 I1: 7, 1279 Arri1: [3]int8{8, 9, 10}, 1280 Ai1: []int8{5, 7}, 1281 U1: 22, 1282 Arru1: [3]int8{23, 24, 25}, 1283 Au1: []int8{20, 22}, 1284 I2: 7, 1285 Arri2: [3]int16{8, 9, 10}, 1286 Ai2: []int16{5, 7}, 1287 U2: 22, 1288 Arru2: [3]int16{23, 24, 25}, 1289 Au2: []int16{20, 22}, 1290 I4: 7, 1291 Arri4: [3]int32{8, 9, 10}, 1292 Ai4: []int32{5, 7}, 1293 U4: 22, 1294 Arru4: [3]int32{23, 24, 25}, 1295 Au4: []int32{20, 22}, 1296 I8: 7, 1297 Arri8: [3]int64{8, 9, 10}, 1298 Ai8: []int64{5, 7}, 1299 U8: 22, 1300 Arru8: [3]int64{23, 24, 25}, 1301 Au8: []int64{20, 22}, 1302 F4: 7.1, 1303 Arrf4: [3]float32{8.1, 9.1, 10.1}, 1304 Af4: []float32{5, 6.1}, 1305 F8: 7.1, 1306 Arrf8: [3]float64{8.1, 9.1, 10.1}, 1307 Af8: []float64{5, 6.1}, 1308 Str: "hey-22", 1309 }, 1310 { 1311 N: 3, 1312 B: false, 1313 Arrb: [3]bool{true, false, true}, 1314 Ab: []bool{true, true, true}, 1315 I1: 8, 1316 Arri1: [3]int8{9, 10, 11}, 1317 Ai1: []int8{5, 7, 9}, 1318 U1: 23, 1319 Arru1: [3]int8{24, 25, 26}, 1320 Au1: []int8{20, 22, 24}, 1321 I2: 8, 1322 Arri2: [3]int16{9, 10, 11}, 1323 Ai2: []int16{5, 7, 9}, 1324 U2: 23, 1325 Arru2: [3]int16{24, 25, 26}, 1326 Au2: []int16{20, 22, 24}, 1327 I4: 8, 1328 Arri4: [3]int32{9, 10, 11}, 1329 Ai4: []int32{5, 7, 9}, 1330 U4: 23, 1331 Arru4: [3]int32{24, 25, 26}, 1332 Au4: []int32{20, 22, 24}, 1333 I8: 8, 1334 Arri8: [3]int64{9, 10, 11}, 1335 Ai8: []int64{5, 7, 9}, 1336 U8: 23, 1337 Arru8: [3]int64{24, 25, 26}, 1338 Au8: []int64{20, 22, 24}, 1339 F4: 8.1, 1340 Arrf4: [3]float32{9.1, 10.1, 11.1}, 1341 Af4: []float32{5, 6.1, 7.2}, 1342 F8: 8.1, 1343 Arrf8: [3]float64{9.1, 10.1, 11.1}, 1344 Af8: []float64{5, 6.1, 7.2}, 1345 Str: "hey-23", 1346 }, 1347 { 1348 N: 4, 1349 B: true, 1350 Arrb: [3]bool{false, true, false}, 1351 Ab: []bool{true, true, true, true}, 1352 I1: 9, 1353 Arri1: [3]int8{10, 11, 12}, 1354 Ai1: []int8{5, 7, 9, 11}, 1355 U1: 24, 1356 Arru1: [3]int8{25, 26, 27}, 1357 Au1: []int8{20, 22, 24, 26}, 1358 I2: 9, 1359 Arri2: [3]int16{10, 11, 12}, 1360 Ai2: []int16{5, 7, 9, 11}, 1361 U2: 24, 1362 Arru2: [3]int16{25, 26, 27}, 1363 Au2: []int16{20, 22, 24, 26}, 1364 I4: 9, 1365 Arri4: [3]int32{10, 11, 12}, 1366 Ai4: []int32{5, 7, 9, 11}, 1367 U4: 24, 1368 Arru4: [3]int32{25, 26, 27}, 1369 Au4: []int32{20, 22, 24, 26}, 1370 I8: 9, 1371 Arri8: [3]int64{10, 11, 12}, 1372 Ai8: []int64{5, 7, 9, 11}, 1373 U8: 24, 1374 Arru8: [3]int64{25, 26, 27}, 1375 Au8: []int64{20, 22, 24, 26}, 1376 F4: 9.1, 1377 Arrf4: [3]float32{10.1, 11.1, 12.1}, 1378 Af4: []float32{5, 6.1, 7.2, 8.3}, 1379 F8: 9.1, 1380 Arrf8: [3]float64{10.1, 11.1, 12.1}, 1381 Af8: []float64{5, 6.1, 7.2, 8.3}, 1382 Str: "hey-24", 1383 }, 1384 { 1385 N: 0, 1386 B: false, 1387 Arrb: [3]bool{true, false, true}, 1388 Ab: []bool{}, 1389 I1: 10, 1390 Arri1: [3]int8{11, 12, 13}, 1391 Ai1: []int8{}, 1392 U1: 25, 1393 Arru1: [3]int8{26, 27, 28}, 1394 Au1: []int8{}, 1395 I2: 10, 1396 Arri2: [3]int16{11, 12, 13}, 1397 Ai2: []int16{}, 1398 U2: 25, 1399 Arru2: [3]int16{26, 27, 28}, 1400 Au2: []int16{}, 1401 I4: 10, 1402 Arri4: [3]int32{11, 12, 13}, 1403 Ai4: []int32{}, 1404 U4: 25, 1405 Arru4: [3]int32{26, 27, 28}, 1406 Au4: []int32{}, 1407 I8: 10, 1408 Arri8: [3]int64{11, 12, 13}, 1409 Ai8: []int64{}, 1410 U8: 25, 1411 Arru8: [3]int64{26, 27, 28}, 1412 Au8: []int64{}, 1413 F4: 10.1, 1414 Arrf4: [3]float32{11.1, 12.1, 13.1}, 1415 Af4: []float32{}, 1416 F8: 10.1, 1417 Arrf8: [3]float64{11.1, 12.1, 13.1}, 1418 Af8: []float64{}, 1419 Str: "hey-25", 1420 }, 1421 { 1422 N: 1, 1423 B: true, 1424 Arrb: [3]bool{false, true, false}, 1425 Ab: []bool{false}, 1426 I1: 11, 1427 Arri1: [3]int8{12, 13, 14}, 1428 Ai1: []int8{10}, 1429 U1: 26, 1430 Arru1: [3]int8{27, 28, 29}, 1431 Au1: []int8{25}, 1432 I2: 11, 1433 Arri2: [3]int16{12, 13, 14}, 1434 Ai2: []int16{10}, 1435 U2: 26, 1436 Arru2: [3]int16{27, 28, 29}, 1437 Au2: []int16{25}, 1438 I4: 11, 1439 Arri4: [3]int32{12, 13, 14}, 1440 Ai4: []int32{10}, 1441 U4: 26, 1442 Arru4: [3]int32{27, 28, 29}, 1443 Au4: []int32{25}, 1444 I8: 11, 1445 Arri8: [3]int64{12, 13, 14}, 1446 Ai8: []int64{10}, 1447 U8: 26, 1448 Arru8: [3]int64{27, 28, 29}, 1449 Au8: []int64{25}, 1450 F4: 11.1, 1451 Arrf4: [3]float32{12.1, 13.1, 14.1}, 1452 Af4: []float32{10}, 1453 F8: 11.1, 1454 Arrf8: [3]float64{12.1, 13.1, 14.1}, 1455 Af8: []float64{10}, 1456 Str: "hey-26", 1457 }, 1458 { 1459 N: 2, 1460 B: false, 1461 Arrb: [3]bool{true, false, true}, 1462 Ab: []bool{false, false}, 1463 I1: 12, 1464 Arri1: [3]int8{13, 14, 15}, 1465 Ai1: []int8{10, 12}, 1466 U1: 27, 1467 Arru1: [3]int8{28, 29, 30}, 1468 Au1: []int8{25, 27}, 1469 I2: 12, 1470 Arri2: [3]int16{13, 14, 15}, 1471 Ai2: []int16{10, 12}, 1472 U2: 27, 1473 Arru2: [3]int16{28, 29, 30}, 1474 Au2: []int16{25, 27}, 1475 I4: 12, 1476 Arri4: [3]int32{13, 14, 15}, 1477 Ai4: []int32{10, 12}, 1478 U4: 27, 1479 Arru4: [3]int32{28, 29, 30}, 1480 Au4: []int32{25, 27}, 1481 I8: 12, 1482 Arri8: [3]int64{13, 14, 15}, 1483 Ai8: []int64{10, 12}, 1484 U8: 27, 1485 Arru8: [3]int64{28, 29, 30}, 1486 Au8: []int64{25, 27}, 1487 F4: 12.1, 1488 Arrf4: [3]float32{13.1, 14.1, 15.1}, 1489 Af4: []float32{10, 11.1}, 1490 F8: 12.1, 1491 Arrf8: [3]float64{13.1, 14.1, 15.1}, 1492 Af8: []float64{10, 11.1}, 1493 Str: "hey-27", 1494 }, 1495 { 1496 N: 3, 1497 B: true, 1498 Arrb: [3]bool{false, true, false}, 1499 Ab: []bool{false, false, false}, 1500 I1: 13, 1501 Arri1: [3]int8{14, 15, 16}, 1502 Ai1: []int8{10, 12, 14}, 1503 U1: 28, 1504 Arru1: [3]int8{29, 30, 31}, 1505 Au1: []int8{25, 27, 29}, 1506 I2: 13, 1507 Arri2: [3]int16{14, 15, 16}, 1508 Ai2: []int16{10, 12, 14}, 1509 U2: 28, 1510 Arru2: [3]int16{29, 30, 31}, 1511 Au2: []int16{25, 27, 29}, 1512 I4: 13, 1513 Arri4: [3]int32{14, 15, 16}, 1514 Ai4: []int32{10, 12, 14}, 1515 U4: 28, 1516 Arru4: [3]int32{29, 30, 31}, 1517 Au4: []int32{25, 27, 29}, 1518 I8: 13, 1519 Arri8: [3]int64{14, 15, 16}, 1520 Ai8: []int64{10, 12, 14}, 1521 U8: 28, 1522 Arru8: [3]int64{29, 30, 31}, 1523 Au8: []int64{25, 27, 29}, 1524 F4: 13.1, 1525 Arrf4: [3]float32{14.1, 15.1, 16.1}, 1526 Af4: []float32{10, 11.1, 12.2}, 1527 F8: 13.1, 1528 Arrf8: [3]float64{14.1, 15.1, 16.1}, 1529 Af8: []float64{10, 11.1, 12.2}, 1530 Str: "hey-28", 1531 }, 1532 { 1533 N: 4, 1534 B: false, 1535 Arrb: [3]bool{true, false, true}, 1536 Ab: []bool{false, false, false, false}, 1537 I1: 14, 1538 Arri1: [3]int8{15, 16, 17}, 1539 Ai1: []int8{10, 12, 14, 16}, 1540 U1: 29, 1541 Arru1: [3]int8{30, 31, 32}, 1542 Au1: []int8{25, 27, 29, 31}, 1543 I2: 14, 1544 Arri2: [3]int16{15, 16, 17}, 1545 Ai2: []int16{10, 12, 14, 16}, 1546 U2: 29, 1547 Arru2: [3]int16{30, 31, 32}, 1548 Au2: []int16{25, 27, 29, 31}, 1549 I4: 14, 1550 Arri4: [3]int32{15, 16, 17}, 1551 Ai4: []int32{10, 12, 14, 16}, 1552 U4: 29, 1553 Arru4: [3]int32{30, 31, 32}, 1554 Au4: []int32{25, 27, 29, 31}, 1555 I8: 14, 1556 Arri8: [3]int64{15, 16, 17}, 1557 Ai8: []int64{10, 12, 14, 16}, 1558 U8: 29, 1559 Arru8: [3]int64{30, 31, 32}, 1560 Au8: []int64{25, 27, 29, 31}, 1561 F4: 14.1, 1562 Arrf4: [3]float32{15.1, 16.1, 17.1}, 1563 Af4: []float32{10, 11.1, 12.2, 13.3}, 1564 F8: 14.1, 1565 Arrf8: [3]float64{15.1, 16.1, 17.1}, 1566 Af8: []float64{10, 11.1, 12.2, 13.3}, 1567 Str: "hey-29", 1568 }, 1569 } 1570 1571 files, err := filepath.Glob("../testdata/uproot/sample-*.root") 1572 if err != nil { 1573 t.Fatal(err) 1574 } 1575 1576 for i := range files { 1577 fname := files[i] 1578 t.Run(fname, func(t *testing.T) { 1579 t.Parallel() 1580 1581 var d Data 1582 f, err := riofs.Open(fname) 1583 if err != nil { 1584 t.Fatal(err) 1585 } 1586 defer f.Close() 1587 1588 obj, err := f.Get("sample") 1589 if err != nil { 1590 t.Fatal(err) 1591 } 1592 tree := obj.(Tree) 1593 1594 r, err := NewReader(tree, ReadVarsFromStruct(&d)) 1595 if err != nil { 1596 t.Fatal(err) 1597 } 1598 defer r.Close() 1599 1600 err = r.Read(func(ctx RCtx) error { 1601 i := int(ctx.Entry) 1602 if !reflect.DeepEqual(d, want[i]) { 1603 return fmt.Errorf( 1604 "entry %d differ.\ngot= %#v\nwant=%#v\n", 1605 ctx.Entry, d, want[i], 1606 ) 1607 } 1608 return nil 1609 }) 1610 if err != nil { 1611 t.Fatalf("error: %+v", err) 1612 } 1613 }) 1614 } 1615 } 1616 1617 func TestReadG4Merge(t *testing.T) { 1618 const fname = "../testdata/g4-merge.root" 1619 1620 f, err := riofs.Open(fname) 1621 if err != nil { 1622 t.Fatal(err) 1623 } 1624 defer f.Close() 1625 1626 tree, err := riofs.Get[Tree](f, "Photons") 1627 if err != nil { 1628 t.Fatal(err) 1629 } 1630 1631 type Data struct { 1632 X float64 `groot:"fX"` 1633 } 1634 1635 var ( 1636 d Data 1637 want = []Data{ 1638 {X: 0.12123017145693009}, 1639 {X: 0.11744358487972842}, 1640 {X: 0.1142964503404715}, 1641 {X: 0.11702763375596258}, 1642 {X: 0.1160675474106288}, 1643 } 1644 ) 1645 1646 r, err := NewReader(tree, ReadVarsFromStruct(&d), WithRange(0, 5)) 1647 if err != nil { 1648 t.Fatalf("could not create reader: %+v", err) 1649 } 1650 defer r.Close() 1651 1652 err = r.Read(func(ctx RCtx) error { 1653 i := int(ctx.Entry) 1654 if got, want := d, want[i]; got != want { 1655 return fmt.Errorf("invalid entry[%d]: got=%v, want=%v", i, got, want) 1656 } 1657 return nil 1658 }) 1659 if err != nil { 1660 t.Fatalf("error: %+v", err) 1661 } 1662 }