go-hep.org/x/hep@v0.38.1/hepevt/ascii_io_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 hepevt_test 6 7 import ( 8 "bytes" 9 "errors" 10 "io" 11 "os" 12 "reflect" 13 "testing" 14 15 "go-hep.org/x/hep/hepevt" 16 ) 17 18 var ( 19 small = hepevt.Event{ 20 Nevhep: 1, 21 Nhep: 8, 22 Isthep: []int{3, 3, 3, 3, 3, 1, 1, 1}, 23 Idhep: []int{2212, 2212, -2, 1, -24, -2, 1, 22}, 24 Jmohep: [][2]int{{0, 0}, {0, 0}, {2, 2}, {1, 1}, {3, 4}, {5, 5}, {5, 5}, {3, 4}}, 25 Jdahep: [][2]int{{4, 4}, {3, 3}, {5, 8}, {5, 8}, {6, 7}, {0, 0}, {0, 0}, {0, 0}}, 26 Phep: [][5]float64{ 27 {+0.00000000e+00, +0.00000000e+00, +7.00000000e+03, +7.0000000000e+03, +0.00000000e+00}, 28 {+0.00000000e+00, +0.00000000e+00, -7.00000000e+03, +7.0000000000e+03, +0.00000000e+00}, 29 {-3.04700000e+00, -1.90000000e+01, -5.46290000e+01, +5.7920000000e+01, +0.00000000e+00}, 30 {+7.50000000e-01, -1.56900000e+00, +3.21910000e+01, +3.2238000000e+01, +0.00000000e+00}, 31 {+1.51700000e+00, -2.06800000e+01, -2.06050000e+01, +8.5925000000e+01, +0.00000000e+00}, 32 {+3.96200000e+00, -4.94980000e+01, -2.66870000e+01, +5.6373000000e+01, +0.00000000e+00}, 33 {-2.44500000e+00, +2.88160000e+01, +6.08200000e+00, +2.9552000000e+01, +0.00000000e+00}, 34 {-3.81300000e+00, +1.13000000e-01, -1.83300000e+00, +4.2330000000e+00, +0.00000000e+00}, 35 }, 36 Vhep: [][4]float64{ 37 {0, 0, 0, 0}, 38 {0, 0, 0, 0}, 39 {0, 0, 0, 0}, 40 {0, 0, 0, 0}, 41 {0, 0, 0, 0}, 42 {0, 0, 0, 0}, 43 {0, 0, 0, 0}, 44 {0, 0, 0, 0}, 45 }, 46 } 47 ) 48 49 func TestDecoder(t *testing.T) { 50 f, err := os.Open("testdata/small.hepevt") 51 if err != nil { 52 t.Fatal(err) 53 } 54 defer f.Close() 55 56 var evt hepevt.Event 57 58 dec := hepevt.NewDecoder(f) 59 err = dec.Decode(&evt) 60 if err != nil { 61 t.Fatal(err) 62 } 63 64 if !reflect.DeepEqual(evt, small) { 65 t.Fatalf("decoded event differ from reference:\ngot = %#v\nwant= %#v", 66 evt, small, 67 ) 68 } 69 } 70 71 func TestEncoder(t *testing.T) { 72 f, err := os.CreateTemp("", "hepevt-") 73 if err != nil { 74 t.Fatal(err) 75 } 76 defer f.Close() 77 defer os.Remove(f.Name()) 78 79 enc := hepevt.NewEncoder(f) 80 if err := enc.Encode(&small); err != nil { 81 t.Fatal(err) 82 } 83 84 if err := f.Close(); err != nil { 85 t.Fatal(err) 86 } 87 88 got, err := os.ReadFile(f.Name()) 89 if err != nil { 90 t.Fatal(err) 91 } 92 93 want, err := os.ReadFile("testdata/small.hepevt") 94 if err != nil { 95 t.Fatal(err) 96 } 97 98 if !bytes.Equal(got, want) { 99 t.Fatalf("files differ.\ngot:\n%s\nwant:\n%s\n", got, want) 100 } 101 } 102 103 func TestDecoderFail(t *testing.T) { 104 for _, tc := range []struct { 105 name string 106 input string 107 want error 108 }{ 109 { 110 name: "empty", 111 input: "", 112 want: io.EOF, 113 }, 114 { 115 name: "unexpected newline", 116 input: "\n", 117 }, 118 { 119 name: "expected integer", 120 input: "1 t\n", 121 }, 122 { 123 name: "newline in format does not match format", 124 input: "1.1 1\n", 125 }, 126 { 127 name: "newline in format does not match input", 128 input: "1 1.1\n", 129 }, 130 { 131 name: "newline in format does not match format", 132 input: "1 1\n1\n", 133 }, 134 } { 135 t.Run(tc.name, func(t *testing.T) { 136 r := bytes.NewReader([]byte(tc.input)) 137 dec := hepevt.NewDecoder(r) 138 var evt hepevt.Event 139 err := dec.Decode(&evt) 140 if err == nil { 141 t.Fatalf("expected a failure") 142 } 143 if tc.want != nil && !errors.Is(err, tc.want) { 144 t.Fatalf("unexpected error.\ngot = %v\nwant= %v", err, tc.want) 145 } 146 if tc.want == nil { 147 t.Logf("%s: %q", tc.name, err.Error()) 148 } 149 }) 150 } 151 } 152 153 func TestEncoderFail(t *testing.T) { 154 for i := range 256 { 155 nbytes := i 156 t.Run("", func(t *testing.T) { 157 w := newWriter(nbytes) 158 enc := hepevt.NewEncoder(w) 159 err := enc.Encode(&small) 160 if err == nil { 161 t.Fatalf("expected a failure") 162 } 163 }) 164 } 165 } 166 167 type failWriter struct { 168 n int 169 c int 170 } 171 172 func newWriter(n int) *failWriter { 173 return &failWriter{n: n, c: 0} 174 } 175 176 func (w *failWriter) Write(data []byte) (int, error) { 177 for range data { 178 w.c++ 179 if w.c >= w.n { 180 return 0, io.ErrUnexpectedEOF 181 } 182 } 183 return len(data), nil 184 }