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  }