Add options parsing unit tests (#205)
* Add options parsing unit tests * Refactor into subtestspull/207/head
parent
49b37a0a9a
commit
2b30998b9a
@ -0,0 +1,164 @@
|
||||
package internal
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestOptionToString(t *testing.T) {
|
||||
t.Run("no prefix", func(t *testing.T) {
|
||||
opt := "test"
|
||||
result := optionToString(opt)
|
||||
assertEqual(t, result, "--test")
|
||||
})
|
||||
|
||||
t.Run("single prefix", func(t *testing.T) {
|
||||
opt := "-test"
|
||||
result := optionToString(opt)
|
||||
assertEqual(t, result, "-test")
|
||||
})
|
||||
|
||||
t.Run("double prefix", func(t *testing.T) {
|
||||
opt := "--test"
|
||||
result := optionToString(opt)
|
||||
assertEqual(t, result, "--test")
|
||||
})
|
||||
}
|
||||
|
||||
func TestAppendOneOptionToSlice(t *testing.T) {
|
||||
t.Run("string flag", func(t *testing.T) {
|
||||
result := []string{}
|
||||
optionMap := OptionMap{"string-flag": []interface{}{"/root"}}
|
||||
|
||||
appendOptionsToSlice(&result, optionMap)
|
||||
expected := []string{
|
||||
"--string-flag", "/root",
|
||||
}
|
||||
assertSliceEqual(t, result, expected)
|
||||
})
|
||||
|
||||
t.Run("bool flag", func(t *testing.T) {
|
||||
result := []string{}
|
||||
optionMap := OptionMap{"boolean-flag": []interface{}{true}}
|
||||
|
||||
appendOptionsToSlice(&result, optionMap)
|
||||
expected := []string{
|
||||
"--boolean-flag",
|
||||
}
|
||||
assertSliceEqual(t, result, expected)
|
||||
})
|
||||
|
||||
t.Run("int flag", func(t *testing.T) {
|
||||
result := []string{}
|
||||
optionMap := OptionMap{"int-flag": []interface{}{123}}
|
||||
|
||||
appendOptionsToSlice(&result, optionMap)
|
||||
expected := []string{
|
||||
"--int-flag", "123",
|
||||
}
|
||||
assertSliceEqual(t, result, expected)
|
||||
})
|
||||
}
|
||||
|
||||
func TestAppendMultipleOptionsToSlice(t *testing.T) {
|
||||
result := []string{}
|
||||
optionMap := OptionMap{
|
||||
"string-flag": []interface{}{"/root"},
|
||||
"int-flag": []interface{}{123},
|
||||
}
|
||||
|
||||
appendOptionsToSlice(&result, optionMap)
|
||||
expected := []string{
|
||||
"--string-flag", "/root",
|
||||
"--int-flag", "123",
|
||||
}
|
||||
if len(result) != len(expected) {
|
||||
t.Errorf("got length %d, want length %d", len(result), len(expected))
|
||||
}
|
||||
|
||||
// checks that expected option comes after flag, regardless of key order in map
|
||||
for i, v := range expected {
|
||||
v = strings.TrimPrefix(v, "--")
|
||||
|
||||
if value, ok := optionMap[v]; ok {
|
||||
if val, ok := value[0].(int); ok {
|
||||
if expected[i+1] != strconv.Itoa(val) {
|
||||
t.Errorf("Flags and options order are mismatched. got %v, want %v", result, expected)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestAppendOptionWithMultipleValuesToSlice(t *testing.T) {
|
||||
result := []string{}
|
||||
optionMap := OptionMap{
|
||||
"string-flag": []interface{}{"/root", "/bin"},
|
||||
}
|
||||
|
||||
appendOptionsToSlice(&result, optionMap)
|
||||
expected := []string{
|
||||
"--string-flag", "/root",
|
||||
"--string-flag", "/bin",
|
||||
}
|
||||
assertSliceEqual(t, result, expected)
|
||||
}
|
||||
|
||||
func TestGetOptionsOneKey(t *testing.T) {
|
||||
optionMap := OptionMap{
|
||||
"string-flag": []interface{}{"/root"},
|
||||
}
|
||||
options := Options{"backend": optionMap}
|
||||
keys := []string{"backend"}
|
||||
|
||||
result := getOptions(options, keys)
|
||||
expected := []string{
|
||||
"--string-flag", "/root",
|
||||
}
|
||||
assertSliceEqual(t, result, expected)
|
||||
}
|
||||
|
||||
func TestGetOptionsMultipleKeys(t *testing.T) {
|
||||
firstOptionMap := OptionMap{
|
||||
"string-flag": []interface{}{"/root"},
|
||||
}
|
||||
secondOptionMap := OptionMap{
|
||||
"boolean-flag": []interface{}{true},
|
||||
"int-flag": []interface{}{123},
|
||||
}
|
||||
options := Options{
|
||||
"all": firstOptionMap,
|
||||
"forget": secondOptionMap,
|
||||
}
|
||||
keys := []string{"all", "forget"}
|
||||
|
||||
result := getOptions(options, keys)
|
||||
expected := []string{
|
||||
"--string-flag", "/root",
|
||||
"--boolean-flag",
|
||||
"--int-flag", "123",
|
||||
}
|
||||
reflect.DeepEqual(result, expected)
|
||||
}
|
||||
|
||||
func assertEqual(t testing.TB, result, expected string) {
|
||||
t.Helper()
|
||||
|
||||
if result != expected {
|
||||
t.Errorf("got %s, want %s", result, expected)
|
||||
}
|
||||
}
|
||||
|
||||
func assertSliceEqual(t testing.TB, result, expected []string) {
|
||||
t.Helper()
|
||||
|
||||
if len(result) != len(expected) {
|
||||
t.Errorf("got length %d, want length %d", len(result), len(expected))
|
||||
}
|
||||
|
||||
for i := range result {
|
||||
assertEqual(t, result[i], expected[i])
|
||||
}
|
||||
}
|
Loading…
Reference in new issue