mirror of
https://github.com/jesseduffield/lazydocker.git
synced 2026-07-22 07:11:01 +00:00
182 lines
4.1 KiB
Go
182 lines
4.1 KiB
Go
package gui
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestStreamFilterLines(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
input string
|
|
filter string
|
|
expected string
|
|
}{
|
|
{
|
|
name: "simple match - single line",
|
|
input: "hello world\n",
|
|
filter: "hello",
|
|
expected: "hello world\n",
|
|
},
|
|
{
|
|
name: "simple match - multiple lines",
|
|
input: "hello world\nfoo bar\nbaz qux\n",
|
|
filter: "foo",
|
|
expected: "foo bar\n",
|
|
},
|
|
{
|
|
name: "multiple matches",
|
|
input: "hello world\nhello again\nfoo bar\n",
|
|
filter: "hello",
|
|
expected: "hello world\nhello again\n",
|
|
},
|
|
{
|
|
name: "no matches",
|
|
input: "hello world\nfoo bar\nbaz qux\n",
|
|
filter: "xyz",
|
|
expected: "",
|
|
},
|
|
{
|
|
name: "empty filter - matches all",
|
|
input: "hello world\nfoo bar\n",
|
|
filter: "",
|
|
expected: "hello world\nfoo bar\n",
|
|
},
|
|
{
|
|
name: "case sensitive match",
|
|
input: "Hello World\nhello world\nHELLO WORLD\n",
|
|
filter: "hello",
|
|
expected: "hello world\n",
|
|
},
|
|
{
|
|
name: "partial word match",
|
|
input: "hello world\nhelloworld\n",
|
|
filter: "hello",
|
|
expected: "hello world\nhelloworld\n",
|
|
},
|
|
{
|
|
name: "filter in middle of line",
|
|
input: "prefix hello suffix\n",
|
|
filter: "hello",
|
|
expected: "prefix hello suffix\n",
|
|
},
|
|
{
|
|
name: "empty input",
|
|
input: "",
|
|
filter: "hello",
|
|
expected: "",
|
|
},
|
|
{
|
|
name: "newline only lines",
|
|
input: "\n\n\n",
|
|
filter: "",
|
|
expected: "\n\n\n",
|
|
},
|
|
{
|
|
name: "filter with special characters",
|
|
input: "error: something went wrong\ninfo: all good\n",
|
|
filter: "error:",
|
|
expected: "error: something went wrong\n",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
reader := strings.NewReader(tt.input)
|
|
writer := &bytes.Buffer{}
|
|
ctx := context.Background()
|
|
|
|
err := streamFilterLines(reader, writer, tt.filter, ctx)
|
|
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, tt.expected, writer.String())
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestStreamFilterLines_ContextCancellation(t *testing.T) {
|
|
input := strings.Repeat("hello world\n", 1000)
|
|
reader := strings.NewReader(input)
|
|
writer := &bytes.Buffer{}
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
|
cancel()
|
|
|
|
err := streamFilterLines(reader, writer, "hello", ctx)
|
|
|
|
assert.NoError(t, err)
|
|
}
|
|
|
|
func TestStreamFilterLines_NonASCIIFilter(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
input string
|
|
filter string
|
|
expected string
|
|
}{
|
|
{
|
|
name: "UTF-8 characters",
|
|
input: "hello 世界\nfoo bar\n",
|
|
filter: "世界",
|
|
expected: "hello 世界\n",
|
|
},
|
|
{
|
|
name: "emoji filter",
|
|
input: "error 🚨 occurred\ninfo: all good\n",
|
|
filter: "🚨",
|
|
expected: "error 🚨 occurred\n",
|
|
},
|
|
{
|
|
name: "mixed ASCII and UTF-8",
|
|
input: "hello 世界 world\nfoo bar\n",
|
|
filter: "世界",
|
|
expected: "hello 世界 world\n",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
reader := strings.NewReader(tt.input)
|
|
writer := &bytes.Buffer{}
|
|
ctx := context.Background()
|
|
|
|
err := streamFilterLines(reader, writer, tt.filter, ctx)
|
|
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, tt.expected, writer.String())
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestStreamFilterLines_LongLines(t *testing.T) {
|
|
longLine := strings.Repeat("a", 100000) + " target " + strings.Repeat("b", 100000) + "\n"
|
|
shortLine := "target\n"
|
|
|
|
input := longLine + shortLine
|
|
reader := strings.NewReader(input)
|
|
writer := &bytes.Buffer{}
|
|
ctx := context.Background()
|
|
|
|
err := streamFilterLines(reader, writer, "target", ctx)
|
|
|
|
assert.NoError(t, err)
|
|
assert.Contains(t, writer.String(), "target")
|
|
assert.Equal(t, 2, strings.Count(writer.String(), "target"))
|
|
}
|
|
|
|
func TestStreamFilterLines_EmptyLines(t *testing.T) {
|
|
input := "line with content\n\nanother line\n\n\n"
|
|
reader := strings.NewReader(input)
|
|
writer := &bytes.Buffer{}
|
|
ctx := context.Background()
|
|
|
|
err := streamFilterLines(reader, writer, "", ctx)
|
|
|
|
assert.NoError(t, err)
|
|
lines := strings.Split(writer.String(), "\n")
|
|
assert.GreaterOrEqual(t, len(lines), 5)
|
|
}
|