github.com/graemephi/kahugo@v0.62.3-0.20211121071557-d78c0423784d/common/maps/params_test.go (about) 1 // Copyright 2019 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package maps 15 16 import ( 17 "testing" 18 19 qt "github.com/frankban/quicktest" 20 ) 21 22 func TestGetNestedParam(t *testing.T) { 23 m := map[string]interface{}{ 24 "string": "value", 25 "first": 1, 26 "with_underscore": 2, 27 "nested": map[string]interface{}{ 28 "color": "blue", 29 "nestednested": map[string]interface{}{ 30 "color": "green", 31 }, 32 }, 33 } 34 35 c := qt.New(t) 36 37 must := func(keyStr, separator string, candidates ...Params) interface{} { 38 v, err := GetNestedParam(keyStr, separator, candidates...) 39 c.Assert(err, qt.IsNil) 40 return v 41 } 42 43 c.Assert(must("first", "_", m), qt.Equals, 1) 44 c.Assert(must("First", "_", m), qt.Equals, 1) 45 c.Assert(must("with_underscore", "_", m), qt.Equals, 2) 46 c.Assert(must("nested_color", "_", m), qt.Equals, "blue") 47 c.Assert(must("nested.nestednested.color", ".", m), qt.Equals, "green") 48 c.Assert(must("string.name", ".", m), qt.IsNil) 49 c.Assert(must("nested.foo", ".", m), qt.IsNil) 50 } 51 52 // https://github.com/gohugoio/hugo/issues/7903 53 func TestGetNestedParamFnNestedNewKey(t *testing.T) { 54 c := qt.New(t) 55 56 nested := map[string]interface{}{ 57 "color": "blue", 58 } 59 m := map[string]interface{}{ 60 "nested": nested, 61 } 62 63 existing, nestedKey, owner, err := GetNestedParamFn("nested.new", ".", func(key string) interface{} { 64 return m[key] 65 }) 66 67 c.Assert(err, qt.IsNil) 68 c.Assert(existing, qt.IsNil) 69 c.Assert(nestedKey, qt.Equals, "new") 70 c.Assert(owner, qt.DeepEquals, nested) 71 } 72 73 func TestParamsSetAndMerge(t *testing.T) { 74 c := qt.New(t) 75 76 createParamsPair := func() (Params, Params) { 77 p1 := Params{"a": "av", "c": "cv", "nested": Params{"al2": "al2v", "cl2": "cl2v"}} 78 p2 := Params{"b": "bv", "a": "abv", "nested": Params{"bl2": "bl2v", "al2": "al2bv"}, mergeStrategyKey: ParamsMergeStrategyDeep} 79 return p1, p2 80 } 81 82 p1, p2 := createParamsPair() 83 84 p1.Set(p2) 85 86 c.Assert(p1, qt.DeepEquals, Params{ 87 "a": "abv", 88 "c": "cv", 89 "nested": Params{ 90 "al2": "al2bv", 91 "cl2": "cl2v", 92 "bl2": "bl2v", 93 }, 94 "b": "bv", 95 mergeStrategyKey: ParamsMergeStrategyDeep, 96 }) 97 98 p1, p2 = createParamsPair() 99 100 p1.Merge(p2) 101 102 // Default is to do a shallow merge. 103 c.Assert(p1, qt.DeepEquals, Params{ 104 "c": "cv", 105 "nested": Params{ 106 "al2": "al2v", 107 "cl2": "cl2v", 108 }, 109 "b": "bv", 110 "a": "av", 111 }) 112 113 p1, p2 = createParamsPair() 114 p1.SetDefaultMergeStrategy(ParamsMergeStrategyNone) 115 p1.Merge(p2) 116 p1.DeleteMergeStrategy() 117 118 c.Assert(p1, qt.DeepEquals, Params{ 119 "a": "av", 120 "c": "cv", 121 "nested": Params{ 122 "al2": "al2v", 123 "cl2": "cl2v", 124 }, 125 }) 126 127 p1, p2 = createParamsPair() 128 p1.SetDefaultMergeStrategy(ParamsMergeStrategyShallow) 129 p1.Merge(p2) 130 p1.DeleteMergeStrategy() 131 132 c.Assert(p1, qt.DeepEquals, Params{ 133 "a": "av", 134 "c": "cv", 135 "nested": Params{ 136 "al2": "al2v", 137 "cl2": "cl2v", 138 }, 139 "b": "bv", 140 }) 141 142 p1, p2 = createParamsPair() 143 p1.SetDefaultMergeStrategy(ParamsMergeStrategyDeep) 144 p1.Merge(p2) 145 p1.DeleteMergeStrategy() 146 147 c.Assert(p1, qt.DeepEquals, Params{ 148 "nested": Params{ 149 "al2": "al2v", 150 "cl2": "cl2v", 151 "bl2": "bl2v", 152 }, 153 "b": "bv", 154 "a": "av", 155 "c": "cv", 156 }) 157 158 } 159 160 func TestParamsIsZero(t *testing.T) { 161 c := qt.New(t) 162 163 var nilParams Params 164 165 c.Assert(Params{}.IsZero(), qt.IsTrue) 166 c.Assert(nilParams.IsZero(), qt.IsTrue) 167 c.Assert(Params{"foo": "bar"}.IsZero(), qt.IsFalse) 168 c.Assert(Params{"_merge": "foo", "foo": "bar"}.IsZero(), qt.IsFalse) 169 c.Assert(Params{"_merge": "foo"}.IsZero(), qt.IsTrue) 170 }