123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- package options
- import (
- "testing"
- "github.com/stretchr/testify/suite"
- )
- type OptionsTestSuite struct {
- suite.Suite
- }
- func (s *OptionsTestSuite) TestGet() {
- o := New()
- o.Set("string_key", "string_value")
- o.Set("bool_key", true)
- // Existing keys
- s.Require().Equal("string_value", Get(o, "string_key", "default_value"))
- s.Require().True(Get(o, "bool_key", false))
- // Non-existing keys
- s.Require().Equal("default_value", Get(o, "non_existing_key", "default_value"))
- s.Require().False(Get(o, "another_non_existing_key", false))
- // Type mismatch
- s.Require().Panics(func() {
- _ = Get(o, "string_key", 42)
- })
- s.Require().Panics(func() {
- _ = Get(o, "bool_key", "not_a_bool")
- })
- }
- func (s *OptionsTestSuite) TestAppendToSlice() {
- o := New()
- o.Set("slice", []int{1, 2, 3})
- // Append to existing slice
- AppendToSlice(o, "slice", 4, 5)
- s.Require().Equal([]int{1, 2, 3, 4, 5}, Get(o, "slice", []int{}))
- // Append to non-existing slice
- AppendToSlice(o, "new_slice", 10, 20)
- s.Require().Equal([]int{10, 20}, Get(o, "new_slice", []int{}))
- // Type mismatch
- s.Require().Panics(func() {
- AppendToSlice(o, "slice", "not_an_int")
- })
- }
- func (s *OptionsTestSuite) TestSliceContains() {
- o := New()
- o.Set("slice", []string{"apple", "banana", "cherry"})
- // Existing values
- s.Require().True(SliceContains(o, "slice", "banana"))
- s.Require().False(SliceContains(o, "slice", "date"))
- // Non-existing slice
- s.Require().False(SliceContains(o, "non_existing_slice", "anything"))
- // Type mismatch
- s.Require().Panics(func() {
- SliceContains(o, "slice", 42)
- })
- }
- func (s *OptionsTestSuite) TestPropagate() {
- o := New()
- o.Set("key1", "value1")
- o.Set("key2", 100)
- o.Set("key3", false)
- child := o.AddChild()
- child.Set("key1", "child_value1")
- child.Set("key3", true)
- grandChild := child.AddChild()
- grandChild.Set("key2", 300)
- o.Propagate("key1")
- o.Propagate("key2")
- s.Require().Equal("value1", Get(child, "key1", ""))
- s.Require().Equal(100, Get(child, "key2", 0))
- s.Require().True(Get(child, "key3", false))
- s.Require().Equal("value1", Get(grandChild, "key1", ""))
- s.Require().Equal(100, Get(grandChild, "key2", 0))
- s.Require().False(grandChild.Has("key3"))
- }
- func (s *OptionsTestSuite) TestDeleteFromDescendants() {
- o := New()
- o.Set("key1", "value1")
- child := o.AddChild()
- child.Set("key1", "child_value1")
- child.Set("key2", 200)
- grandChild := child.AddChild()
- grandChild.Set("key1", "grandchild_value1")
- grandChild.Set("key2", 300)
- o.DeleteFromDescendants("key1")
- s.Require().Equal("value1", Get(o, "key1", ""))
- s.Require().False(child.Has("key1"))
- s.Require().Equal(200, Get(child, "key2", 0))
- s.Require().False(grandChild.Has("key1"))
- s.Require().Equal(300, Get(grandChild, "key2", 0))
- }
- func (s *OptionsTestSuite) TestCopyValue() {
- o := New()
- o.Set("key1", 100)
- o.Set("key2", 200)
- o.Set("key3", 200)
- // Existing to existing
- o.CopyValue("key1", "key2")
- s.Require().Equal(100, Get(o, "key2", 0))
- // Existing to new
- o.CopyValue("key1", "key4")
- s.Require().Equal(100, Get(o, "key4", 0))
- // Non-existing to new
- o.CopyValue("non_existing_key", "key5")
- s.Require().False(o.Has("key5"))
- // Non-existing to existing
- o.CopyValue("another_non_existing_key", "key3")
- s.Require().Equal(200, Get(o, "key3", 0))
- }
- func (s *OptionsTestSuite) TestGetInt() {
- o := New()
- o.Set("int", 42)
- o.Set("int32", int32(32))
- o.Set("int16", int16(16))
- o.Set("int8", int8(8))
- o.Set("float", 3.14)
- o.Set("string", "not_an_int")
- // Integer types
- s.Require().Equal(42, o.GetInt("int", 0))
- s.Require().Equal(32, o.GetInt("int32", 0))
- s.Require().Equal(16, o.GetInt("int16", 0))
- s.Require().Equal(8, o.GetInt("int8", 0))
- // Non-existing key
- s.Require().Equal(100, o.GetInt("non_existing_key", 100))
- // Type mismatch
- s.Require().Panics(func() {
- o.GetInt("float", 0)
- })
- s.Require().Panics(func() {
- o.GetInt("string", 0)
- })
- }
- func (s *OptionsTestSuite) TestGetFloat() {
- o := New()
- o.Set("float64", 3.14)
- o.Set("float32", float32(2.71))
- o.Set("int", 42)
- o.Set("int16", int16(16))
- o.Set("string", "not_a_float")
- // Float types
- s.Require().InDelta(3.14, o.GetFloat("float64", 0.0), 0.000001)
- s.Require().InDelta(2.71, o.GetFloat("float32", 0.0), 0.000001)
- // Integer types
- s.Require().InDelta(42.0, o.GetFloat("int", 0.0), 0.000001)
- s.Require().InDelta(16.0, o.GetFloat("int16", 0.0), 0.000001)
- // Non-existing key
- s.Require().InDelta(1.618, o.GetFloat("non_existing_key", 1.618), 0.000001)
- // Type mismatch
- s.Require().Panics(func() {
- o.GetFloat("string", 0.0)
- })
- }
- func testOptions() *Options {
- o := New()
- o.Set("string_key", "string_value")
- o.Set("int_key", 42)
- o.Set("float_key", 3.14)
- o.Set("bool_key", true)
- o.Set("group1.key1", "value1")
- o.Set("group1.key2", 100)
- o.Set("group2.key1", false)
- o.Set("group2.key2", 2.71)
- o.Set("group2.subgroup.key", "subvalue")
- o.Set("group2.subgroup.num", 256)
- return o
- }
- func testNestedOptions() *Options {
- o := testOptions()
- child := o.AddChild()
- child.Set("string_key", "child_string_value")
- child.Set("int_key", 84)
- child.Set("child_only_key", "only_in_child")
- grandChild := child.AddChild()
- grandChild.Set("string_key", "grandchild_string_value")
- grandChild.Set("int_key", 168)
- grandChild.Set("grandchild_only_key", "only_in_grandchild")
- return o
- }
- func (s *OptionsTestSuite) TestDepth() {
- o := testNestedOptions()
- s.Require().Equal(0, o.Depth())
- s.Require().Equal(1, o.Child().Depth())
- s.Require().Equal(2, o.Child().Child().Depth())
- }
- func (s *OptionsTestSuite) TestMap() {
- s.Run("WithoutChildren", func() {
- o := testOptions()
- expected := map[string]any{
- "string_key": "string_value",
- "int_key": 42,
- "float_key": 3.14,
- "bool_key": true,
- "group1.key1": "value1",
- "group1.key2": 100,
- "group2.key1": false,
- "group2.key2": 2.71,
- "group2.subgroup.key": "subvalue",
- "group2.subgroup.num": 256,
- }
- s.Require().Equal(expected, o.Map())
- })
- s.Run("WithChildren", func() {
- o := testNestedOptions()
- expected := map[string]any{
- "0.string_key": "string_value",
- "0.int_key": 42,
- "0.float_key": 3.14,
- "0.bool_key": true,
- "0.group1.key1": "value1",
- "0.group1.key2": 100,
- "0.group2.key1": false,
- "0.group2.key2": 2.71,
- "0.group2.subgroup.key": "subvalue",
- "0.group2.subgroup.num": 256,
- "1.string_key": "child_string_value",
- "1.int_key": 84,
- "1.child_only_key": "only_in_child",
- "2.string_key": "grandchild_string_value",
- "2.int_key": 168,
- "2.grandchild_only_key": "only_in_grandchild",
- }
- s.Require().Equal(expected, o.Map())
- })
- }
- func (s *OptionsTestSuite) TestNestedMap() {
- s.Run("WithoutChildren", func() {
- o := testOptions()
- expected := map[string]any{
- "string_key": "string_value",
- "int_key": 42,
- "float_key": 3.14,
- "bool_key": true,
- "group1": map[string]any{
- "key1": "value1",
- "key2": 100,
- },
- "group2": map[string]any{
- "key1": false,
- "key2": 2.71,
- "subgroup": map[string]any{
- "key": "subvalue",
- "num": 256,
- },
- },
- }
- s.Require().Equal(expected, o.NestedMap())
- })
- s.Run("WithChildren", func() {
- o := testNestedOptions()
- expected := map[string]any{
- "0": map[string]any{
- "string_key": "string_value",
- "int_key": 42,
- "float_key": 3.14,
- "bool_key": true,
- "group1": map[string]any{
- "key1": "value1",
- "key2": 100,
- },
- "group2": map[string]any{
- "key1": false,
- "key2": 2.71,
- "subgroup": map[string]any{
- "key": "subvalue",
- "num": 256,
- },
- },
- },
- "1": map[string]any{
- "string_key": "child_string_value",
- "int_key": 84,
- "child_only_key": "only_in_child",
- },
- "2": map[string]any{
- "string_key": "grandchild_string_value",
- "int_key": 168,
- "grandchild_only_key": "only_in_grandchild",
- },
- }
- s.Require().Equal(expected, o.NestedMap())
- })
- }
- func TestOptions(t *testing.T) {
- suite.Run(t, new(OptionsTestSuite))
- }
- func BenchmarkLogValue(b *testing.B) {
- o := testNestedOptions()
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- _ = o.LogValue()
- }
- }
- func BenchmarkNestedMap(b *testing.B) {
- o := testNestedOptions()
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- _ = o.NestedMap()
- }
- }
- func BenchmarkMap(b *testing.B) {
- o := testNestedOptions()
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- _ = o.Map()
- }
- }
|