github.com/mtsmfm/go/src@v0.0.0-20221020090648-44bdcb9f8fde/internal/coverage/slicewriter/slw_test.go (about) 1 // Copyright 2022 The Go 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 slicewriter 6 7 import ( 8 "io" 9 "testing" 10 ) 11 12 func TestSliceWriter(t *testing.T) { 13 14 sleq := func(t *testing.T, got []byte, want []byte) { 15 t.Helper() 16 if len(got) != len(want) { 17 t.Fatalf("bad length got %d want %d", len(got), len(want)) 18 } 19 for i := range got { 20 if got[i] != want[i] { 21 t.Fatalf("bad read at %d got %d want %d", i, got[i], want[i]) 22 } 23 } 24 } 25 26 wf := func(t *testing.T, ws *WriteSeeker, p []byte) { 27 t.Helper() 28 nw, werr := ws.Write(p) 29 if werr != nil { 30 t.Fatalf("unexpected write error: %v", werr) 31 } 32 if nw != len(p) { 33 t.Fatalf("wrong amount written want %d got %d", len(p), nw) 34 } 35 } 36 37 rf := func(t *testing.T, ws *WriteSeeker, p []byte) { 38 t.Helper() 39 b := make([]byte, len(p)) 40 nr, rerr := ws.Read(b) 41 if rerr != nil { 42 t.Fatalf("unexpected read error: %v", rerr) 43 } 44 if nr != len(p) { 45 t.Fatalf("wrong amount read want %d got %d", len(p), nr) 46 } 47 sleq(t, b, p) 48 } 49 50 sk := func(t *testing.T, ws *WriteSeeker, offset int64, whence int) { 51 t.Helper() 52 _, err := ws.Seek(offset, whence) 53 if err != nil { 54 t.Fatalf("unexpected seek error: %v", err) 55 } 56 } 57 58 wp1 := []byte{1, 2} 59 ws := &WriteSeeker{} 60 61 // write some stuff 62 wf(t, ws, wp1) 63 // check that BytesWritten returns what we wrote. 64 sleq(t, ws.BytesWritten(), wp1) 65 // offset is at end of slice, so reading should return zero bytes. 66 rf(t, ws, []byte{}) 67 68 // write some more stuff 69 wp2 := []byte{7, 8, 9} 70 wf(t, ws, wp2) 71 // check that BytesWritten returns what we expect. 72 wpex := []byte{1, 2, 7, 8, 9} 73 sleq(t, ws.BytesWritten(), wpex) 74 rf(t, ws, []byte{}) 75 76 // seeks and reads. 77 sk(t, ws, 1, io.SeekStart) 78 rf(t, ws, []byte{2, 7}) 79 sk(t, ws, -2, io.SeekCurrent) 80 rf(t, ws, []byte{2, 7}) 81 sk(t, ws, -4, io.SeekEnd) 82 rf(t, ws, []byte{2, 7}) 83 84 // seek back and overwrite 85 sk(t, ws, 1, io.SeekStart) 86 wf(t, ws, []byte{9, 11}) 87 wpex = []byte{1, 9, 11, 8, 9} 88 sleq(t, ws.BytesWritten(), wpex) 89 90 // seeks on empty writer. 91 ws2 := &WriteSeeker{} 92 sk(t, ws2, 0, io.SeekStart) 93 sk(t, ws2, 0, io.SeekCurrent) 94 sk(t, ws2, 0, io.SeekEnd) 95 96 // check for seek errors. 97 _, err := ws.Seek(-1, io.SeekStart) 98 if err == nil { 99 t.Fatalf("expected error on invalid -1 seek") 100 } 101 _, err = ws.Seek(int64(len(ws.BytesWritten())), io.SeekStart) 102 if err == nil { 103 t.Fatalf("expected error on invalid %d seek", len(ws.BytesWritten())) 104 } 105 106 ws.Seek(0, io.SeekStart) 107 _, err = ws.Seek(-1, io.SeekCurrent) 108 if err == nil { 109 t.Fatalf("expected error on invalid -1 seek") 110 } 111 _, err = ws.Seek(int64(len(ws.BytesWritten())), io.SeekCurrent) 112 if err == nil { 113 t.Fatalf("expected error on invalid %d seek", len(ws.BytesWritten())) 114 } 115 116 _, err = ws.Seek(1, io.SeekEnd) 117 if err == nil { 118 t.Fatalf("expected error on invalid 1 seek") 119 } 120 bsamt := int64(-1*len(ws.BytesWritten()) - 1) 121 _, err = ws.Seek(bsamt, io.SeekEnd) 122 if err == nil { 123 t.Fatalf("expected error on invalid %d seek", bsamt) 124 } 125 126 // bad seek mode 127 _, err = ws.Seek(-1, io.SeekStart+9) 128 if err == nil { 129 t.Fatalf("expected error on invalid seek mode") 130 } 131 }