1package pager23import (4 "testing"56 "gno.land/p/nt/bptree/v0"7 "gno.land/p/nt/uassert/v0"8 "gno.land/p/nt/ufmt/v0"9 "gno.land/p/nt/urequire/v0"10)1112func TestPager_GetPage(t *testing.T) {13 // Create a new B+ tree and populate it with some key-value pairs.14 tree := bptree.NewBPTree32()15 tree.Set("a", 1)16 tree.Set("b", 2)17 tree.Set("c", 3)18 tree.Set("d", 4)19 tree.Set("e", 5)2021 t.Run("normal ordering", func(t *testing.T) {22 // Create a new pager.23 pager := NewPager(tree, 10, false)2425 // Define test cases.26 tests := []struct {27 pageNumber int28 pageSize int29 expected []Item30 }{31 {1, 2, []Item{{Key: "a", Value: 1}, {Key: "b", Value: 2}}},32 {2, 2, []Item{{Key: "c", Value: 3}, {Key: "d", Value: 4}}},33 {3, 2, []Item{{Key: "e", Value: 5}}},34 {1, 3, []Item{{Key: "a", Value: 1}, {Key: "b", Value: 2}, {Key: "c", Value: 3}}},35 {2, 3, []Item{{Key: "d", Value: 4}, {Key: "e", Value: 5}}},36 {1, 5, []Item{{Key: "a", Value: 1}, {Key: "b", Value: 2}, {Key: "c", Value: 3}, {Key: "d", Value: 4}, {Key: "e", Value: 5}}},37 {2, 5, []Item{}},38 }3940 for _, tt := range tests {41 page := pager.GetPageWithSize(tt.pageNumber, tt.pageSize)4243 uassert.Equal(t, len(tt.expected), len(page.Items))4445 for i, item := range page.Items {46 uassert.Equal(t, tt.expected[i].Key, item.Key)47 uassert.Equal(t, tt.expected[i].Value, item.Value)48 }49 }50 })5152 t.Run("reversed ordering", func(t *testing.T) {53 // Create a new pager.54 pager := NewPager(tree, 10, true)5556 // Define test cases.57 tests := []struct {58 pageNumber int59 pageSize int60 expected []Item61 }{62 {1, 2, []Item{{Key: "e", Value: 5}, {Key: "d", Value: 4}}},63 {2, 2, []Item{{Key: "c", Value: 3}, {Key: "b", Value: 2}}},64 {3, 2, []Item{{Key: "a", Value: 1}}},65 {1, 3, []Item{{Key: "e", Value: 5}, {Key: "d", Value: 4}, {Key: "c", Value: 3}}},66 {2, 3, []Item{{Key: "b", Value: 2}, {Key: "a", Value: 1}}},67 {1, 5, []Item{{Key: "e", Value: 5}, {Key: "d", Value: 4}, {Key: "c", Value: 3}, {Key: "b", Value: 2}, {Key: "a", Value: 1}}},68 {2, 5, []Item{}},69 }7071 for _, tt := range tests {72 page := pager.GetPageWithSize(tt.pageNumber, tt.pageSize)7374 uassert.Equal(t, len(tt.expected), len(page.Items))7576 for i, item := range page.Items {77 uassert.Equal(t, tt.expected[i].Key, item.Key)78 uassert.Equal(t, tt.expected[i].Value, item.Value)79 }80 }81 })82}8384func TestPager_GetPageByPath(t *testing.T) {85 // Create a new B+ tree and populate it with some key-value pairs.86 tree := bptree.NewBPTree32()87 for i := 0; i < 50; i++ {88 tree.Set(ufmt.Sprintf("key%d", i), i)89 }9091 // Create a new pager.92 pager := NewPager(tree, 10, false)9394 // Define test cases.95 tests := []struct {96 rawURL string97 expectedPage int98 expectedSize int99 }{100 {"/r/foo:bar/baz?size=10&page=1", 1, 10},101 {"/r/foo:bar/baz?size=10&page=2", 2, 10},102 {"/r/foo:bar/baz?page=3", 3, pager.DefaultPageSize},103 {"/r/foo:bar/baz?size=20", 1, 20},104 {"/r/foo:bar/baz", 1, pager.DefaultPageSize},105 }106107 for _, tt := range tests {108 page, err := pager.GetPageByPath(tt.rawURL)109 urequire.NoError(t, err, ufmt.Sprintf("GetPageByPath(%s) returned error: %v", tt.rawURL, err))110111 uassert.Equal(t, tt.expectedPage, page.PageNumber)112 uassert.Equal(t, tt.expectedSize, page.PageSize)113 }114}115116func TestPage_Picker(t *testing.T) {117 // Create a new B+ tree and populate it with some key-value pairs.118 tree := bptree.NewBPTree32()119 tree.Set("a", 1)120 tree.Set("b", 2)121 tree.Set("c", 3)122 tree.Set("d", 4)123 tree.Set("e", 5)124125 // Create a new pager.126 pager := NewPager(tree, 10, false)127128 // Define test cases.129 tests := []struct {130 pageNumber int131 pageSize int132 path string133 expected string134 }{135 {1, 2, "/test", "**1** | [2](?page=2) | [3](?page=3)"},136 {2, 2, "/test", "[1](?page=1) | **2** | [3](?page=3)"},137 {3, 2, "/test", "[1](?page=1) | [2](?page=2) | **3**"},138 {1, 2, "/test?foo=bar", "**1** | [2](?page=2&foo=bar) | [3](?page=3&foo=bar)"},139 }140141 for _, tt := range tests {142 page := pager.GetPageWithSize(tt.pageNumber, tt.pageSize)143144 ui := page.Picker(tt.path)145 uassert.Equal(t, tt.expected, ui)146 }147}148149func TestPager_UI_WithManyPages(t *testing.T) {150 // Create a new B+ tree and populate it with many key-value pairs.151 tree := bptree.NewBPTree32()152 for i := 0; i < 100; i++ {153 tree.Set(ufmt.Sprintf("key%d", i), i)154 }155156 // Create a new pager.157 pager := NewPager(tree, 10, false)158159 // Define test cases for a large number of pages.160 tests := []struct {161 pageNumber int162 pageSize int163 path string164 expected string165 }{166 {1, 10, "/test", "**1** | [2](?page=2) | [3](?page=3) | … | [10](?page=10)"},167 {2, 10, "/test", "[1](?page=1) | **2** | [3](?page=3) | [4](?page=4) | … | [10](?page=10)"},168 {3, 10, "/test", "[1](?page=1) | [2](?page=2) | **3** | [4](?page=4) | [5](?page=5) | … | [10](?page=10)"},169 {4, 10, "/test", "[1](?page=1) | [2](?page=2) | [3](?page=3) | **4** | [5](?page=5) | [6](?page=6) | … | [10](?page=10)"},170 {5, 10, "/test", "[1](?page=1) | … | [3](?page=3) | [4](?page=4) | **5** | [6](?page=6) | [7](?page=7) | … | [10](?page=10)"},171 {6, 10, "/test", "[1](?page=1) | … | [4](?page=4) | [5](?page=5) | **6** | [7](?page=7) | [8](?page=8) | … | [10](?page=10)"},172 {7, 10, "/test", "[1](?page=1) | … | [5](?page=5) | [6](?page=6) | **7** | [8](?page=8) | [9](?page=9) | [10](?page=10)"},173 {8, 10, "/test", "[1](?page=1) | … | [6](?page=6) | [7](?page=7) | **8** | [9](?page=9) | [10](?page=10)"},174 {9, 10, "/test", "[1](?page=1) | … | [7](?page=7) | [8](?page=8) | **9** | [10](?page=10)"},175 {10, 10, "/test", "[1](?page=1) | … | [8](?page=8) | [9](?page=9) | **10**"},176 }177178 for _, tt := range tests {179 page := pager.GetPageWithSize(tt.pageNumber, tt.pageSize)180181 ui := page.Picker(tt.path)182 uassert.Equal(t, tt.expected, ui)183 }184}185186func TestPager_ParseQuery(t *testing.T) {187 // Create a new B+ tree and populate it with some key-value pairs.188 tree := bptree.NewBPTree32()189 tree.Set("a", 1)190 tree.Set("b", 2)191 tree.Set("c", 3)192 tree.Set("d", 4)193 tree.Set("e", 5)194195 // Create a new pager.196 pager := NewPager(tree, 10, false)197198 // Define test cases.199 tests := []struct {200 rawURL string201 expectedPage int202 expectedSize int203 expectedError bool204 }{205 {"/r/foo:bar/baz?size=2&page=1", 1, 2, false},206 {"/r/foo:bar/baz?size=3&page=2", 2, 3, false},207 {"/r/foo:bar/baz?size=5&page=3", 3, 5, false},208 {"/r/foo:bar/baz?page=2", 2, pager.DefaultPageSize, false},209 {"/r/foo:bar/baz?size=3", 1, 3, false},210 {"/r/foo:bar/baz", 1, pager.DefaultPageSize, false},211 {"/r/foo:bar/baz?size=0&page=0", 1, pager.DefaultPageSize, false},212 }213214 for _, tt := range tests {215 page, size, err := pager.ParseQuery(tt.rawURL)216 if tt.expectedError {217 uassert.Error(t, err, ufmt.Sprintf("ParseQuery(%s) expected error but got none", tt.rawURL))218 } else {219 urequire.NoError(t, err, ufmt.Sprintf("ParseQuery(%s) returned error: %v", tt.rawURL, err))220 uassert.Equal(t, tt.expectedPage, page, ufmt.Sprintf("ParseQuery(%s) returned page %d, expected %d", tt.rawURL, page, tt.expectedPage))221 uassert.Equal(t, tt.expectedSize, size, ufmt.Sprintf("ParseQuery(%s) returned size %d, expected %d", tt.rawURL, size, tt.expectedSize))222 }223 }224}225226func TestPage_PickerQueryParamPreservation(t *testing.T) {227 tree := bptree.NewBPTree32()228 for i := 1; i <= 6; i++ {229 tree.Set(ufmt.Sprintf("key%d", i), i)230 }231232 pager := NewPager(tree, 2, false)233234 tests := []struct {235 name string236 pageNumber int237 path string238 expected string239 }{240 {241 name: "single query param",242 pageNumber: 1,243 path: "/test?foo=bar",244 expected: "**1** | [2](?page=2&foo=bar) | [3](?page=3&foo=bar)",245 },246 {247 name: "multiple query params",248 pageNumber: 2,249 path: "/test?foo=bar&baz=qux",250 expected: "[1](?page=1&baz=qux&foo=bar) | **2** | [3](?page=3&baz=qux&foo=bar)",251 },252 {253 name: "overwrite existing page param",254 pageNumber: 1,255 path: "/test?param1=value1&page=999¶m2=value2",256 expected: "**1** | [2](?page=2¶m1=value1¶m2=value2) | [3](?page=3¶m1=value1¶m2=value2)",257 },258 {259 name: "empty query string",260 pageNumber: 2,261 path: "/test",262 expected: "[1](?page=1) | **2** | [3](?page=3)",263 },264 {265 name: "query string with only page param",266 pageNumber: 2,267 path: "/test?page=2",268 expected: "[1](?page=1) | **2** | [3](?page=3)",269 },270 }271272 for _, tt := range tests {273 t.Run(tt.name, func(t *testing.T) {274 page := pager.GetPageWithSize(tt.pageNumber, 2)275 result := page.Picker(tt.path)276 if result != tt.expected {277 t.Errorf("\nwant: %s\ngot: %s", tt.expected, result)278 }279 })280 }281}282Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.