123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- package depager
- import (
- "context"
- "fmt"
- "testing"
- )
- type NoopClient[T any] struct {
- err error
- pages []*Aggr[T]
- m int
- cnt uint64
- }
- func (c *NoopClient[T]) NextPage(
- page Page[T],
- _offset uint64,
- ) (err error) {
- if len(c.pages) == 0 {
- return
- }
- if c.m >= len(c.pages) {
- err = fmt.Errorf("client: next page: exceeded max pages")
- return
- }
- src := *c.pages[c.m]
- dst := *page.(*Aggr[T])
- dst = dst[:min(cap(dst), len(src))]
- copy(dst, src) // update values
- *page.(*Aggr[T]) = dst // update slice
- AggrCount = c.cnt
- err = c.err
- c.m++
- return
- }
- func NewNoopClient[T any](
- cnt int,
- err error,
- pages []*Aggr[T],
- ) Client[T] {
- return &NoopClient[T]{
- cnt: uint64(cnt),
- err: err,
- pages: pages,
- }
- }
- var AggrCount uint64
- type Aggr[T any] []T
- func (a *Aggr[T]) Elems() []T {
- return []T(*a)
- }
- func (a *Aggr[T]) URI() string {
- return ""
- }
- func (a *Aggr[T]) Count() uint64 {
- return AggrCount
- }
- func TestUsingNoopClient(t *testing.T) {
- client := NewNoopClient[any](1, nil, []*Aggr[any]{{}})
- pagePool := make(chan Page[any], 1)
- for i := 0; i < cap(pagePool); i++ {
- tmp := Aggr[any](make([]any, 0, 1))
- pagePool <- &tmp
- }
- pager := NewPager(context.Background(), client, pagePool)
- for range pager.Iter() {
- }
- if err := pager.LastErr(); err != nil {
- t.Errorf("unexpected error in pager with noop client: %v", err)
- }
- }
- func TestNoopClientReturnsError(t *testing.T) {
- client := NewNoopClient[any](0, fmt.Errorf("whomp"),
- []*Aggr[any]{{}},
- )
- pagePool := make(chan Page[any], 1)
- for i := 0; i < cap(pagePool); i++ {
- tmp := Aggr[any](make([]any, 0))
- pagePool <- &tmp
- }
- pager := NewPager(context.Background(), client, pagePool)
- for range pager.Iter() {
- }
- if err := pager.LastErr(); err == nil {
- t.Errorf("unexpected success: %v", err)
- }
- }
- func TestClientReturnsNonemptyPage(t *testing.T) {
- itemCount := 3
- client := NewNoopClient[any](itemCount, nil,
- []*Aggr[any]{{1, 2}, {3}},
- )
- pagePool := make(chan Page[any], 1)
- for i := 0; i < cap(pagePool); i++ {
- tmp := Aggr[any](make([]any, 0, 2))
- pagePool <- &tmp
- }
- pager := NewPager(context.Background(), client, pagePool)
- var elem int
- for e := range pager.Iter() {
- elem = e.(int)
- }
- if err := pager.LastErr(); err != nil {
- t.Errorf("unexpected error in pager: %v", err)
- }
- if elem != 3 {
- t.Errorf("unexpected value: '%v'", elem)
- }
- }
- func TestClientReturnsNonemptyPage2(t *testing.T) {
- itemCount := 3
- client := NewNoopClient[any](itemCount, nil,
- []*Aggr[any]{{1, 2}, {3}},
- )
- pagePool := make(chan Page[any], 1)
- for i := 0; i < cap(pagePool); i++ {
- tmp := Aggr[any](make([]any, 0, 2))
- pagePool <- &tmp
- }
- pager := NewPager(context.Background(), client, pagePool)
- var elem int
- var i int
- for p := range pager.IterPages() {
- elem = p.Elems()[0].(int)
- i++
- pagePool <- p
- }
- if err := pager.LastErr(); err != nil {
- t.Errorf("unexpected error in pager: %v", err)
- }
- if elem != 3 {
- t.Errorf("unexpected value: '%v'", elem)
- }
- }
- func TestClientReturnsFewerPagesThanExpected(t *testing.T) {
- pageSize := 1
- itemCount := pageSize + 1
- client := NewNoopClient[any](itemCount, nil,
- []*Aggr[any]{{0}},
- )
- pagePool := make(chan Page[any], 1)
- for i := 0; i < cap(pagePool); i++ {
- tmp := Aggr[any](make([]any, 0, 1))
- pagePool <- &tmp
- }
- pager := NewPager(context.Background(), client, pagePool)
- for range pager.Iter() {
- }
- if err := pager.LastErr(); err == nil {
- t.Errorf("unexpected success in pager: %v", err)
- }
- }
|