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 }