From 9b26bcabd560d1494d8535500d16b62791c2a887 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Thu, 6 Feb 2025 13:43:20 -0500 Subject: [PATCH] chore(teatest/v2): update bubbletea/v2 and use WithInitialSize We need to set an initial size for the program in the test model. Otherwise, the cell-based cursed renderer will assume a size of 0x0 and won't render anything. Needs: https://github.com/charmbracelet/bubbletea/pull/1314 --- exp/teatest/v2/app_test.go | 4 ++-- exp/teatest/v2/go.mod | 20 ++++++++-------- exp/teatest/v2/go.sum | 43 +++++++++++++++++----------------- exp/teatest/v2/send_test.go | 4 ++-- exp/teatest/v2/teatest.go | 16 +++++++++---- exp/teatest/v2/teatest_test.go | 2 +- 6 files changed, 48 insertions(+), 41 deletions(-) diff --git a/exp/teatest/v2/app_test.go b/exp/teatest/v2/app_test.go index 93fbe2c4..4ef3f37f 100644 --- a/exp/teatest/v2/app_test.go +++ b/exp/teatest/v2/app_test.go @@ -93,8 +93,8 @@ type model int // Init optionally returns an initial command we should run. In this case we // want to start the timer. -func (m model) Init() (tea.Model, tea.Cmd) { - return m, tick +func (m model) Init() tea.Cmd { + return tick } // Update is called when messages are received. The idea is that you inspect the diff --git a/exp/teatest/v2/go.mod b/exp/teatest/v2/go.mod index 883fafaa..9a452c1f 100644 --- a/exp/teatest/v2/go.mod +++ b/exp/teatest/v2/go.mod @@ -3,23 +3,23 @@ module github.com/charmbracelet/x/exp/teatest/v2 go 1.19 require ( - github.com/charmbracelet/bubbletea/v2 v2.0.0-alpha.2 - github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a + github.com/charmbracelet/bubbletea/v2 v2.0.0-alpha.2.0.20250206184642-5f91a4989782 + github.com/charmbracelet/x/exp/golden v0.0.0-20241212170349-ad4b7ae0f25f ) require ( github.com/aymanbagabas/go-udiff v0.2.0 // indirect - github.com/charmbracelet/colorprofile v0.1.6 // indirect - github.com/charmbracelet/x/ansi v0.4.3 // indirect - github.com/charmbracelet/x/cellbuf v0.0.3 // indirect - github.com/charmbracelet/x/term v0.2.0 // indirect - github.com/charmbracelet/x/wcwidth v0.0.0-20241011142426-46044092ad91 // indirect + github.com/charmbracelet/colorprofile v0.2.0 // indirect + github.com/charmbracelet/x/ansi v0.8.0 // indirect + github.com/charmbracelet/x/cellbuf v0.0.9-0.20250206182034-2ef4961df933 // indirect + github.com/charmbracelet/x/input v0.3.2 // indirect + github.com/charmbracelet/x/term v0.2.1 // indirect github.com/charmbracelet/x/windows v0.2.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/text v0.19.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.30.0 // indirect ) diff --git a/exp/teatest/v2/go.sum b/exp/teatest/v2/go.sum index eff2ccf5..09ebe4c2 100644 --- a/exp/teatest/v2/go.sum +++ b/exp/teatest/v2/go.sum @@ -1,33 +1,34 @@ github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= -github.com/charmbracelet/bubbletea/v2 v2.0.0-alpha.2 h1:NkQFWhCii9NtL7Q0L/4mNKtZFgrDpfPSVZAzTwEJdGg= -github.com/charmbracelet/bubbletea/v2 v2.0.0-alpha.2/go.mod h1:24niqT9RbtXhWg8zLRU/v/xTixlo1+DUsHQZ3+kez5Y= -github.com/charmbracelet/colorprofile v0.1.6 h1:nMMqCns0c0DfCwNGdagBh6SxutFqkltSxxKk5S9kt+Y= -github.com/charmbracelet/colorprofile v0.1.6/go.mod h1:3EMXDxwRDJl0c17eJ1jX99MhtlP9OxE/9Qw0C5lvyUg= -github.com/charmbracelet/x/ansi v0.4.3 h1:wcdDrW0ejaaZGJxCyxVNzzmctqV+oARIudaFGQvsRkA= -github.com/charmbracelet/x/ansi v0.4.3/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= -github.com/charmbracelet/x/cellbuf v0.0.3 h1:HapUUjlo0pZ7iGijrTer1f4X8Uvq17l0zR+80Oh+iJg= -github.com/charmbracelet/x/cellbuf v0.0.3/go.mod h1:SF8R3AqchNzYKKJCFT7co8wt1HgQDfAitQ+SBoxWLNc= -github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a h1:G99klV19u0QnhiizODirwVksQB91TJKV/UaTnACcG30= -github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= -github.com/charmbracelet/x/term v0.2.0 h1:cNB9Ot9q8I711MyZ7myUR5HFWL/lc3OpU8jZ4hwm0x0= -github.com/charmbracelet/x/term v0.2.0/go.mod h1:GVxgxAbjUrmpvIINHIQnJJKpMlHiZ4cktEQCN6GWyF0= -github.com/charmbracelet/x/wcwidth v0.0.0-20241011142426-46044092ad91 h1:D5OO0lVavz7A+Swdhp62F9gbkibxmz9B2hZ/jVdMPf0= -github.com/charmbracelet/x/wcwidth v0.0.0-20241011142426-46044092ad91/go.mod h1:Ey8PFmYwH+/td9bpiEx07Fdx9ZVkxfIjWXxBluxF4Nw= +github.com/charmbracelet/bubbletea/v2 v2.0.0-alpha.2.0.20250206184642-5f91a4989782 h1:IveGC+hmsUSsWYXjaskkOA8OfNc47yQHHxwYvABN2pk= +github.com/charmbracelet/bubbletea/v2 v2.0.0-alpha.2.0.20250206184642-5f91a4989782/go.mod h1:Dr51sPGKwC4yfRA4Sqd9n4eD9EVxXrkmQFFYsQxP2S0= +github.com/charmbracelet/colorprofile v0.2.0 h1:iiIQlp3LSvoJPtR11KoDfIf9wqWm2mn/iU420rHOZ/A= +github.com/charmbracelet/colorprofile v0.2.0/go.mod h1:6wPrSSR4QtwYtOY3h0bLRw5YOUAIKWlZIJ02CTAsZsk= +github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= +github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= +github.com/charmbracelet/x/cellbuf v0.0.9-0.20250206182034-2ef4961df933 h1:zv5JXjtb6m+H5nzfAiWc/5gqCrNUATqv2voRFDT/0Tw= +github.com/charmbracelet/x/cellbuf v0.0.9-0.20250206182034-2ef4961df933/go.mod h1:dKfNBxLovpvzzxAP6/GZfs5eb7vNxHlUDnwGhRmvIdY= +github.com/charmbracelet/x/exp/golden v0.0.0-20241212170349-ad4b7ae0f25f h1:UytXHv0UxnsDFmL/7Z9Q5SBYPwSuRLXHbwx+6LycZ2w= +github.com/charmbracelet/x/exp/golden v0.0.0-20241212170349-ad4b7ae0f25f/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= +github.com/charmbracelet/x/input v0.3.2 h1:6h/d/40Og6UP3a4VDjIbdoUhilEH4K+mxEuaSPIJwNQ= +github.com/charmbracelet/x/input v0.3.2/go.mod h1:JI8RcvdZWQIhn09VzeK3hdp4lTz7+yhiEdpEQtZN+2c= +github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= +github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= github.com/charmbracelet/x/windows v0.2.0 h1:ilXA1GJjTNkgOm94CLPeSz7rar54jtFatdmoiONPuEw= github.com/charmbracelet/x/windows v0.2.0/go.mod h1:ZibNFR49ZFqCXgP76sYanisxRyC+EYrBE7TTknD8s1s= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= -golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/exp/teatest/v2/send_test.go b/exp/teatest/v2/send_test.go index 8879f5e8..04241c88 100644 --- a/exp/teatest/v2/send_test.go +++ b/exp/teatest/v2/send_test.go @@ -57,8 +57,8 @@ type connectedModel struct { type ping string -func (m *connectedModel) Init() (tea.Model, tea.Cmd) { - return m, nil +func (m *connectedModel) Init() tea.Cmd { + return nil } func (m *connectedModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { diff --git a/exp/teatest/v2/teatest.go b/exp/teatest/v2/teatest.go index f277f067..d821158a 100644 --- a/exp/teatest/v2/teatest.go +++ b/exp/teatest/v2/teatest.go @@ -125,11 +125,22 @@ func NewTestModel(tb testing.TB, m tea.Model, options ...TestOption) *TestModel doneCh: make(chan bool, 1), } + // We always have an initial size. + options = append([]TestOption{ + WithInitialTermSize(80, 24), + }, options...) + + var opts TestModelOptions + for _, opt := range options { + opt(&opts) + } + tm.program = tea.NewProgram( m, tea.WithInput(tm.in), tea.WithOutput(tm.out), tea.WithoutSignals(), + tea.WithInitialSize(opts.size.Width, opts.size.Height), ) interruptions := make(chan os.Signal, 1) @@ -149,11 +160,6 @@ func NewTestModel(tb testing.TB, m tea.Model, options ...TestOption) *TestModel tm.program.Kill() }() - var opts TestModelOptions - for _, opt := range options { - opt(&opts) - } - if opts.size.Width != 0 { tm.program.Send(opts.size) } diff --git a/exp/teatest/v2/teatest_test.go b/exp/teatest/v2/teatest_test.go index 1ccb7fb9..8db09e4e 100644 --- a/exp/teatest/v2/teatest_test.go +++ b/exp/teatest/v2/teatest_test.go @@ -36,7 +36,7 @@ func TestWaitForTimeout(t *testing.T) { type m string -func (m m) Init() (tea.Model, tea.Cmd) { return m, nil } +func (m m) Init() tea.Cmd { return nil } func (m m) Update(tea.Msg) (tea.Model, tea.Cmd) { return m, nil } func (m m) View() string { return string(m) }