go-hep.org/x/hep@v0.38.1/hbook/p1d_test.go (about) 1 // Copyright ©2016 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 hbook 6 7 import ( 8 "bytes" 9 "encoding/gob" 10 "os" 11 "reflect" 12 "runtime" 13 "testing" 14 15 "github.com/google/go-cmp/cmp" 16 ) 17 18 func TestP1D(t *testing.T) { 19 p := NewP1D(10, -4, +4) 20 if p == nil { 21 t.Fatalf("nil pointer to P1D") 22 } 23 24 p.Annotation()["name"] = "p1d" 25 26 for i := range 10 { 27 v := float64(i) 28 p.Fill(v, v*2, 1) 29 } 30 p.Fill(-10, 10, 1) 31 32 if got, want := p.Name(), "p1d"; got != want { 33 t.Errorf("got=%q. want=%q\n", got, want) 34 } 35 36 for _, test := range []struct { 37 name string 38 f func() float64 39 want float64 40 }{ 41 { 42 name: "xmean", 43 f: p.XMean, 44 want: 3.1818181818181817, 45 }, 46 { 47 name: "xmin", 48 f: p.XMin, 49 want: -4.0, 50 }, 51 { 52 name: "xmax", 53 f: p.XMax, 54 want: +4.0, 55 }, 56 { 57 name: "xrms", 58 f: p.XRMS, 59 want: 5.916079783099616, 60 }, 61 { 62 name: "xstddev", 63 f: p.XStdDev, 64 want: 5.231026320296655, 65 }, 66 { 67 name: "xstderr", 68 f: p.XStdErr, 69 want: 1.5772137793543157, 70 }, 71 { 72 name: "xvariance", 73 f: p.XVariance, 74 want: 27.363636363636363, 75 }, 76 { 77 name: "sumw", 78 f: p.SumW, 79 want: 11.0, 80 }, 81 { 82 name: "sumw2", 83 f: p.SumW2, 84 want: 11.0, 85 }, 86 } { 87 got := test.f() 88 if got != test.want { 89 t.Errorf("test: %v. got=%v. want=%v\n", test.name, got, test.want) 90 } 91 } 92 } 93 94 func TestP1DWriteYODA(t *testing.T) { 95 p := NewP1D(10, -4, +4) 96 if p == nil { 97 t.Fatalf("nil pointer to P1D") 98 } 99 100 for i := range 10 { 101 v := float64(i) 102 p.Fill(v, v*2, 1) 103 } 104 p.Fill(-10, 10, 1) 105 106 chk, err := p.MarshalYODA() 107 if err != nil { 108 t.Fatal(err) 109 } 110 111 ref, err := os.ReadFile("testdata/p1d_v2_golden.yoda") 112 if err != nil { 113 t.Fatal(err) 114 } 115 116 if !reflect.DeepEqual(chk, ref) { 117 fatalf := t.Fatalf 118 if runtime.GOOS == "darwin" { 119 // ignore errors for darwin and mac-silicon 120 fatalf = t.Logf 121 } 122 fatalf("p1d file differ:\n%s\n", 123 cmp.Diff( 124 string(ref), 125 string(chk), 126 ), 127 ) 128 } 129 } 130 131 func TestP1DReadYODAv1(t *testing.T) { 132 ref, err := os.ReadFile("testdata/p1d_v1_golden.yoda") 133 if err != nil { 134 t.Fatal(err) 135 } 136 137 var h P1D 138 err = h.UnmarshalYODA(ref) 139 if err != nil { 140 t.Fatal(err) 141 } 142 143 chk, err := h.marshalYODAv1() 144 if err != nil { 145 t.Fatal(err) 146 } 147 148 if !reflect.DeepEqual(chk, ref) { 149 t.Fatalf("p1d file differ:\n%s\n", 150 cmp.Diff( 151 string(ref), 152 string(chk), 153 ), 154 ) 155 } 156 } 157 158 func TestP1DReadYODAv2(t *testing.T) { 159 ref, err := os.ReadFile("testdata/p1d_v2_golden.yoda") 160 if err != nil { 161 t.Fatal(err) 162 } 163 164 var h P1D 165 err = h.UnmarshalYODA(ref) 166 if err != nil { 167 t.Fatal(err) 168 } 169 170 chk, err := h.MarshalYODA() 171 if err != nil { 172 t.Fatal(err) 173 } 174 175 if !reflect.DeepEqual(chk, ref) { 176 t.Fatalf("p1d file differ:\n%s\n", 177 cmp.Diff( 178 string(ref), 179 string(chk), 180 ), 181 ) 182 } 183 } 184 185 func TestP1DSerialization(t *testing.T) { 186 pref := NewP1D(10, -4, +4) 187 if pref == nil { 188 t.Fatalf("nil pointer to P1D") 189 } 190 191 for i := range 10 { 192 v := float64(i) 193 pref.Fill(v, v*2, 1) 194 } 195 pref.Fill(-10, 10, 1) 196 197 pref.Annotation()["title"] = "p1d title" 198 pref.Annotation()["name"] = "p1d-name" 199 200 { 201 buf := new(bytes.Buffer) 202 enc := gob.NewEncoder(buf) 203 err := enc.Encode(pref) 204 if err != nil { 205 t.Fatalf("could not serialize p1d: %v\n", err) 206 } 207 208 var pnew P1D 209 dec := gob.NewDecoder(buf) 210 err = dec.Decode(&pnew) 211 if err != nil { 212 t.Fatalf("could not deserialize p1d: %v\n", err) 213 } 214 215 if !reflect.DeepEqual(pref, &pnew) { 216 t.Fatalf("ref=%v\nnew=%v\n", pref, &pnew) 217 } 218 } 219 }