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  }