196 lines
5.3 KiB
Go
196 lines
5.3 KiB
Go
package common
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestNewStringArrayFlag(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
defaultValue []string
|
|
expected []string
|
|
}{
|
|
{
|
|
name: "nil default",
|
|
defaultValue: nil,
|
|
expected: []string{},
|
|
},
|
|
{
|
|
name: "empty default",
|
|
defaultValue: []string{},
|
|
expected: []string{},
|
|
},
|
|
{
|
|
name: "non-empty default",
|
|
defaultValue: []string{"value1", "value2"},
|
|
expected: []string{"value1", "value2"},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
flag := NewStringArrayFlag(tt.defaultValue)
|
|
|
|
// Check initial state
|
|
assert.Equal(t, tt.expected, flag.Values(), "Values should match default")
|
|
assert.False(t, flag.WasExplicitlySet(), "New flag should not be marked as explicitly set")
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestStringArrayFlag_Set(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
defaultValue []string
|
|
setValue []string
|
|
expected []string
|
|
}{
|
|
{
|
|
name: "nil default, set values",
|
|
defaultValue: nil,
|
|
setValue: []string{"new1", "new2"},
|
|
expected: []string{"new1", "new2"},
|
|
},
|
|
{
|
|
name: "non-empty default, set empty",
|
|
defaultValue: []string{"default1", "default2"},
|
|
setValue: []string{},
|
|
expected: []string{},
|
|
},
|
|
{
|
|
name: "non-empty default, set new values",
|
|
defaultValue: []string{"default1", "default2"},
|
|
setValue: []string{"new1", "new2"},
|
|
expected: []string{"new1", "new2"},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
flag := NewStringArrayFlag(tt.defaultValue)
|
|
|
|
// Set the values
|
|
flag.Set(tt.setValue)
|
|
|
|
// Check state after setting
|
|
assert.Equal(t, tt.expected, flag.Values(), "Values should match set values")
|
|
assert.True(t, flag.WasExplicitlySet(), "Flag should be marked as explicitly set")
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestStringArrayFlag_Add(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
defaultValue []string
|
|
addValue string
|
|
expected []string
|
|
}{
|
|
{
|
|
name: "nil default, add value",
|
|
defaultValue: nil,
|
|
addValue: "new",
|
|
expected: []string{"new"},
|
|
},
|
|
{
|
|
name: "empty default, add value",
|
|
defaultValue: []string{},
|
|
addValue: "new",
|
|
expected: []string{"new"},
|
|
},
|
|
{
|
|
name: "non-empty default, add value",
|
|
defaultValue: []string{"default1", "default2"},
|
|
addValue: "new",
|
|
expected: []string{"default1", "default2", "new"},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
flag := NewStringArrayFlag(tt.defaultValue)
|
|
|
|
// Add the value
|
|
flag.Add(tt.addValue)
|
|
|
|
// Check state after adding
|
|
assert.Equal(t, tt.expected, flag.Values(), "Values should include added value")
|
|
assert.True(t, flag.WasExplicitlySet(), "Flag should be marked as explicitly set")
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestStringArrayFlag_MultipleOperations(t *testing.T) {
|
|
flag := NewStringArrayFlag([]string{"initial"})
|
|
|
|
// Initial state
|
|
assert.Equal(t, []string{"initial"}, flag.Values())
|
|
assert.False(t, flag.WasExplicitlySet())
|
|
|
|
// Add a value
|
|
flag.Add("added")
|
|
assert.Equal(t, []string{"initial", "added"}, flag.Values())
|
|
assert.True(t, flag.WasExplicitlySet())
|
|
|
|
// Set completely new values
|
|
flag.Set([]string{"new1", "new2"})
|
|
assert.Equal(t, []string{"new1", "new2"}, flag.Values())
|
|
assert.True(t, flag.WasExplicitlySet(), "Flag should remain explicitly set")
|
|
|
|
// Add another value after Set
|
|
flag.Add("added2")
|
|
assert.Equal(t, []string{"new1", "new2", "added2"}, flag.Values())
|
|
assert.True(t, flag.WasExplicitlySet())
|
|
}
|
|
|
|
func TestStringArrayFlag_Implementation(t *testing.T) {
|
|
// Test that stringArrayFlag properly implements StringArrayFlag interface
|
|
var _ StringArrayFlag = &stringArrayFlag{}
|
|
}
|
|
|
|
func TestStringArrayFlag_DefensiveCopy(t *testing.T) {
|
|
// Test that modifying the original slice doesn't affect the flag
|
|
original := []string{"value1", "value2"}
|
|
flag := NewStringArrayFlag(original)
|
|
|
|
// Verify initial state
|
|
assert.Equal(t, []string{"value1", "value2"}, flag.Values())
|
|
|
|
// Modify the original slice - should NOT affect the flag's internal state
|
|
// because NewStringArrayFlag creates a defensive copy
|
|
original[0] = "modified"
|
|
original = append(original, "added")
|
|
|
|
// Flag values should remain unchanged
|
|
assert.Equal(t, []string{"value1", "value2"}, flag.Values())
|
|
|
|
// Test that modifying the returned slice doesn't affect the flag
|
|
values := flag.Values()
|
|
values[0] = "modified"
|
|
values = append(values, "added")
|
|
|
|
// Flag values should remain unchanged because Values() returns a copy
|
|
assert.Equal(t, []string{"value1", "value2"}, flag.Values())
|
|
}
|
|
|
|
func TestStringArrayFlag_SetDefensiveCopy(t *testing.T) {
|
|
// Test that Set doesn't create a defensive copy (current implementation)
|
|
flag := NewStringArrayFlag([]string{})
|
|
|
|
// Create a slice to set
|
|
setValues := []string{"value1", "value2"}
|
|
flag.Set(setValues)
|
|
|
|
// Verify state after setting
|
|
assert.Equal(t, []string{"value1", "value2"}, flag.Values())
|
|
|
|
// Modify the original slice - this WILL affect the flag's internal state
|
|
// because Set doesn't create a defensive copy in the current implementation
|
|
setValues[0] = "modified"
|
|
|
|
// Flag values will reflect the modification
|
|
assert.Equal(t, []string{"modified", "value2"}, flag.Values())
|
|
}
|