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  }