You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

paginator_test.go 8.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. // Copyright 2022 The Gitea Authors.
  2. // Copyright 2015 https://github.com/unknwon. Licensed under the Apache License, Version 2.0
  3. // SPDX-License-Identifier: Apache-2.0
  4. package paginator
  5. import (
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. func TestPaginator(t *testing.T) {
  10. t.Run("Basic logics", func(t *testing.T) {
  11. p := New(0, -1, -1, 0)
  12. assert.Equal(t, 1, p.PagingNum())
  13. assert.True(t, p.IsFirst())
  14. assert.False(t, p.HasPrevious())
  15. assert.Equal(t, 1, p.Previous())
  16. assert.False(t, p.HasNext())
  17. assert.Equal(t, 1, p.Next())
  18. assert.True(t, p.IsLast())
  19. assert.Equal(t, 0, p.Total())
  20. p = New(1, 10, 2, 0)
  21. assert.Equal(t, 10, p.PagingNum())
  22. assert.True(t, p.IsFirst())
  23. assert.False(t, p.HasPrevious())
  24. assert.False(t, p.HasNext())
  25. assert.True(t, p.IsLast())
  26. p = New(10, 10, 1, 0)
  27. assert.Equal(t, 10, p.PagingNum())
  28. assert.True(t, p.IsFirst())
  29. assert.False(t, p.HasPrevious())
  30. assert.False(t, p.HasNext())
  31. assert.True(t, p.IsLast())
  32. p = New(11, 10, 1, 0)
  33. assert.Equal(t, 10, p.PagingNum())
  34. assert.True(t, p.IsFirst())
  35. assert.False(t, p.HasPrevious())
  36. assert.True(t, p.HasNext())
  37. assert.Equal(t, 2, p.Next())
  38. assert.False(t, p.IsLast())
  39. p = New(11, 10, 2, 0)
  40. assert.Equal(t, 10, p.PagingNum())
  41. assert.False(t, p.IsFirst())
  42. assert.True(t, p.HasPrevious())
  43. assert.Equal(t, 1, p.Previous())
  44. assert.False(t, p.HasNext())
  45. assert.True(t, p.IsLast())
  46. p = New(20, 10, 2, 0)
  47. assert.Equal(t, 10, p.PagingNum())
  48. assert.False(t, p.IsFirst())
  49. assert.True(t, p.HasPrevious())
  50. assert.False(t, p.HasNext())
  51. assert.True(t, p.IsLast())
  52. p = New(25, 10, 2, 0)
  53. assert.Equal(t, 10, p.PagingNum())
  54. assert.False(t, p.IsFirst())
  55. assert.True(t, p.HasPrevious())
  56. assert.True(t, p.HasNext())
  57. assert.False(t, p.IsLast())
  58. })
  59. t.Run("Generate pages", func(t *testing.T) {
  60. p := New(0, 10, 1, 0)
  61. pages := p.Pages()
  62. assert.Empty(t, pages)
  63. })
  64. t.Run("Only current page", func(t *testing.T) {
  65. p := New(0, 10, 1, 1)
  66. pages := p.Pages()
  67. assert.Len(t, pages, 1)
  68. assert.Equal(t, 1, pages[0].Num())
  69. assert.True(t, pages[0].IsCurrent())
  70. p = New(1, 10, 1, 1)
  71. pages = p.Pages()
  72. assert.Len(t, pages, 1)
  73. assert.Equal(t, 1, pages[0].Num())
  74. assert.True(t, pages[0].IsCurrent())
  75. })
  76. t.Run("Total page number is less or equal", func(t *testing.T) {
  77. p := New(1, 10, 1, 2)
  78. pages := p.Pages()
  79. assert.Len(t, pages, 1)
  80. assert.Equal(t, 1, pages[0].Num())
  81. assert.True(t, pages[0].IsCurrent())
  82. p = New(11, 10, 1, 2)
  83. pages = p.Pages()
  84. assert.Len(t, pages, 2)
  85. assert.Equal(t, 1, pages[0].Num())
  86. assert.True(t, pages[0].IsCurrent())
  87. assert.Equal(t, 2, pages[1].Num())
  88. assert.False(t, pages[1].IsCurrent())
  89. p = New(11, 10, 2, 2)
  90. pages = p.Pages()
  91. assert.Len(t, pages, 2)
  92. assert.Equal(t, 1, pages[0].Num())
  93. assert.False(t, pages[0].IsCurrent())
  94. assert.Equal(t, 2, pages[1].Num())
  95. assert.True(t, pages[1].IsCurrent())
  96. p = New(25, 10, 2, 3)
  97. pages = p.Pages()
  98. assert.Len(t, pages, 3)
  99. assert.Equal(t, 1, pages[0].Num())
  100. assert.False(t, pages[0].IsCurrent())
  101. assert.Equal(t, 2, pages[1].Num())
  102. assert.True(t, pages[1].IsCurrent())
  103. assert.Equal(t, 3, pages[2].Num())
  104. assert.False(t, pages[2].IsCurrent())
  105. })
  106. t.Run("Has more previous pages ", func(t *testing.T) {
  107. // ... 2
  108. p := New(11, 10, 2, 1)
  109. pages := p.Pages()
  110. assert.Len(t, pages, 2)
  111. assert.Equal(t, -1, pages[0].Num())
  112. assert.False(t, pages[0].IsCurrent())
  113. assert.Equal(t, 2, pages[1].Num())
  114. assert.True(t, pages[1].IsCurrent())
  115. // ... 2 3
  116. p = New(21, 10, 2, 2)
  117. pages = p.Pages()
  118. assert.Len(t, pages, 3)
  119. assert.Equal(t, -1, pages[0].Num())
  120. assert.False(t, pages[0].IsCurrent())
  121. assert.Equal(t, 2, pages[1].Num())
  122. assert.True(t, pages[1].IsCurrent())
  123. assert.Equal(t, 3, pages[2].Num())
  124. assert.False(t, pages[2].IsCurrent())
  125. // ... 2 3 4
  126. p = New(31, 10, 3, 3)
  127. pages = p.Pages()
  128. assert.Len(t, pages, 4)
  129. assert.Equal(t, -1, pages[0].Num())
  130. assert.False(t, pages[0].IsCurrent())
  131. assert.Equal(t, 2, pages[1].Num())
  132. assert.False(t, pages[1].IsCurrent())
  133. assert.Equal(t, 3, pages[2].Num())
  134. assert.True(t, pages[2].IsCurrent())
  135. assert.Equal(t, 4, pages[3].Num())
  136. assert.False(t, pages[3].IsCurrent())
  137. // ... 3 4 5
  138. p = New(41, 10, 4, 3)
  139. pages = p.Pages()
  140. assert.Len(t, pages, 4)
  141. assert.Equal(t, -1, pages[0].Num())
  142. assert.False(t, pages[0].IsCurrent())
  143. assert.Equal(t, 3, pages[1].Num())
  144. assert.False(t, pages[1].IsCurrent())
  145. assert.Equal(t, 4, pages[2].Num())
  146. assert.True(t, pages[2].IsCurrent())
  147. assert.Equal(t, 5, pages[3].Num())
  148. assert.False(t, pages[3].IsCurrent())
  149. // ... 4 5 6 7 8 9 10
  150. p = New(100, 10, 9, 7)
  151. pages = p.Pages()
  152. assert.Len(t, pages, 8)
  153. assert.Equal(t, -1, pages[0].Num())
  154. assert.False(t, pages[0].IsCurrent())
  155. assert.Equal(t, 4, pages[1].Num())
  156. assert.False(t, pages[1].IsCurrent())
  157. assert.Equal(t, 5, pages[2].Num())
  158. assert.False(t, pages[2].IsCurrent())
  159. assert.Equal(t, 6, pages[3].Num())
  160. assert.False(t, pages[3].IsCurrent())
  161. assert.Equal(t, 7, pages[4].Num())
  162. assert.False(t, pages[4].IsCurrent())
  163. assert.Equal(t, 8, pages[5].Num())
  164. assert.False(t, pages[5].IsCurrent())
  165. assert.Equal(t, 9, pages[6].Num())
  166. assert.True(t, pages[6].IsCurrent())
  167. assert.Equal(t, 10, pages[7].Num())
  168. assert.False(t, pages[7].IsCurrent())
  169. })
  170. t.Run("Has more next pages", func(t *testing.T) {
  171. // 1 ...
  172. p := New(21, 10, 1, 1)
  173. pages := p.Pages()
  174. assert.Len(t, pages, 2)
  175. assert.Equal(t, 1, pages[0].Num())
  176. assert.True(t, pages[0].IsCurrent())
  177. assert.Equal(t, -1, pages[1].Num())
  178. assert.False(t, pages[1].IsCurrent())
  179. // 1 2 ...
  180. p = New(21, 10, 1, 2)
  181. pages = p.Pages()
  182. assert.Len(t, pages, 3)
  183. assert.Equal(t, 1, pages[0].Num())
  184. assert.True(t, pages[0].IsCurrent())
  185. assert.Equal(t, 2, pages[1].Num())
  186. assert.False(t, pages[1].IsCurrent())
  187. assert.Equal(t, -1, pages[2].Num())
  188. assert.False(t, pages[2].IsCurrent())
  189. // 1 2 3 ...
  190. p = New(31, 10, 2, 3)
  191. pages = p.Pages()
  192. assert.Len(t, pages, 4)
  193. assert.Equal(t, 1, pages[0].Num())
  194. assert.False(t, pages[0].IsCurrent())
  195. assert.Equal(t, 2, pages[1].Num())
  196. assert.True(t, pages[1].IsCurrent())
  197. assert.Equal(t, 3, pages[2].Num())
  198. assert.False(t, pages[2].IsCurrent())
  199. assert.Equal(t, -1, pages[3].Num())
  200. assert.False(t, pages[3].IsCurrent())
  201. // 1 2 3 ...
  202. p = New(41, 10, 2, 3)
  203. pages = p.Pages()
  204. assert.Len(t, pages, 4)
  205. assert.Equal(t, 1, pages[0].Num())
  206. assert.False(t, pages[0].IsCurrent())
  207. assert.Equal(t, 2, pages[1].Num())
  208. assert.True(t, pages[1].IsCurrent())
  209. assert.Equal(t, 3, pages[2].Num())
  210. assert.False(t, pages[2].IsCurrent())
  211. assert.Equal(t, -1, pages[3].Num())
  212. assert.False(t, pages[3].IsCurrent())
  213. // 1 2 3 4 5 6 7 ...
  214. p = New(100, 10, 1, 7)
  215. pages = p.Pages()
  216. assert.Len(t, pages, 8)
  217. assert.Equal(t, 1, pages[0].Num())
  218. assert.True(t, pages[0].IsCurrent())
  219. assert.Equal(t, 2, pages[1].Num())
  220. assert.False(t, pages[1].IsCurrent())
  221. assert.Equal(t, 3, pages[2].Num())
  222. assert.False(t, pages[2].IsCurrent())
  223. assert.Equal(t, 4, pages[3].Num())
  224. assert.False(t, pages[3].IsCurrent())
  225. assert.Equal(t, 5, pages[4].Num())
  226. assert.False(t, pages[4].IsCurrent())
  227. assert.Equal(t, 6, pages[5].Num())
  228. assert.False(t, pages[5].IsCurrent())
  229. assert.Equal(t, 7, pages[6].Num())
  230. assert.False(t, pages[6].IsCurrent())
  231. assert.Equal(t, -1, pages[7].Num())
  232. assert.False(t, pages[7].IsCurrent())
  233. // 1 2 3 4 5 6 7 ...
  234. p = New(100, 10, 2, 7)
  235. pages = p.Pages()
  236. assert.Len(t, pages, 8)
  237. assert.Equal(t, 1, pages[0].Num())
  238. assert.False(t, pages[0].IsCurrent())
  239. assert.Equal(t, 2, pages[1].Num())
  240. assert.True(t, pages[1].IsCurrent())
  241. assert.Equal(t, 3, pages[2].Num())
  242. assert.False(t, pages[2].IsCurrent())
  243. assert.Equal(t, 4, pages[3].Num())
  244. assert.False(t, pages[3].IsCurrent())
  245. assert.Equal(t, 5, pages[4].Num())
  246. assert.False(t, pages[4].IsCurrent())
  247. assert.Equal(t, 6, pages[5].Num())
  248. assert.False(t, pages[5].IsCurrent())
  249. assert.Equal(t, 7, pages[6].Num())
  250. assert.False(t, pages[6].IsCurrent())
  251. assert.Equal(t, -1, pages[7].Num())
  252. assert.False(t, pages[7].IsCurrent())
  253. })
  254. t.Run("Has both more previous and next pages", func(t *testing.T) {
  255. // ... 2 3 ...
  256. p := New(35, 10, 2, 2)
  257. pages := p.Pages()
  258. assert.Len(t, pages, 4)
  259. assert.Equal(t, -1, pages[0].Num())
  260. assert.False(t, pages[0].IsCurrent())
  261. assert.Equal(t, 2, pages[1].Num())
  262. assert.True(t, pages[1].IsCurrent())
  263. assert.Equal(t, 3, pages[2].Num())
  264. assert.False(t, pages[2].IsCurrent())
  265. assert.Equal(t, -1, pages[3].Num())
  266. assert.False(t, pages[3].IsCurrent())
  267. // ... 2 3 4 ...
  268. p = New(49, 10, 3, 3)
  269. pages = p.Pages()
  270. assert.Len(t, pages, 5)
  271. assert.Equal(t, -1, pages[0].Num())
  272. assert.False(t, pages[0].IsCurrent())
  273. assert.Equal(t, 2, pages[1].Num())
  274. assert.False(t, pages[1].IsCurrent())
  275. assert.Equal(t, 3, pages[2].Num())
  276. assert.True(t, pages[2].IsCurrent())
  277. assert.Equal(t, 4, pages[3].Num())
  278. assert.False(t, pages[3].IsCurrent())
  279. assert.Equal(t, -1, pages[4].Num())
  280. assert.False(t, pages[4].IsCurrent())
  281. })
  282. }