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 }