Files
galaxy-game/client/loader/loader_ui_test.go
2026-03-16 19:52:02 +02:00

182 lines
4.6 KiB
Go

package loader
import (
"fmt"
"testing"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
fynetest "fyne.io/fyne/v2/test"
"fyne.io/fyne/v2/theme"
"github.com/stretchr/testify/require"
)
func TestNewLoaderConfiguresWindowGeometry(t *testing.T) {
app := fynetest.NewApp()
spy := &spyApp{App: app}
l, err := NewLoader(newTestStorage(t), &stubConnector{}, spy)
require.NoError(t, err)
require.NotNil(t, spy.window)
require.Same(t, spy.window, l.debugWindow)
require.True(t, spy.window.setContentCalled)
require.True(t, spy.window.resizeCalled)
require.Equal(t, spy.window.content.MinSize(), spy.window.resizeSize)
require.True(t, spy.window.fixedSizeCalled)
require.True(t, spy.window.fixedSize)
require.True(t, spy.window.centerOnScreenCalled)
}
func TestNewLoaderBuildsScrollableBorderLayout(t *testing.T) {
app := fynetest.NewApp()
l, err := NewLoader(newTestStorage(t), &stubConnector{}, app)
require.NoError(t, err)
content, ok := l.debugWindow.Content().(*fyne.Container)
require.True(t, ok)
require.Equal(t, "*layout.borderLayout", fmt.Sprintf("%T", content.Layout))
require.Len(t, content.Objects, 2)
logScroll, ok := content.Objects[0].(*container.Scroll)
require.True(t, ok)
require.Same(t, l.textGrid, logScroll.Content)
require.Equal(t, container.ScrollBoth, logScroll.Direction)
require.Equal(t, loaderLogViewportMinSize(app), logScroll.MinSize())
require.Equal(t, fyne.ScrollNone, l.textGrid.Scroll)
actionBar, ok := content.Objects[1].(*fyne.Container)
require.True(t, ok)
require.Len(t, actionBar.Objects, 1)
actionRow, ok := actionBar.Objects[0].(*fyne.Container)
require.True(t, ok)
require.Len(t, actionRow.Objects, 1)
require.Same(t, l.btn, actionRow.Objects[0])
content.Resize(content.MinSize())
require.Equal(t, fyne.NewPos(0, 0), logScroll.Position())
require.Equal(t, content.Size().Width, logScroll.Size().Width)
require.Equal(
t,
content.Size().Height-actionBar.MinSize().Height-theme.Padding(),
logScroll.Size().Height,
)
require.Equal(
t,
fyne.NewPos(0, content.Size().Height-actionBar.MinSize().Height),
actionBar.Position(),
)
require.Equal(t, content.Size().Width, actionBar.Size().Width)
require.Equal(t, actionRow.MinSize().Width, actionRow.Size().Width)
require.Equal(t, l.btn.MinSize().Width, l.btn.Size().Width)
require.Equal(t, l.btn.MinSize().Height, l.btn.Size().Height)
require.Equal(t, (content.Size().Width-actionRow.Size().Width)/2, actionRow.Position().X)
}
func TestNewLoaderInterceptsWindowCloseByHidingWindow(t *testing.T) {
app := fynetest.NewApp()
spy := &spyApp{App: app}
l, err := NewLoader(newTestStorage(t), &stubConnector{}, spy)
require.NoError(t, err)
require.NotNil(t, spy.window)
require.Same(t, spy.window, l.debugWindow)
require.NotNil(t, spy.window.closeIntercept)
spy.window.closeIntercept()
require.Equal(t, 1, spy.window.hideCalls)
require.Zero(t, spy.window.closeCalls)
require.Zero(t, spy.quitCalls)
}
func TestLoaderWindowCloseQuitsApplicationAfterLaunchFailure(t *testing.T) {
app := fynetest.NewApp()
spy := &spyApp{App: app}
l, err := NewLoader(newTestStorage(t), &stubConnector{}, spy)
require.NoError(t, err)
l.setCloseQuits(true)
spy.window.closeIntercept()
require.Zero(t, spy.window.hideCalls)
require.Zero(t, spy.window.closeCalls)
require.Equal(t, 1, spy.quitCalls)
}
type spyApp struct {
fyne.App
window *spyWindow
quitCalls int
}
func (a *spyApp) NewWindow(title string) fyne.Window {
a.window = &spyWindow{Window: a.App.NewWindow(title)}
return a.window
}
func (a *spyApp) Quit() {
a.quitCalls++
a.App.Quit()
}
type spyWindow struct {
fyne.Window
content fyne.CanvasObject
closeIntercept func()
resizeSize fyne.Size
hideCalls int
closeCalls int
setContentCalled bool
resizeCalled bool
fixedSize bool
fixedSizeCalled bool
centerOnScreenCalled bool
}
func (w *spyWindow) CenterOnScreen() {
w.centerOnScreenCalled = true
w.Window.CenterOnScreen()
}
func (w *spyWindow) Close() {
w.closeCalls++
w.Window.Close()
}
func (w *spyWindow) Hide() {
w.hideCalls++
w.Window.Hide()
}
func (w *spyWindow) Resize(size fyne.Size) {
w.resizeCalled = true
w.resizeSize = size
w.Window.Resize(size)
}
func (w *spyWindow) SetContent(content fyne.CanvasObject) {
w.setContentCalled = true
w.content = content
w.Window.SetContent(content)
}
func (w *spyWindow) SetCloseIntercept(callback func()) {
w.closeIntercept = callback
w.Window.SetCloseIntercept(callback)
}
func (w *spyWindow) SetFixedSize(fixed bool) {
w.fixedSizeCalled = true
w.fixedSize = fixed
w.Window.SetFixedSize(fixed)
}