depager_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package depager
  2. import (
  3. "fmt"
  4. "testing"
  5. )
  6. type NoopClient[T any] struct {
  7. err error
  8. pages []*Aggr[T]
  9. m int
  10. cnt uint64
  11. }
  12. func (c *NoopClient[T]) NextPage(
  13. page Page[T],
  14. _offset uint64,
  15. ) (cnt uint64, err error) {
  16. if len(c.pages) == 0 {
  17. return
  18. }
  19. if c.m >= len(c.pages) {
  20. err = fmt.Errorf("client: next page: exceeded max pages")
  21. return
  22. }
  23. src := *c.pages[c.m]
  24. dst := *page.(*Aggr[T])
  25. dst = dst[:min(cap(dst), len(src))]
  26. copy(dst, src) // update values
  27. *page.(*Aggr[T]) = dst // update slice
  28. cnt = c.cnt
  29. err = c.err
  30. c.m++
  31. return
  32. }
  33. func NewNoopClient[T any](
  34. cnt int,
  35. err error,
  36. pages []*Aggr[T],
  37. ) Client[T] {
  38. return &NoopClient[T]{
  39. cnt: uint64(cnt),
  40. err: err,
  41. pages: pages,
  42. }
  43. }
  44. type Aggr[T any] []T
  45. func (a *Aggr[T]) Elems() []T {
  46. return []T(*a)
  47. }
  48. func (a *Aggr[T]) URI() string {
  49. return ""
  50. }
  51. func TestUsingNoopClient(t *testing.T) {
  52. client := NewNoopClient[any](1, nil, []*Aggr[any]{{}})
  53. pagePool := make(chan Page[any], 1)
  54. for i := 0; i < cap(pagePool); i++ {
  55. tmp := Aggr[any](make([]any, 0, 1))
  56. pagePool <- &tmp
  57. }
  58. pager := NewPager(client, pagePool)
  59. for range pager.Iter() {
  60. }
  61. if err := pager.LastErr(); err != nil {
  62. t.Errorf("unexpected error in pager with noop client: %v", err)
  63. }
  64. }
  65. func TestNoopClientReturnsError(t *testing.T) {
  66. client := NewNoopClient[any](0, fmt.Errorf("whomp"),
  67. []*Aggr[any]{{}},
  68. )
  69. pagePool := make(chan Page[any], 1)
  70. for i := 0; i < cap(pagePool); i++ {
  71. tmp := Aggr[any](make([]any, 0))
  72. pagePool <- &tmp
  73. }
  74. pager := NewPager(client, pagePool)
  75. for range pager.Iter() {
  76. }
  77. if err := pager.LastErr(); err == nil {
  78. t.Errorf("unexpected success: %v", err)
  79. }
  80. }
  81. func TestClientReturnsNonemptyPage(t *testing.T) {
  82. itemCount := 3
  83. client := NewNoopClient[any](itemCount, nil,
  84. []*Aggr[any]{{1, 2}, {3}},
  85. )
  86. pagePool := make(chan Page[any], 1)
  87. for i := 0; i < cap(pagePool); i++ {
  88. tmp := Aggr[any](make([]any, 0, 2))
  89. pagePool <- &tmp
  90. }
  91. pager := NewPager(client, pagePool)
  92. var elem int
  93. for e := range pager.Iter() {
  94. elem = e.(int)
  95. }
  96. if err := pager.LastErr(); err != nil {
  97. t.Errorf("unexpected error in pager: %v", err)
  98. }
  99. if elem != 3 {
  100. t.Errorf("unexpected value: '%v'", elem)
  101. }
  102. }
  103. func TestClientReturnsNonemptyPage2(t *testing.T) {
  104. itemCount := 3
  105. client := NewNoopClient[any](itemCount, nil,
  106. []*Aggr[any]{{1, 2}, {3}},
  107. )
  108. pagePool := make(chan Page[any], 1)
  109. for i := 0; i < cap(pagePool); i++ {
  110. tmp := Aggr[any](make([]any, 0, 2))
  111. pagePool <- &tmp
  112. }
  113. pager := NewPager(client, pagePool)
  114. var elem int
  115. var i int
  116. for p := range pager.IterPages() {
  117. elem = p.Elems()[0].(int)
  118. i++
  119. pagePool <- p
  120. }
  121. if err := pager.LastErr(); err != nil {
  122. t.Errorf("unexpected error in pager: %v", err)
  123. }
  124. if elem != 3 {
  125. t.Errorf("unexpected value: '%v'", elem)
  126. }
  127. }
  128. func TestClientReturnsFewerPagesThanExpected(t *testing.T) {
  129. pageSize := 1
  130. itemCount := pageSize + 1
  131. client := NewNoopClient[any](itemCount, nil,
  132. []*Aggr[any]{{0}},
  133. )
  134. pagePool := make(chan Page[any], 1)
  135. for i := 0; i < cap(pagePool); i++ {
  136. tmp := Aggr[any](make([]any, 0, 1))
  137. pagePool <- &tmp
  138. }
  139. pager := NewPager(client, pagePool)
  140. for range pager.Iter() {
  141. }
  142. if err := pager.LastErr(); err == nil {
  143. t.Errorf("unexpected success in pager: %v", err)
  144. }
  145. }