123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- package sortedmap
- import (
- "testing"
- "github.com/stretchr/testify/assert"
- )
- func Test_SortedMap(t *testing.T) {
- sm := New()
- t.Run("SetExpression", func(t *testing.T) {
- _, _, err := sm.SetExpression("")
- assert.ErrorIs(t, err, ErrInvalidKVExpression)
- _, _, err = sm.SetExpression("foo")
- assert.ErrorIs(t, err, ErrInvalidKVExpression)
- _, _, err = sm.SetExpression("foo= ")
- assert.ErrorIs(t, err, ErrInvalidKVExpression)
- _, _, err = sm.SetExpression(" foo=")
- assert.ErrorIs(t, err, ErrInvalidKVExpression)
- _, _, err = sm.SetExpression("foo =")
- assert.ErrorIs(t, err, ErrInvalidKVExpression)
- _, _, err = sm.SetExpression("=")
- assert.ErrorIs(t, err, ErrInvalidKVExpression)
- _, _, err = sm.SetExpression("=bar")
- assert.ErrorIs(t, err, ErrInvalidKVExpression)
- key, value, err := sm.SetExpression("foo=bar")
- assert.Nil(t, err)
- assert.Equal(t, "foo", key)
- assert.Equal(t, "bar", value)
- key, value, err = sm.SetExpression("foo=")
- assert.Nil(t, err)
- assert.Equal(t, value, sm.GetOr(key, ""))
- sm.Reset()
- })
- t.Run("SetKV", func(t *testing.T) {
- sm.SetKV("foo", "bar")
- assert.Equal(t, "bar", sm.GetOr("foo", ""))
- sm.SetKV("foo", "bar-changed")
- assert.Equal(t, "bar-changed", sm.GetOr("foo", ""))
- sm.Reset()
- })
- t.Run("Set", func(t *testing.T) {
- err := sm.Set(KV{})
- assert.Nil(t, err)
- err = sm.Set(KV{"foo"})
- assert.ErrorIs(t, ErrInvalidKVS, err)
- err = sm.Set(KV{"foo", "bar", "bar", "foo"})
- assert.Nil(t, err)
- assert.Equal(t, "bar", sm.GetOr("foo", ""))
- assert.Equal(t, "foo", sm.GetOr("bar", ""))
- sm.Reset()
- })
- t.Run("Get", func(t *testing.T) {
- _, ok := sm.Get("foo")
- assert.False(t, ok)
- sm.SetKV("foo", "bar")
- value, ok := sm.Get("foo")
- assert.True(t, ok)
- assert.Equal(t, "bar", value)
- sm.Reset()
- })
- t.Run("GetString", func(t *testing.T) {
- _, ok := sm.GetString("foo")
- assert.False(t, ok)
- sm.SetKV("foo", "bar")
- value, ok := sm.GetString("foo")
- assert.True(t, ok)
- assert.Equal(t, "bar", value)
- sm.Reset()
- })
- t.Run("GetStringOr", func(t *testing.T) {
- value := sm.GetStringOr("foo", "bar")
- assert.Equal(t, "bar", value)
- sm.SetKV("foo", "foo")
- value = sm.GetStringOr("foo", "bar")
- assert.Equal(t, "foo", value)
- sm.Reset()
- })
- t.Run("GetOr", func(t *testing.T) {
- value := sm.GetOr("foo", "bar")
- assert.Equal(t, "bar", value)
- sm.SetKV("foo", "foo")
- value = sm.GetOr("foo", "bar")
- assert.Equal(t, "foo", value)
- sm.Reset()
- })
- t.Run("HasKey", func(t *testing.T) {
- ok := sm.HasKey("foo")
- assert.False(t, ok)
- sm.SetKV("foo", "")
- assert.True(t, sm.HasKey("foo"))
- sm.Reset()
- })
- t.Run("HasValue", func(t *testing.T) {
- assert.False(t, sm.HasValue("bar"))
- sm.SetKV("foo", "bar")
- assert.True(t, sm.HasValue("bar"))
- sm.Reset()
- })
- t.Run("Keys", func(t *testing.T) {
- keys := sm.Keys()
- assert.Equal(t, 0, len(keys))
- expected := []string{"foo1", "foo2", "foo3"}
- for _, key := range expected {
- sm.SetKV(key, "")
- }
- keys = sm.Keys()
- var actual []string
- for _, key := range keys {
- actual = append(actual, key.(string))
- }
- assert.Equal(t, expected, actual)
- sm.Reset()
- })
- t.Run("Values", func(t *testing.T) {
- values := sm.Values()
- assert.Equal(t, 0, len(values))
- expected := []string{"foo1", "foo2", "foo3"}
- for _, key := range expected {
- sm.SetKV(key, key)
- }
- values = sm.Values()
- var actual []string
- for _, value := range values {
- actual = append(actual, value.(string))
- }
- assert.Equal(t, expected, actual)
- sm.Reset()
- })
- t.Run("Range", func(t *testing.T) {
- var keys, values []string
- sm.Range(func(key, value any) {
- keys = append(keys, key.(string))
- values = append(values, value.(string))
- })
- assert.Len(t, keys, 0)
- assert.Len(t, values, 0)
- expected := []string{"foo1", "foo2", "foo3"}
- for _, key := range expected {
- sm.SetKV(key, key)
- }
- sm.Range(func(key, value any) {
- keys = append(keys, key.(string))
- values = append(values, value.(string))
- })
- assert.Equal(t, expected, keys)
- assert.Equal(t, expected, values)
- sm.Reset()
- })
- t.Run("RangeIf", func(t *testing.T) {
- var keys, values []string
- sm.RangeIf(func(key, value any) bool {
- keys = append(keys, key.(string))
- values = append(values, value.(string))
- return true
- })
- assert.Len(t, keys, 0)
- assert.Len(t, values, 0)
- expected := []string{"foo1", "foo2", "foo3"}
- for _, key := range expected {
- sm.SetKV(key, key)
- }
- sm.RangeIf(func(key, value any) bool {
- keys = append(keys, key.(string))
- values = append(values, value.(string))
- if key.(string) == "foo1" {
- return false
- }
- return true
- })
- assert.Equal(t, []string{"foo1"}, keys)
- assert.Equal(t, []string{"foo1"}, values)
- sm.Reset()
- })
- t.Run("Remove", func(t *testing.T) {
- _, ok := sm.Remove("foo")
- assert.False(t, ok)
- sm.SetKV("foo", "bar")
- value, ok := sm.Remove("foo")
- assert.True(t, ok)
- assert.Equal(t, "bar", value)
- assert.False(t, sm.HasKey("foo"))
- assert.False(t, sm.HasValue("bar"))
- sm.Reset()
- })
- t.Run("Insert", func(t *testing.T) {
- data := New()
- data.SetKV("foo", "bar")
- sm.SetKV("foo1", "bar1")
- sm.Insert(data)
- assert.True(t, sm.HasKey("foo"))
- assert.True(t, sm.HasValue("bar"))
- sm.Reset()
- })
- t.Run("Copy", func(t *testing.T) {
- sm.SetKV("foo", "bar")
- data := sm.Copy()
- assert.True(t, data.HasKey("foo"))
- assert.True(t, data.HasValue("bar"))
- sm.SetKV("foo", "bar1")
- assert.True(t, data.HasKey("foo"))
- assert.True(t, data.HasValue("bar"))
- sm.Reset()
- })
- t.Run("Format", func(t *testing.T) {
- format := sm.Format()
- assert.Equal(t, []string{}, format)
- sm.SetKV("foo1", "bar1")
- sm.SetKV("foo2", "bar2")
- sm.SetKV("foo3", "")
- format = sm.Format()
- assert.Equal(t, []string{"foo1=bar1", "foo2=bar2", "foo3="}, format)
- sm.Reset()
- })
- }
|