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  }