github.com/mithrandie/csvq@v1.18.1/lib/file/reader_test.go (about)

     1  package file
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"strings"
     7  	"testing"
     8  )
     9  
    10  type readerReadResult struct {
    11  	Result string
    12  	EOF    bool
    13  }
    14  
    15  var readerReadTests = []struct {
    16  	Source      string
    17  	HeaderLen   int
    18  	ReadByteLen int
    19  	Results     []readerReadResult
    20  }{
    21  	{
    22  		Source:      "abcdefg",
    23  		HeaderLen:   3,
    24  		ReadByteLen: 2,
    25  		Results: []readerReadResult{
    26  			{
    27  				Result: "ab",
    28  				EOF:    false,
    29  			},
    30  			{
    31  				Result: "cd",
    32  				EOF:    false,
    33  			},
    34  			{
    35  				Result: "ef",
    36  				EOF:    false,
    37  			},
    38  			{
    39  				Result: "g",
    40  				EOF:    false,
    41  			},
    42  			{
    43  				Result: "",
    44  				EOF:    true,
    45  			},
    46  		},
    47  	},
    48  	{
    49  		Source:      "abcdef",
    50  		HeaderLen:   3,
    51  		ReadByteLen: 2,
    52  		Results: []readerReadResult{
    53  			{
    54  				Result: "ab",
    55  				EOF:    false,
    56  			},
    57  			{
    58  				Result: "cd",
    59  				EOF:    false,
    60  			},
    61  			{
    62  				Result: "ef",
    63  				EOF:    false,
    64  			},
    65  			{
    66  				Result: "",
    67  				EOF:    true,
    68  			},
    69  		},
    70  	},
    71  	{
    72  		Source:      "abcd",
    73  		HeaderLen:   2,
    74  		ReadByteLen: 2,
    75  		Results: []readerReadResult{
    76  			{
    77  				Result: "ab",
    78  				EOF:    false,
    79  			},
    80  			{
    81  				Result: "cd",
    82  				EOF:    false,
    83  			},
    84  			{
    85  				Result: "",
    86  				EOF:    true,
    87  			},
    88  		},
    89  	},
    90  	{
    91  		Source:      "ab",
    92  		HeaderLen:   10,
    93  		ReadByteLen: 2,
    94  		Results: []readerReadResult{
    95  			{
    96  				Result: "ab",
    97  				EOF:    false,
    98  			},
    99  			{
   100  				Result: "",
   101  				EOF:    true,
   102  			},
   103  		},
   104  	},
   105  	{
   106  		Source:      "",
   107  		HeaderLen:   2,
   108  		ReadByteLen: 2,
   109  		Results: []readerReadResult{
   110  			{
   111  				Result: "",
   112  				EOF:    true,
   113  			},
   114  		},
   115  	},
   116  }
   117  
   118  func TestReader_Read(t *testing.T) {
   119  	for _, v := range readerReadTests {
   120  		p := make([]byte, v.ReadByteLen)
   121  		reader, _ := NewReader(strings.NewReader(v.Source), v.HeaderLen)
   122  
   123  		for i, expect := range v.Results {
   124  			n, err := reader.Read(p)
   125  
   126  			if err != nil && err != io.EOF {
   127  				t.Errorf("%s - %d: unexpected error %q", v.Source, i, err)
   128  				continue
   129  			}
   130  
   131  			if err == io.EOF && !expect.EOF {
   132  				t.Errorf("%s - %d: error is nil, want io.EOF", v.Source, i)
   133  			}
   134  
   135  			result := string(p[:n])
   136  			if result != expect.Result {
   137  				t.Errorf("%s - %d: result = %q, want %q", v.Source, i, result, expect.Result)
   138  			}
   139  		}
   140  	}
   141  }
   142  
   143  func TestReader_HeadBytes(t *testing.T) {
   144  	source := strings.NewReader("abcdefg")
   145  	reader, _ := NewReader(source, 2)
   146  	headBytes, _ := reader.HeadBytes()
   147  
   148  	expect := "ab"
   149  	result, _ := io.ReadAll(headBytes)
   150  	if string(result) != expect {
   151  		t.Errorf("result = %s, want %s", result, expect)
   152  	}
   153  }
   154  
   155  var readerSizeTests = []struct {
   156  	Name   string
   157  	Reader io.Reader
   158  	Result int64
   159  }{
   160  	{
   161  		Name:   "*strings.Reader",
   162  		Reader: strings.NewReader("abcdefg"),
   163  		Result: 7,
   164  	},
   165  	{
   166  		Name:   "*bytes.Reader",
   167  		Reader: bytes.NewReader([]byte("abcdefg")),
   168  		Result: 7,
   169  	},
   170  }
   171  
   172  func TestReader_Size(t *testing.T) {
   173  	for _, v := range readerSizeTests {
   174  		reader, _ := NewReader(v.Reader, 2)
   175  		result := reader.Size()
   176  		if result != v.Result {
   177  			t.Errorf("%s: result = %d, want %d", v.Name, result, v.Result)
   178  		}
   179  	}
   180  }