go-hep.org/x/hep@v0.38.1/rio/scanner_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 rio
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  	"reflect"
    11  	"testing"
    12  )
    13  
    14  func TestScanner(t *testing.T) {
    15  	evts := makeEvents(10)
    16  	buf := new(bytes.Buffer)
    17  	w, err := NewWriter(buf)
    18  	if err != nil {
    19  		t.Fatalf("could not create rio writer: %v", err)
    20  	}
    21  	defer w.Close()
    22  
    23  	for i := range evts {
    24  		id := fmt.Sprintf("evt-%03d", i+1)
    25  		err = w.WriteValue(id, &evts[i])
    26  		if err != nil {
    27  			t.Fatalf("could not write %s: %v", id, err)
    28  		}
    29  	}
    30  
    31  	err = w.Close()
    32  	if err != nil {
    33  		t.Fatalf("could not close rio writer: %v", err)
    34  	}
    35  
    36  	r, err := NewReader(bytes.NewReader(buf.Bytes()))
    37  	if err != nil {
    38  		t.Fatalf("could not create rio reader: %v", err)
    39  	}
    40  	defer r.Close()
    41  
    42  	nevts := 0
    43  	sc := NewScanner(r)
    44  	sc.Select([]Selector{
    45  		{Name: "evt-001", Unpack: true},
    46  		{Name: "evt-002", Unpack: true},
    47  		{Name: "evt-003", Unpack: true},
    48  		{Name: "evt-004", Unpack: true},
    49  		{Name: "evt-005", Unpack: true},
    50  		{Name: "evt-006", Unpack: true},
    51  		{Name: "evt-007", Unpack: true},
    52  		{Name: "evt-008", Unpack: true},
    53  		{Name: "evt-009", Unpack: true},
    54  		{Name: "evt-010", Unpack: true},
    55  	})
    56  
    57  	var evt event
    58  	for sc.Scan() {
    59  		rec := sc.Record()
    60  		if rec == nil {
    61  			break
    62  		}
    63  		blk := rec.Block(rec.Name())
    64  		err = blk.Read(&evt)
    65  		if err != nil {
    66  			t.Fatal(err)
    67  		}
    68  		if !reflect.DeepEqual(evt, evts[nevts]) {
    69  			t.Fatalf("%s: events differ.\ngot= %#v\nwant=%#v\n", rec.Name(), evt, evts[nevts])
    70  		}
    71  		nevts++
    72  	}
    73  	if err := sc.Err(); err != nil {
    74  		t.Fatalf("error during scan: %v", err)
    75  	}
    76  
    77  	if nevts != len(evts) {
    78  		t.Fatalf("invalid number of events: got=%d, want=%d", nevts, len(evts))
    79  	}
    80  }
    81  
    82  func makeEvents(n int) []event {
    83  	evts := make([]event, 0, n)
    84  	for i := range n {
    85  		evts = append(evts, event{
    86  			runnbr: int64(1000 + n),
    87  			evtnbr: int64(10000 + n),
    88  			id:     fmt.Sprintf("id-%03d", i),
    89  			eles:   []electron{newElectron(float64(i+1)+100, float64(i+2)+100, float64(i+3)+100, float64(i+4)+100)},
    90  			muons:  []muon{newMuon(float64(i+1)+200, float64(i+2)+200, float64(i+3)+200, float64(i+4)+200)},
    91  		})
    92  	}
    93  	return evts
    94  }