Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

z_readme_filetest.gno

3.22 Kb · 109 lines
  1// End-to-end scenario from the package README: a group with a base set and
  2// three roles, exercising base vs aggregated semantics, dedup, role
  3// removal, and readonly views.
  4package main
  5
  6import (
  7	"strings"
  8
  9	"gno.land/p/nt/groups/v0"
 10)
 11
 12var (
 13	alice = address("alice") // base only
 14	bob   = address("bob")   // base + council
 15	carol = address("carol") // base + admin
 16	dave  = address("dave")  // council only
 17	eve   = address("eve")   // admin + moderator
 18	frank = address("frank") // moderator only
 19	grace = address("grace") // admin only
 20	zed   = address("zed")   // not a member
 21)
 22
 23func main() {
 24	// 1. A group with a base set and three named roles.
 25	g := groups.NewGroup()
 26	g.Add(alice)
 27	g.Add(bob)
 28	g.Add(carol)
 29
 30	admin, _ := g.AddRole("admin")
 31	admin.Members().Add(carol)
 32	admin.Members().Add(eve)
 33	admin.Members().Add(grace)
 34
 35	council, _ := g.AddRole("council")
 36	council.Members().Add(bob)
 37	council.Members().Add(dave)
 38
 39	moderator, _ := g.AddRole("moderator")
 40	moderator.Members().Add(eve)
 41	moderator.Members().Add(frank)
 42
 43	// 2. Has (base only) vs HasAny (base + roles).
 44	println("Has(alice):", g.Has(alice))     // base member
 45	println("Has(dave):", g.Has(dave))       // council only, not base
 46	println("HasAny(dave):", g.HasAny(dave)) // somewhere in the group
 47	println("HasAny(zed):", g.HasAny(zed))   // nowhere
 48
 49	// 3. Size (base only) vs TotalSize (deduplicated across everything).
 50	println("Size:", g.Size())
 51	println("TotalSize:", g.TotalSize())
 52
 53	// 4. Iterate walks the base set; IterateAll walks base then roles in
 54	// name order, yielding each distinct address once.
 55	print("Iterate:")
 56	g.Iterate(0, 10, func(a address) bool {
 57		print(" " + string(a))
 58		return false
 59	})
 60	println()
 61	print("IterateAll:")
 62	g.IterateAll(0, 10, func(a address) bool {
 63		print(" " + string(a))
 64		return false
 65	})
 66	println()
 67
 68	// 5. RolesContaining lists role names in lexicographic order; the
 69	// base set is not a role.
 70	println("RolesContaining(eve):", strings.Join(g.RolesContaining(eve), ","))
 71	println("RolesContaining(alice):", strings.Join(g.RolesContaining(alice), ","))
 72
 73	// 6. Removing a role discards only the role: its members survive in
 74	// the base set and in other roles.
 75	g.RemoveRole("admin")
 76	println("after RemoveRole(admin):")
 77	println("Has(carol):", g.Has(carol))       // still a base member
 78	println("HasAny(eve):", g.HasAny(eve))     // still a moderator
 79	println("HasAny(grace):", g.HasAny(grace)) // was admin only, now gone
 80	println("TotalSize:", g.TotalSize())
 81
 82	// 7. A readonly view mirrors every read and exposes no mutators; it
 83	// is the only handle meant to cross a realm boundary.
 84	rg := g.Readonly()
 85	println("readonly Size:", rg.Size())
 86	println("readonly HasAny(dave):", rg.HasAny(dave))
 87	rr, _ := rg.GetRole("moderator")
 88	println("readonly moderator members:", rr.Members().Size())
 89}
 90
 91// Output:
 92// Has(alice): true
 93// Has(dave): false
 94// HasAny(dave): true
 95// HasAny(zed): false
 96// Size: 3
 97// TotalSize: 7
 98// Iterate: alice bob carol
 99// IterateAll: alice bob carol eve grace dave frank
100// RolesContaining(eve): admin,moderator
101// RolesContaining(alice):
102// after RemoveRole(admin):
103// Has(carol): true
104// HasAny(eve): true
105// HasAny(grace): false
106// TotalSize: 6
107// readonly Size: 3
108// readonly HasAny(dave): true
109// readonly moderator members: 2