cli/pkg/text/truncate_test.go
Mislav Marohnić 1f86e7cd04 Fix display width of common punctuation characters
These characters get classified as "East Asian Mixed" by Go's
`text/width` package, and thus assumed that their printed version
occupies a width of 2 characters, whereas they each only occupy one.

I'm not sure why they are classified as East Asian, but I did not have
the energy to dive into Go's Unicode tables, so here is a workaround
based on an exclusion list.
2020-09-02 20:59:11 +02:00

139 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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: "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프로젝... ",
},
}
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 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,
},
}
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)
}
})
}
}