github.com/Schaudge/grailbase@v0.0.0-20240223061707-44c758a471c0/file/fsnode/iterators_test.go (about)

     1  package fsnode
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"io"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestSliceAll(t *testing.T) {
    14  	ctx := context.Background()
    15  	nodes := []mockLeaf{{id: 0}, {id: 1}, {id: 2}}
    16  	got, err := IterateAll(ctx, NewIterator(nodes[0], nodes[1], nodes[2]))
    17  	require.NoError(t, err)
    18  	assert.Equal(t, []T{nodes[0], nodes[1], nodes[2]}, got)
    19  }
    20  
    21  func TestSliceFull(t *testing.T) {
    22  	ctx := context.Background()
    23  	nodes := []mockLeaf{{id: 0}, {id: 1}, {id: 2}}
    24  	dst := make([]T, 2)
    25  
    26  	iter := NewIterator(nodes[0], nodes[1], nodes[2])
    27  	got, err := IterateFull(ctx, iter, dst)
    28  	require.NoError(t, err)
    29  	assert.Equal(t, 2, got)
    30  	assert.Equal(t, []T{nodes[0], nodes[1]}, dst)
    31  
    32  	got, err = IterateFull(ctx, iter, dst)
    33  	assert.ErrorIs(t, err, io.EOF)
    34  	assert.Equal(t, 1, got)
    35  	assert.Equal(t, []T{nodes[2]}, dst[:1])
    36  }
    37  
    38  func TestLazy(t *testing.T) {
    39  	ctx := context.Background()
    40  	nodes := []mockLeaf{{id: 0}, {id: 1}, {id: 2}}
    41  	makeNodes := func(context.Context) ([]T, error) {
    42  		return []T{nodes[0], nodes[1], nodes[2]}, nil
    43  	}
    44  	got, err := IterateAll(ctx, NewLazyIterator(makeNodes))
    45  	require.NoError(t, err)
    46  	assert.Equal(t, []T{nodes[0], nodes[1], nodes[2]}, got)
    47  }
    48  
    49  func TestLazyErr(t *testing.T) {
    50  	ctx := context.Background()
    51  	makeNodes := func(context.Context) ([]T, error) {
    52  		return nil, errors.New("test error")
    53  	}
    54  	_, err := IterateAll(ctx, NewLazyIterator(makeNodes))
    55  	require.Error(t, err)
    56  	require.Contains(t, err.Error(), "test error")
    57  }
    58  
    59  func TestConcatAll(t *testing.T) {
    60  	ctx := context.Background()
    61  	nodes := []mockLeaf{{id: 0}, {id: 1}, {id: 2}, {id: 3}}
    62  	iter := NewConcatIterator(
    63  		NewIterator(),
    64  		NewIterator(nodes[0]),
    65  		NewIterator(),
    66  		NewIterator(),
    67  		NewIterator(nodes[1], nodes[2], nodes[3]),
    68  		NewIterator(),
    69  	)
    70  	got, err := IterateAll(ctx, iter)
    71  	require.NoError(t, err)
    72  	assert.Equal(t, []T{nodes[0], nodes[1], nodes[2], nodes[3]}, got)
    73  }
    74  
    75  func TestConcatFull(t *testing.T) {
    76  	ctx := context.Background()
    77  	nodes := []mockLeaf{{id: 0}, {id: 1}, {id: 2}, {id: 3}}
    78  	iter := NewConcatIterator(
    79  		NewIterator(),
    80  		NewIterator(nodes[0]),
    81  		NewIterator(),
    82  		NewIterator(),
    83  		NewIterator(nodes[1], nodes[2], nodes[3]),
    84  		NewIterator(),
    85  	)
    86  
    87  	var dst []T
    88  	got, err := IterateFull(ctx, iter, dst)
    89  	require.NoError(t, err)
    90  	assert.Equal(t, 0, got)
    91  
    92  	dst = make([]T, 3)
    93  	got, err = IterateFull(ctx, iter, dst[:2])
    94  	require.NoError(t, err)
    95  	assert.Equal(t, 2, got)
    96  	assert.Equal(t, []T{nodes[0], nodes[1]}, dst[:2])
    97  
    98  	got, err = IterateFull(ctx, iter, dst[:1])
    99  	require.NoError(t, err)
   100  	assert.Equal(t, 1, got)
   101  	assert.Equal(t, []T{nodes[2]}, dst[:1])
   102  
   103  	got, err = IterateFull(ctx, iter, dst)
   104  	assert.ErrorIs(t, err, io.EOF)
   105  	assert.Equal(t, 1, got)
   106  	assert.Equal(t, []T{nodes[3]}, dst[:1])
   107  }
   108  
   109  type mockLeaf struct {
   110  	Leaf
   111  	id int
   112  }