diff --git a/exchanges/subscription/list.go b/exchanges/subscription/list.go index 30b3cd5c59f..51d6edfa082 100644 --- a/exchanges/subscription/list.go +++ b/exchanges/subscription/list.go @@ -46,6 +46,15 @@ func (l List) GroupPairs() (n List) { return s.List() } +// Clone returns a deep clone of the List +func (l List) Clone() List { + n := make(List, len(l)) + for i, s := range l { + n[i] = s.Clone() + } + return n +} + // QualifiedChannels returns a sorted list of all the qualified Channels in the list func (l List) QualifiedChannels() []string { c := make([]string, len(l)) diff --git a/exchanges/subscription/list_test.go b/exchanges/subscription/list_test.go index e1a338b4dd4..091f39cc8f8 100644 --- a/exchanges/subscription/list_test.go +++ b/exchanges/subscription/list_test.go @@ -91,3 +91,12 @@ func TestAssetPairs(t *testing.T) { assert.ErrorIs(t, err, expErr, "Should error correctly on GetPairFormat") } } + +func TestListClone(t *testing.T) { + t.Parallel() + l := List{{Channel: TickerChannel}, {Channel: OrderbookChannel}} + n := l.Clone() + assert.NotSame(t, n, l, "Slices must not be the same") + require.NotEmpty(t, n, "List must not be empty") + assert.NotSame(t, n[0], l[0], "Subscriptions must be cloned") +} diff --git a/exchanges/subscription/subscription_test.go b/exchanges/subscription/subscription_test.go index bd9a9a2759a..edc828a8b22 100644 --- a/exchanges/subscription/subscription_test.go +++ b/exchanges/subscription/subscription_test.go @@ -90,8 +90,7 @@ func TestSubscriptionMarshaling(t *testing.T) { assert.Equal(t, `{"enabled":true,"channel":"myTrades","authenticated":true}`, string(j), "Marshalling should be clean and concise") } -// TestClone exercises Clone -func TestClone(t *testing.T) { +func TestSubscriptionClone(t *testing.T) { t.Parallel() params := map[string]any{"a": 42} a := &Subscription{