go-hep.org/x/hep@v0.38.1/hepmc/go-hepmc-dump/main_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 main
     6  
     7  import (
     8  	"bytes"
     9  	"io"
    10  	"log"
    11  	"os"
    12  	"testing"
    13  )
    14  
    15  func TestDump(t *testing.T) {
    16  	f, err := os.Open("../testdata/small.hepmc")
    17  	if err != nil {
    18  		log.Fatal(err)
    19  	}
    20  	defer f.Close()
    21  
    22  	out := new(bytes.Buffer)
    23  	err = dump(out, f)
    24  	if err != nil {
    25  		t.Fatal(err)
    26  	}
    27  
    28  	want, err := os.ReadFile("testdata/small.hepmc.ref")
    29  	if err != nil {
    30  		t.Fatal(err)
    31  	}
    32  
    33  	if !bytes.Equal(out.Bytes(), want) {
    34  		t.Fatalf("dump error.\ngot:\n%s\nwant:\n%s\n", out.Bytes(), want)
    35  	}
    36  }
    37  
    38  func TestDumpFail(t *testing.T) {
    39  	ref, err := os.ReadFile("../testdata/small.hepmc")
    40  	if err != nil {
    41  		t.Fatal(err)
    42  	}
    43  
    44  	for _, i := range []int{
    45  		0, 1, 2, 3, 4, 5,
    46  		64, 128, 256,
    47  	} {
    48  		raw := ref[:i]
    49  		t.Run("input", func(t *testing.T) {
    50  			r := bytes.NewReader(raw)
    51  			out := new(bytes.Buffer)
    52  			err := dump(out, r)
    53  			if err == nil {
    54  				t.Fatalf("expected a failure\n%q\n", raw)
    55  			}
    56  		})
    57  	}
    58  
    59  	want, err := os.ReadFile("testdata/small.hepmc.ref")
    60  	if err != nil {
    61  		t.Fatal(err)
    62  	}
    63  
    64  	for range len(want) - 1 {
    65  		nbytes := 0
    66  		t.Run("output", func(t *testing.T) {
    67  			r := bytes.NewReader(ref)
    68  			out := newWriter(nbytes)
    69  			err := dump(out, r)
    70  			if err == nil {
    71  				t.Fatalf("expected a failure")
    72  			}
    73  		})
    74  	}
    75  }
    76  
    77  type failWriter struct {
    78  	n int
    79  	c int
    80  }
    81  
    82  func newWriter(n int) *failWriter {
    83  	return &failWriter{n: n, c: 0}
    84  }
    85  
    86  func (w *failWriter) Write(data []byte) (int, error) {
    87  	for range data {
    88  		w.c++
    89  		if w.c >= w.n {
    90  			return 0, io.ErrUnexpectedEOF
    91  		}
    92  	}
    93  	return len(data), nil
    94  }