blob: 3609af6a06df48874ba647df51b62e4d85fda873 [file] [log] [blame]
// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package str
import (
"reflect"
"strings"
"testing"
)
var foldDupTests = []struct {
list []string
f1, f2 string
}{
{StringList("math/rand", "math/big"), "", ""},
{StringList("math", "strings"), "", ""},
{StringList("strings"), "", ""},
{StringList("strings", "strings"), "strings", "strings"},
{StringList("Rand", "rand", "math", "math/rand", "math/Rand"), "Rand", "rand"},
}
func TestFoldDup(t *testing.T) {
for _, tt := range foldDupTests {
f1, f2 := FoldDup(tt.list)
if f1 != tt.f1 || f2 != tt.f2 {
t.Errorf("foldDup(%q) = %q, %q, want %q, %q", tt.list, f1, f2, tt.f1, tt.f2)
}
}
}
func TestSplitQuotedFields(t *testing.T) {
for _, test := range []struct {
name string
value string
want []string
wantErr string
}{
{name: "empty", value: "", want: nil},
{name: "space", value: " ", want: nil},
{name: "one", value: "a", want: []string{"a"}},
{name: "leading_space", value: " a", want: []string{"a"}},
{name: "trailing_space", value: "a ", want: []string{"a"}},
{name: "two", value: "a b", want: []string{"a", "b"}},
{name: "two_multi_space", value: "a b", want: []string{"a", "b"}},
{name: "two_tab", value: "a\tb", want: []string{"a", "b"}},
{name: "two_newline", value: "a\nb", want: []string{"a", "b"}},
{name: "quote_single", value: `'a b'`, want: []string{"a b"}},
{name: "quote_double", value: `"a b"`, want: []string{"a b"}},
{name: "quote_both", value: `'a '"b "`, want: []string{"a ", "b "}},
{name: "quote_contains", value: `'a "'"'b"`, want: []string{`a "`, `'b`}},
{name: "escape", value: `\'`, want: []string{`\'`}},
{name: "quote_unclosed", value: `'a`, wantErr: "unterminated ' string"},
} {
t.Run(test.name, func(t *testing.T) {
got, err := SplitQuotedFields(test.value)
if err != nil {
if test.wantErr == "" {
t.Fatalf("unexpected error: %v", err)
} else if errMsg := err.Error(); !strings.Contains(errMsg, test.wantErr) {
t.Fatalf("error %q does not contain %q", errMsg, test.wantErr)
}
return
}
if test.wantErr != "" {
t.Fatalf("unexpected success; wanted error containing %q", test.wantErr)
}
if !reflect.DeepEqual(got, test.want) {
t.Errorf("got %q; want %q", got, test.want)
}
})
}
}
func TestJoinAndQuoteFields(t *testing.T) {
for _, test := range []struct {
name string
args []string
want, wantErr string
}{
{name: "empty", args: nil, want: ""},
{name: "one", args: []string{"a"}, want: "a"},
{name: "two", args: []string{"a", "b"}, want: "a b"},
{name: "space", args: []string{"a ", "b"}, want: "'a ' b"},
{name: "newline", args: []string{"a\n", "b"}, want: "'a\n' b"},
{name: "quote", args: []string{`'a `, "b"}, want: `"'a " b`},
{name: "unquoteable", args: []string{`'"`}, wantErr: "contains both single and double quotes and cannot be quoted"},
} {
t.Run(test.name, func(t *testing.T) {
got, err := JoinAndQuoteFields(test.args)
if err != nil {
if test.wantErr == "" {
t.Fatalf("unexpected error: %v", err)
} else if errMsg := err.Error(); !strings.Contains(errMsg, test.wantErr) {
t.Fatalf("error %q does not contain %q", errMsg, test.wantErr)
}
return
}
if test.wantErr != "" {
t.Fatalf("unexpected success; wanted error containing %q", test.wantErr)
}
if got != test.want {
t.Errorf("got %s; want %s", got, test.want)
}
})
}
}