go-hep.org/x/hep@v0.38.1/hbook/s2d_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 TestS2D(t *testing.T) {
    19  	s := NewS2D(Point2D{X: 1, Y: 1}, Point2D{X: 2, Y: 1.5}, Point2D{X: -1, Y: +2})
    20  	if s == nil {
    21  		t.Fatal("nil pointer to S2D")
    22  	}
    23  
    24  	if got, want := s.Len(), 3; got != want {
    25  		t.Errorf("got len=%d. want=%d\n", got, want)
    26  	}
    27  
    28  	pt := Point2D{X: 10, Y: -10, ErrX: Range{Min: 5, Max: 5}, ErrY: Range{Min: 6, Max: 6}}
    29  	s.Fill(pt)
    30  
    31  	if got, want := s.Len(), 4; got != want {
    32  		t.Errorf("got len=%d. want=%d\n", got, want)
    33  	}
    34  
    35  	if got, want := s.Point(3), pt; got != want {
    36  		t.Errorf("invalid pt[%d]:\ngot= %+v\nwant=%+v\n", 3, got, want)
    37  	}
    38  }
    39  
    40  func TestS2DWriteYODA(t *testing.T) {
    41  	h := NewH1D(20, -4, +4)
    42  	h.Fill(1, 2)
    43  	h.Fill(2, 3)
    44  	h.Fill(3, 1)
    45  	h.Fill(1, 1)
    46  	h.Fill(-2, 1)
    47  	h.Fill(-3, 1)
    48  
    49  	s := NewS2DFromH1D(h)
    50  
    51  	chk, err := s.MarshalYODA()
    52  	if err != nil {
    53  		t.Fatal(err)
    54  	}
    55  
    56  	ref, err := os.ReadFile("testdata/s2d_v2_golden.yoda")
    57  	if err != nil {
    58  		t.Fatal(err)
    59  	}
    60  
    61  	if !reflect.DeepEqual(chk, ref) {
    62  		fatalf := t.Fatalf
    63  		if runtime.GOOS == "darwin" {
    64  			// ignore errors for darwin and mac-silicon
    65  			fatalf = t.Logf
    66  		}
    67  		fatalf("s2d file differ:\n%s\n",
    68  			cmp.Diff(
    69  				string(ref),
    70  				string(chk),
    71  			),
    72  		)
    73  	}
    74  }
    75  
    76  func TestS2DReadYODAv1(t *testing.T) {
    77  	ref, err := os.ReadFile("testdata/s2d_v1_golden.yoda")
    78  	if err != nil {
    79  		t.Fatal(err)
    80  	}
    81  
    82  	var s S2D
    83  	err = s.UnmarshalYODA(ref)
    84  	if err != nil {
    85  		t.Fatal(err)
    86  	}
    87  
    88  	chk, err := s.marshalYODAv1()
    89  	if err != nil {
    90  		t.Fatal(err)
    91  	}
    92  
    93  	if !reflect.DeepEqual(chk, ref) {
    94  		t.Fatalf("s2d file differ:\n%s\n",
    95  			cmp.Diff(
    96  				string(ref),
    97  				string(chk),
    98  			),
    99  		)
   100  	}
   101  }
   102  
   103  func TestS2DReadYODAv2(t *testing.T) {
   104  	ref, err := os.ReadFile("testdata/s2d_v2_golden.yoda")
   105  	if err != nil {
   106  		t.Fatal(err)
   107  	}
   108  
   109  	var s S2D
   110  	err = s.UnmarshalYODA(ref)
   111  	if err != nil {
   112  		t.Fatal(err)
   113  	}
   114  
   115  	chk, err := s.marshalYODAv2()
   116  	if err != nil {
   117  		t.Fatal(err)
   118  	}
   119  
   120  	if !reflect.DeepEqual(chk, ref) {
   121  		t.Fatalf("s2d file differ:\n%s\n",
   122  			cmp.Diff(
   123  				string(ref),
   124  				string(chk),
   125  			),
   126  		)
   127  	}
   128  }
   129  
   130  func TestS2DSerialization(t *testing.T) {
   131  	sref := NewS2D()
   132  	for i := range 10 {
   133  		v := float64(i)
   134  		sref.Fill(Point2D{X: v, Y: v, ErrX: Range{Min: v, Max: 2 * v}, ErrY: Range{Min: v, Max: 3 * v}})
   135  	}
   136  	sref.Annotation()["title"] = "scatter2d title"
   137  	sref.Annotation()["name"] = "s2d-name"
   138  
   139  	{
   140  		buf := new(bytes.Buffer)
   141  		enc := gob.NewEncoder(buf)
   142  		err := enc.Encode(sref)
   143  		if err != nil {
   144  			t.Fatalf("could not serialize scatter2d: %v\n", err)
   145  		}
   146  
   147  		var snew S2D
   148  		dec := gob.NewDecoder(buf)
   149  		err = dec.Decode(&snew)
   150  		if err != nil {
   151  			t.Fatalf("could not deserialize scatter2d: %v\n", err)
   152  		}
   153  
   154  		if !reflect.DeepEqual(sref, &snew) {
   155  			t.Fatalf("ref=%v\nnew=%v\n", sref, &snew)
   156  		}
   157  	}
   158  }