depager_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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 TestUsingNoopClient(t *testing.T) {
  49. client := NewNoopClient[any](1, nil, []*Aggr[any]{{}})
  50. pagePool := make(chan Page[any], 1)
  51. for i := 0; i < cap(pagePool); i++ {
  52. tmp := Aggr[any](make([]any, 0, 1))
  53. pagePool <- &tmp
  54. }
  55. pager := NewPager(client, pagePool)
  56. for range pager.Iter() {
  57. }
  58. if err := pager.LastErr(); err != nil {
  59. t.Errorf("unexpected error in pager with noop client: %v", err)
  60. }
  61. }
  62. func TestNoopClientReturnsError(t *testing.T) {
  63. client := NewNoopClient[any](0, fmt.Errorf("whomp"),
  64. []*Aggr[any]{{}},
  65. )
  66. pagePool := make(chan Page[any], 1)
  67. for i := 0; i < cap(pagePool); i++ {
  68. tmp := Aggr[any](make([]any, 0))
  69. pagePool <- &tmp
  70. }
  71. pager := NewPager(client, pagePool)
  72. for range pager.Iter() {
  73. }
  74. if err := pager.LastErr(); err == nil {
  75. t.Errorf("unexpected success: %v", err)
  76. }
  77. }
  78. func TestClientReturnsNonemptyPage(t *testing.T) {
  79. itemCount := 3
  80. client := NewNoopClient[any](itemCount, nil,
  81. []*Aggr[any]{{1, 2}, {3}},
  82. )
  83. pagePool := make(chan Page[any], 1)
  84. for i := 0; i < cap(pagePool); i++ {
  85. tmp := Aggr[any](make([]any, 0, 2))
  86. pagePool <- &tmp
  87. }
  88. pager := NewPager(client, pagePool)
  89. var elem int
  90. for e := range pager.Iter() {
  91. elem = e.(int)
  92. }
  93. if err := pager.LastErr(); err != nil {
  94. t.Errorf("unexpected error in pager: %v", err)
  95. }
  96. if elem != 3 {
  97. t.Errorf("unexpected value: '%v'", elem)
  98. }
  99. }
  100. func TestClientReturnsNonemptyPage2(t *testing.T) {
  101. itemCount := 3
  102. client := NewNoopClient[any](itemCount, nil,
  103. []*Aggr[any]{{1, 2}, {3}},
  104. )
  105. pagePool := make(chan Page[any], 1)
  106. for i := 0; i < cap(pagePool); i++ {
  107. tmp := Aggr[any](make([]any, 0, 2))
  108. pagePool <- &tmp
  109. }
  110. pager := NewPager(client, pagePool)
  111. var elem int
  112. var i int
  113. for p := range pager.IterPages() {
  114. elem = p.Elems()[0].(int)
  115. i++
  116. pagePool <- p
  117. }
  118. if err := pager.LastErr(); err != nil {
  119. t.Errorf("unexpected error in pager: %v", err)
  120. }
  121. if elem != 3 {
  122. t.Errorf("unexpected value: '%v'", elem)
  123. }
  124. }
  125. func TestClientReturnsFewerPagesThanExpected(t *testing.T) {
  126. pageSize := 1
  127. itemCount := pageSize + 1
  128. client := NewNoopClient[any](itemCount, nil,
  129. []*Aggr[any]{{0}},
  130. )
  131. pagePool := make(chan Page[any], 1)
  132. for i := 0; i < cap(pagePool); i++ {
  133. tmp := Aggr[any](make([]any, 0, 1))
  134. pagePool <- &tmp
  135. }
  136. pager := NewPager(client, pagePool)
  137. for range pager.Iter() {
  138. }
  139. if err := pager.LastErr(); err == nil {
  140. t.Errorf("unexpected success in pager: %v", err)
  141. }
  142. }