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 }