PathrockNetwork Gno Explorer
HomeBlocksTransactionsRealmsPackagesValidatorsAnalytics

PathrockNetwork Gno Explorer — an independent explorer for Gno.land Mainnet (gnoland-1), operated by PathrockNetwork. Not an official Gno.land service.

gnowebarchive RPC

gno.land/p/nt/bptree/pager/v0

Package
Open in gnoweb ↗

Overview

Kind
Pure package
Name
v0
Namespace
nt / bptree / pager
Files
4 (gnomod.toml)
Exported functions
n/a — not supported for pure packages by the node (vm/qfuncs)
Module
gno.land/p/nt/bptree/pager/v0
gno
0.9

Files (4)

  • gnomod.tomltoml
  • pager.gnogno
  • example_test.gnogno
  • pager_test.gnogno
pager_test.gnogno
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&param2=value2",256			expected:   "**1** | [2](?page=2&param1=value1&param2=value2) | [3](?page=3&param1=value1&param2=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}282

Functions

not supported for pure packages by the node (vm/qfuncs)

Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.