go-hep.org/x/hep@v0.40.0/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  				"go", "tool",
   129  				"go-hep.org/x/hep/groot/cmd/root-gen-streamer",
   130  				"-p", tc.pkg, "-t", strings.Join(tc.types, ","),
   131  				"-o", tc.out,
   132  			)
   133  			cmd.Stdout = out
   134  			cmd.Stderr = out
   135  			err = cmd.Run()
   136  			if err != nil {
   137  				t.Fatalf("could not generate streamer data:\n%v\nerr: %v", out.String(), err)
   138  			}
   139  
   140  			out.Reset()
   141  			cmd = exec.Command("go", "get", "-v", tc.pkg)
   142  			cmd.Stdout = out
   143  			cmd.Stderr = out
   144  			err = cmd.Run()
   145  			if err != nil {
   146  				t.Fatalf("could not recompile package with streamer data:\n%v\nerr: %v", out.String(), err)
   147  			}
   148  
   149  			err = os.WriteFile("testdata/run.go", fmt.Appendf(nil, `//go:build ignore
   150  
   151  package main
   152  
   153  import (
   154  	"log"
   155  
   156  	"go-hep.org/x/hep/groot"
   157  	"go-hep.org/x/hep/groot/internal/rdatatest"
   158  )
   159  
   160  func main() {
   161  	f, err := groot.Create("testdata/out.root")
   162  	if err != nil {
   163  		log.Fatal(err)
   164  	}
   165  	defer f.Close()
   166  
   167  	v := rdatatest.%s()
   168  	err = f.Put("data", v)
   169  	if err != nil {
   170  		log.Fatal(err)
   171  	}
   172  
   173  	err = f.Close()
   174  	if err != nil {
   175  		log.Fatal(err)
   176  	}
   177  }
   178  `, tc.tmpl,
   179  			), 0644)
   180  
   181  			if err != nil {
   182  				t.Fatalf("could not generate test-write program: %v", err)
   183  			}
   184  
   185  			out.Reset()
   186  			cmd = exec.Command("go", "run", "testdata/run.go")
   187  			cmd.Stdout = out
   188  			cmd.Stderr = out
   189  			err = cmd.Run()
   190  			if err != nil {
   191  				t.Fatalf("could not run test-write program:\n%v\nerr: %v\n", out.String(), err)
   192  			}
   193  
   194  			out.Reset()
   195  			cmd = exec.Command(
   196  				"go", "tool",
   197  				"go-hep.org/x/hep/groot/cmd/root-dump",
   198  				"testdata/out.root",
   199  			)
   200  			cmd.Stdout = out
   201  			cmd.Stderr = out
   202  			err = cmd.Run()
   203  			if err != nil {
   204  				t.Fatalf("could not run root-dump:\n%v\nerr: %v", out.String(), err)
   205  			}
   206  
   207  			if got, want := out.String(), tc.want; got != want {
   208  				t.Fatalf("error:\n%v", diff.Format(got, want))
   209  			}
   210  		})
   211  	}
   212  }