gui/pkg/menu/menu_test.go
Snider 6f9285a48d
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
Harden menu builder against nil handles
2026-04-17 21:02:34 +01:00

130 lines
3 KiB
Go

// pkg/menu/menu_test.go
package menu
import (
"testing"
"github.com/stretchr/testify/assert"
)
func newTestManager() (*Manager, *mockPlatform) {
p := newMockPlatform()
return NewManager(p), p
}
func TestManager_Build_Good(t *testing.T) {
m, p := newTestManager()
items := []MenuItem{
{Label: "File"},
{Label: "Edit"},
}
menu := m.Build(items)
assert.NotNil(t, menu)
assert.Len(t, p.menus, 1)
assert.Len(t, p.menus[0].items, 2)
assert.Equal(t, "File", p.menus[0].items[0].label)
}
func TestManager_Build_Separator_Good(t *testing.T) {
m, p := newTestManager()
items := []MenuItem{
{Label: "Above"},
{Type: "separator"},
{Label: "Below"},
}
m.Build(items)
assert.Len(t, p.menus[0].items, 3)
assert.Equal(t, "---", p.menus[0].items[1].label)
}
func TestManager_Build_Submenu_Good(t *testing.T) {
m, p := newTestManager()
items := []MenuItem{
{Label: "Parent", Children: []MenuItem{
{Label: "Child 1"},
{Label: "Child 2"},
}},
}
m.Build(items)
assert.Len(t, p.menus[0].subs, 1)
assert.Len(t, p.menus[0].subs[0].items, 2)
}
func TestManager_Build_Accelerator_Good(t *testing.T) {
m, p := newTestManager()
items := []MenuItem{
{Label: "Save", Accelerator: "CmdOrCtrl+S"},
}
m.Build(items)
assert.Equal(t, "CmdOrCtrl+S", p.menus[0].items[0].accel)
}
func TestManager_Build_OnClick_Good(t *testing.T) {
m, p := newTestManager()
called := false
items := []MenuItem{
{Label: "Action", OnClick: func() { called = true }},
}
m.Build(items)
p.menus[0].items[0].onClick()
assert.True(t, called)
}
func TestManager_Build_Role_Good(t *testing.T) {
m, p := newTestManager()
appMenu := RoleAppMenu
items := []MenuItem{
{Role: &appMenu},
}
m.Build(items)
assert.Contains(t, p.menus[0].roles, RoleAppMenu)
}
func TestManager_SetApplicationMenu_Good(t *testing.T) {
m, p := newTestManager()
items := []MenuItem{{Label: "Test"}}
m.SetApplicationMenu(items)
assert.NotNil(t, p.appMenu)
}
func TestManager_Build_Empty_Good(t *testing.T) {
m, _ := newTestManager()
menu := m.Build(nil)
assert.NotNil(t, menu)
}
func TestManager_Build_NilReceiver_Good(t *testing.T) {
var m *Manager
assert.Nil(t, m.Build([]MenuItem{{Label: "Test"}}))
}
func TestManager_SetApplicationMenu_NilReceiver_Good(t *testing.T) {
var m *Manager
assert.NotPanics(t, func() {
m.SetApplicationMenu([]MenuItem{{Label: "Test"}})
})
}
type nilMenuPlatform struct{}
func (p *nilMenuPlatform) NewMenu() PlatformMenu { return &nilMenu{} }
func (p *nilMenuPlatform) SetApplicationMenu(menu PlatformMenu) {}
type nilMenu struct{}
func (m *nilMenu) Add(label string) PlatformMenuItem { return nil }
func (m *nilMenu) AddSeparator() {}
func (m *nilMenu) AddSubmenu(label string) PlatformMenu {
return nil
}
func (m *nilMenu) AddRole(role MenuRole) {}
func TestManager_Build_NilMenuHandles_Good(t *testing.T) {
m := NewManager(&nilMenuPlatform{})
assert.NotPanics(t, func() {
assert.NotNil(t, m.Build([]MenuItem{
{Label: "File"},
{Label: "Parent", Children: []MenuItem{{Label: "Child"}}},
}))
})
}