go-hep.org/x/hep@v0.38.1/groot/cmd/root-gen-streamer/main_test.go (about)

     1  // Copyright ©2018 The go-hep Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  	"os"
    11  	"os/exec"
    12  	"strings"
    13  	"testing"
    14  
    15  	"go-hep.org/x/hep/groot/internal/rdatatest"
    16  	"go-hep.org/x/hep/internal/diff"
    17  )
    18  
    19  var (
    20  	_ rdatatest.Event // make sure rdatatest is compiled
    21  )
    22  
    23  func TestGenerate(t *testing.T) {
    24  
    25  	for _, tc := range []struct {
    26  		pkg   string
    27  		types []string
    28  		want  string
    29  	}{
    30  		{
    31  			pkg:   "go-hep.org/x/hep/groot/internal/rdatatest",
    32  			types: []string{"Event", "HLV", "Particle"},
    33  			want:  "testdata/rdatatest.txt",
    34  		},
    35  	} {
    36  		t.Run(tc.pkg, func(t *testing.T) {
    37  			buf := new(bytes.Buffer)
    38  			err := generate(buf, tc.pkg, tc.types)
    39  			if err != nil {
    40  				t.Fatalf("could not generate streamer: %v", err)
    41  			}
    42  			want, err := os.ReadFile(tc.want)
    43  			if err != nil {
    44  				t.Fatalf("could not read reference streamer: %v", err)
    45  			}
    46  
    47  			if got, want := buf.String(), string(want); got != want {
    48  				t.Fatalf("error:\n%s\n", diff.Format(got, want))
    49  			}
    50  		})
    51  	}
    52  }
    53  
    54  func TestGenerateCompileRun(t *testing.T) {
    55  	for _, tc := range []struct {
    56  		name  string
    57  		pkg   string
    58  		types []string
    59  		out   string
    60  		tmpl  string
    61  		want  string
    62  	}{
    63  		{
    64  			name:  "builtins",
    65  			pkg:   "go-hep.org/x/hep/groot/internal/rdatatest",
    66  			types: []string{"Builtins"},
    67  			out:   "../../internal/rdatatest/pkg_gen.go",
    68  			tmpl:  "NewBuiltins",
    69  			want: `>>> file[testdata/out.root]
    70  key[000]: data;1 "" (go_hep_org::x::hep::groot::internal::rdatatest::Builtins) => &{true 8 16 32 64 -8 -16 -32 -64 32.32 64.64 builtins}
    71  `,
    72  		},
    73  		{
    74  			name:  "arr-builtins",
    75  			pkg:   "go-hep.org/x/hep/groot/internal/rdatatest",
    76  			types: []string{"ArrBuiltins"},
    77  			out:   "../../internal/rdatatest/pkg_gen.go",
    78  			tmpl:  "NewArrBuiltins",
    79  			want: `>>> file[testdata/out.root]
    80  key[000]: data;1 "" (go_hep_org::x::hep::groot::internal::rdatatest::ArrBuiltins) => &{[true false] [8 88] [16 1616] [32 3232] [64 6464] [-8 -88] [-16 -1616] [-32 -3232] [-64 -6464] [32.32 -32.32] [64.64 64.64] [builtins arrays]}
    81  `,
    82  		},
    83  		{
    84  			name:  "struct-t1",
    85  			pkg:   "go-hep.org/x/hep/groot/internal/rdatatest",
    86  			types: []string{"HLV", "T1"}, // FIXME(sbinet): only select T1 and let root-gen-streamer pick-up HLV
    87  			out:   "../../internal/rdatatest/pkg_gen.go",
    88  			tmpl:  "NewT1",
    89  			want: `>>> file[testdata/out.root]
    90  key[000]: data;1 "" (go_hep_org::x::hep::groot::internal::rdatatest::T1) => &{hello {1 2 3 4}}
    91  `,
    92  		},
    93  		//		{
    94  		//			name:  "struct-t2",
    95  		//			pkg:   "go-hep.org/x/hep/groot/internal/rdatatest",
    96  		//			types: []string{"HLV", "T2"}, // FIXME(sbinet): only select T2 and let root-gen-streamer pick-up HLV
    97  		//			out:   "../../internal/rdatatest/pkg_gen.go",
    98  		//			tmpl:  "NewT2",
    99  		//			want: `>>> file[testdata/out.root]
   100  		//key[000]: data;1 "" (go_hep_org::x::hep::groot::internal::rdatatest::T1) => &{hello {1 2 3 4}}
   101  		//`,
   102  		//		},
   103  	} {
   104  		t.Run(tc.name, func(t *testing.T) {
   105  			os.Remove(tc.out)
   106  			os.Remove("testdata/run.go")
   107  			defer os.Remove(tc.out)
   108  			defer os.Remove("testdata/run.go")
   109  			defer os.Remove("testdata/out.root")
   110  
   111  			var (
   112  				out = new(bytes.Buffer)
   113  				err error
   114  				cmd *exec.Cmd
   115  			)
   116  
   117  			out.Reset()
   118  			cmd = exec.Command("go", "get", "-v", tc.pkg)
   119  			cmd.Stdout = out
   120  			cmd.Stderr = out
   121  			err = cmd.Run()
   122  			if err != nil {
   123  				t.Fatalf("could not compile package with streamer data:\n%v\nerr: %v", out.String(), err)
   124  			}
   125  
   126  			out.Reset()
   127  			cmd = exec.Command(
   128  				"root-gen-streamer",
   129  				"-p", tc.pkg, "-t", strings.Join(tc.types, ","),
   130  				"-o", tc.out,
   131  			)
   132  			cmd.Stdout = out
   133  			cmd.Stderr = out
   134  			err = cmd.Run()
   135  			if err != nil {
   136  				t.Fatalf("could not generate streamer data:\n%v\nerr: %v", out.String(), err)
   137  			}
   138  
   139  			out.Reset()
   140  			cmd = exec.Command("go", "get", "-v", tc.pkg)
   141  			cmd.Stdout = out
   142  			cmd.Stderr = out
   143  			err = cmd.Run()
   144  			if err != nil {
   145  				t.Fatalf("could not recompile package with streamer data:\n%v\nerr: %v", out.String(), err)
   146  			}
   147  
   148  			err = os.WriteFile("testdata/run.go", fmt.Appendf(nil, `//go:build ignore
   149  
   150  package main
   151  
   152  import (
   153  	"log"
   154  
   155  	"go-hep.org/x/hep/groot"
   156  	"go-hep.org/x/hep/groot/internal/rdatatest"
   157  )
   158  
   159  func main() {
   160  	f, err := groot.Create("testdata/out.root")
   161  	if err != nil {
   162  		log.Fatal(err)
   163  	}
   164  	defer f.Close()
   165  
   166  	v := rdatatest.%s()
   167  	err = f.Put("data", v)
   168  	if err != nil {
   169  		log.Fatal(err)
   170  	}
   171  
   172  	err = f.Close()
   173  	if err != nil {
   174  		log.Fatal(err)
   175  	}
   176  }
   177  `, tc.tmpl,
   178  			), 0644)
   179  
   180  			if err != nil {
   181  				t.Fatalf("could not generate test-write program: %v", err)
   182  			}
   183  
   184  			out.Reset()
   185  			cmd = exec.Command("go", "run", "testdata/run.go")
   186  			cmd.Stdout = out
   187  			cmd.Stderr = out
   188  			err = cmd.Run()
   189  			if err != nil {
   190  				t.Fatalf("could not run test-write program:\n%v\nerr: %v\n", out.String(), err)
   191  			}
   192  
   193  			out.Reset()
   194  			cmd = exec.Command("root-dump", "testdata/out.root")
   195  			cmd.Stdout = out
   196  			cmd.Stderr = out
   197  			err = cmd.Run()
   198  			if err != nil {
   199  				t.Fatalf("could not run root-dump:\n%v\nerr: %v", out.String(), err)
   200  			}
   201  
   202  			if got, want := out.String(), tc.want; got != want {
   203  				t.Fatalf("error:\n%v", diff.Format(got, want))
   204  			}
   205  		})
   206  	}
   207  }