265 lines
4.4 KiB
Go
265 lines
4.4 KiB
Go
package text
|
||
|
||
import (
|
||
"testing"
|
||
)
|
||
|
||
func TestTruncate(t *testing.T) {
|
||
type args struct {
|
||
max int
|
||
s string
|
||
}
|
||
tests := []struct {
|
||
name string
|
||
args args
|
||
want string
|
||
}{
|
||
{
|
||
name: "Short enough",
|
||
args: args{
|
||
max: 5,
|
||
s: "short",
|
||
},
|
||
want: "short",
|
||
},
|
||
{
|
||
name: "Too short",
|
||
args: args{
|
||
max: 4,
|
||
s: "short",
|
||
},
|
||
want: "shor",
|
||
},
|
||
{
|
||
name: "Japanese",
|
||
args: args{
|
||
max: 11,
|
||
s: "テストテストテストテスト",
|
||
},
|
||
want: "テストテ...",
|
||
},
|
||
{
|
||
name: "Japanese filled",
|
||
args: args{
|
||
max: 11,
|
||
s: "aテストテストテストテスト",
|
||
},
|
||
want: "aテスト... ",
|
||
},
|
||
{
|
||
name: "Chinese",
|
||
args: args{
|
||
max: 11,
|
||
s: "幫新舉報違章工廠新增編號",
|
||
},
|
||
want: "幫新舉報...",
|
||
},
|
||
{
|
||
name: "Chinese filled",
|
||
args: args{
|
||
max: 11,
|
||
s: "a幫新舉報違章工廠新增編號",
|
||
},
|
||
want: "a幫新舉... ",
|
||
},
|
||
{
|
||
name: "Korean",
|
||
args: args{
|
||
max: 11,
|
||
s: "프로젝트 내의",
|
||
},
|
||
want: "프로젝트...",
|
||
},
|
||
{
|
||
name: "Korean filled",
|
||
args: args{
|
||
max: 11,
|
||
s: "a프로젝트 내의",
|
||
},
|
||
want: "a프로젝... ",
|
||
},
|
||
{
|
||
name: "Emoji",
|
||
args: args{
|
||
max: 11,
|
||
s: "💡💡💡💡💡💡💡💡💡💡💡💡",
|
||
},
|
||
want: "💡💡💡💡...",
|
||
},
|
||
{
|
||
name: "Accented characters",
|
||
args: args{
|
||
max: 11,
|
||
s: "é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́",
|
||
},
|
||
want: "é́́é́́é́́é́́é́́é́́é́́é́́...",
|
||
},
|
||
{
|
||
name: "Red accented characters",
|
||
args: args{
|
||
max: 11,
|
||
s: "\x1b[0;31mé́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́é́́\x1b[0m",
|
||
},
|
||
want: "\x1b[0;31mé́́é́́é́́é́́é́́é́́é́́é́́...\x1b[0m",
|
||
},
|
||
}
|
||
for _, tt := range tests {
|
||
t.Run(tt.name, func(t *testing.T) {
|
||
if got := Truncate(tt.args.max, tt.args.s); got != tt.want {
|
||
t.Errorf("Truncate() = %q, want %q", got, tt.want)
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
func TestTruncateColumn(t *testing.T) {
|
||
type args struct {
|
||
max int
|
||
s string
|
||
}
|
||
tests := []struct {
|
||
name string
|
||
args args
|
||
want string
|
||
}{
|
||
{
|
||
name: "exactly minimum width",
|
||
args: args{
|
||
max: 5,
|
||
s: "short",
|
||
},
|
||
want: "short",
|
||
},
|
||
{
|
||
name: "exactly minimum width with new line",
|
||
args: args{
|
||
max: 5,
|
||
s: "short\n",
|
||
},
|
||
want: "sh...",
|
||
},
|
||
{
|
||
name: "less than minimum width",
|
||
args: args{
|
||
max: 4,
|
||
s: "short",
|
||
},
|
||
want: "shor",
|
||
},
|
||
{
|
||
name: "less than minimum width with new line",
|
||
args: args{
|
||
max: 4,
|
||
s: "short\n",
|
||
},
|
||
want: "shor",
|
||
},
|
||
{
|
||
name: "first line of multiple is short enough",
|
||
args: args{
|
||
max: 80,
|
||
s: "short\n\nthis is a new line",
|
||
},
|
||
want: "short...",
|
||
},
|
||
{
|
||
name: "using Windows line endings",
|
||
args: args{
|
||
max: 80,
|
||
s: "short\r\n\r\nthis is a new line",
|
||
},
|
||
want: "short...",
|
||
},
|
||
{
|
||
name: "using older MacOS line endings",
|
||
args: args{
|
||
max: 80,
|
||
s: "short\r\rthis is a new line",
|
||
},
|
||
want: "short...",
|
||
},
|
||
}
|
||
for _, tt := range tests {
|
||
t.Run(tt.name, func(t *testing.T) {
|
||
if got := TruncateColumn(tt.args.max, tt.args.s); got != tt.want {
|
||
t.Errorf("TruncateColumn() = %q, want %q", got, tt.want)
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
func TestDisplayWidth(t *testing.T) {
|
||
tests := []struct {
|
||
name string
|
||
text string
|
||
want int
|
||
}{
|
||
{
|
||
name: "check mark",
|
||
text: `✓`,
|
||
want: 1,
|
||
},
|
||
{
|
||
name: "bullet icon",
|
||
text: `•`,
|
||
want: 1,
|
||
},
|
||
{
|
||
name: "middle dot",
|
||
text: `·`,
|
||
want: 1,
|
||
},
|
||
{
|
||
name: "ellipsis",
|
||
text: `…`,
|
||
want: 1,
|
||
},
|
||
{
|
||
name: "right arrow",
|
||
text: `→`,
|
||
want: 1,
|
||
},
|
||
{
|
||
name: "smart double quotes",
|
||
text: `“”`,
|
||
want: 2,
|
||
},
|
||
{
|
||
name: "smart single quotes",
|
||
text: `‘’`,
|
||
want: 2,
|
||
},
|
||
{
|
||
name: "em dash",
|
||
text: `—`,
|
||
want: 1,
|
||
},
|
||
{
|
||
name: "en dash",
|
||
text: `–`,
|
||
want: 1,
|
||
},
|
||
{
|
||
name: "emoji",
|
||
text: `👍`,
|
||
want: 2,
|
||
},
|
||
{
|
||
name: "accent character",
|
||
text: `é́́`,
|
||
want: 1,
|
||
},
|
||
{
|
||
name: "color codes",
|
||
text: "\x1b[0;31mred\x1b[0m",
|
||
want: 3,
|
||
},
|
||
}
|
||
for _, tt := range tests {
|
||
t.Run(tt.name, func(t *testing.T) {
|
||
if got := DisplayWidth(tt.text); got != tt.want {
|
||
t.Errorf("DisplayWidth() = %v, want %v", got, tt.want)
|
||
}
|
||
})
|
||
}
|
||
}
|