1package objx_test 2 3import ( 4 "testing" 5 6 "github.com/stretchr/objx" 7 "github.com/stretchr/testify/assert" 8) 9 10func TestAccessorsAccessGetSingleField(t *testing.T) { 11 m := objx.Map{"name": "Tyler"} 12 13 assert.Equal(t, "Tyler", m.Get("name").Data()) 14} 15 16func TestAccessorsAccessGetSingleFieldInt(t *testing.T) { 17 m := objx.Map{"name": 10} 18 19 assert.Equal(t, 10, m.Get("name").Data()) 20} 21 22func TestAccessorsAccessGetDeep(t *testing.T) { 23 m := objx.Map{ 24 "name": objx.Map{ 25 "first": "Tyler", 26 "last": "Bunnell", 27 "friends": []string{ 28 "Capitol", 29 "Bollocks", 30 }, 31 "ifriends": []interface{}{ 32 "Capitol", 33 "Bollocks", 34 }, 35 }, 36 } 37 38 assert.Equal(t, "Tyler", m.Get("name.first").Data()) 39 assert.Equal(t, "Bunnell", m.Get("name.last").Data()) 40 assert.Equal(t, "Capitol", m.Get("name.friends[0]").Data()) 41 assert.Equal(t, "Capitol", m.Get("name.ifriends[0]").Data()) 42} 43 44func TestAccessorsAccessGetDeepDeep(t *testing.T) { 45 m := objx.Map{ 46 "one": objx.Map{ 47 "two": objx.Map{ 48 "three": objx.Map{ 49 "four": 4, 50 }, 51 }, 52 }, 53 } 54 55 assert.Equal(t, 4, m.Get("one.two.three.four").Data()) 56 assert.Equal(t, 4, m.Get("one[two][three][four]").Data()) 57} 58 59func TestAccessorsGetWithComplexKey(t *testing.T) { 60 m := objx.Map{ 61 "domains": objx.Map{ 62 "example-dot-com": objx.Map{ 63 "apex": "example", 64 }, 65 "example.com": objx.Map{ 66 "apex": "example", 67 }, 68 }, 69 } 70 71 assert.Equal(t, "example", m.Get("domains.example-dot-com.apex").Data()) 72 73 assert.Equal(t, "example", m.Get("domains[example.com].apex").Data()) 74 assert.Equal(t, "example", m.Get("domains[example.com][apex]").Data()) 75} 76 77func TestAccessorsAccessGetInsideArray(t *testing.T) { 78 m := objx.Map{ 79 "names": []interface{}{ 80 objx.Map{ 81 "first": "Tyler", 82 "last": "Bunnell", 83 }, 84 objx.Map{ 85 "first": "Capitol", 86 "last": "Bollocks", 87 }, 88 }, 89 } 90 91 assert.Equal(t, "Tyler", m.Get("names[0].first").Data()) 92 assert.Equal(t, "Bunnell", m.Get("names[0].last").Data()) 93 assert.Equal(t, "Capitol", m.Get("names[1].first").Data()) 94 assert.Equal(t, "Bollocks", m.Get("names[1].last").Data()) 95 96 assert.Nil(t, m.Get("names[2]").Data()) 97 assert.Nil(t, m.Get("names[]").Data()) 98 assert.Nil(t, m.Get("names1]]").Data()) 99 assert.Nil(t, m.Get("names[1]]").Data()) 100 assert.Nil(t, m.Get("names[[1]]").Data()) 101 assert.Nil(t, m.Get("names[[1]").Data()) 102 assert.Nil(t, m.Get("names[[1").Data()) 103} 104 105func TestAccessorsGet(t *testing.T) { 106 m := objx.Map{"name": "Tyler"} 107 108 assert.Equal(t, "Tyler", m.Get("name").Data()) 109} 110 111func TestAccessorsAccessSetSingleField(t *testing.T) { 112 m := objx.Map{"name": "Tyler"} 113 114 m.Set("name", "Mat") 115 m.Set("age", 29) 116 117 assert.Equal(t, m.Get("name").Data(), "Mat") 118 assert.Equal(t, m.Get("age").Data(), 29) 119} 120 121func TestAccessorsAccessSetSingleFieldNotExisting(t *testing.T) { 122 m := objx.Map{ 123 "first": "Tyler", 124 "last": "Bunnell", 125 } 126 127 m.Set("name", "Mat") 128 129 assert.Equal(t, m.Get("name").Data(), "Mat") 130} 131 132func TestAccessorsAccessSetDeep(t *testing.T) { 133 m := objx.Map{ 134 "name": objx.Map{ 135 "first": "Tyler", 136 "last": "Bunnell", 137 }, 138 } 139 140 m.Set("name.first", "Mat") 141 m.Set("name.last", "Ryer") 142 143 assert.Equal(t, "Mat", m.Get("name.first").Data()) 144 assert.Equal(t, "Ryer", m.Get("name.last").Data()) 145} 146 147func TestAccessorsAccessSetDeepDeep(t *testing.T) { 148 m := objx.Map{ 149 "one": objx.Map{ 150 "two": objx.Map{ 151 "three": objx.Map{ 152 "four": 4, 153 }, 154 }, 155 }, 156 } 157 158 m.Set("one.two.three.four", 5) 159 160 assert.Equal(t, 5, m.Get("one.two.three.four").Data()) 161} 162 163func TestAccessorsAccessSetDeepDeepWithoutExisting(t *testing.T) { 164 m := objx.Map{} 165 166 m.Set("one.two.three.four", 5) 167 m.Set("one.two.three.five", 6) 168 169 assert.Equal(t, 5, m.Get("one.two.three.four").Data()) 170 assert.Equal(t, 6, m.Get("one.two.three.five").Data()) 171 172 m.Set("one.two", 7) 173 assert.Equal(t, 7, m.Get("one.two").Data()) 174 assert.Equal(t, nil, m.Get("one.two.three.four").Data()) 175 176 m.Set("one.two.three", 8) 177 assert.Equal(t, 8, m.Get("one.two.three").Data()) 178} 179 180func TestAccessorsAccessSetArray(t *testing.T) { 181 m := objx.Map{ 182 "names": []interface{}{"Tyler"}, 183 } 184 m.Set("names[0]", "Mat") 185 186 assert.Equal(t, "Mat", m.Get("names[0]").Data()) 187} 188 189func TestAccessorsAccessSetInsideArray(t *testing.T) { 190 m := objx.Map{ 191 "names": []interface{}{ 192 objx.Map{ 193 "first": "Tyler", 194 "last": "Bunnell", 195 }, 196 objx.Map{ 197 "first": "Capitol", 198 "last": "Bollocks", 199 }, 200 }, 201 } 202 203 m.Set("names[0].first", "Mat") 204 m.Set("names[0].last", "Ryer") 205 m.Set("names[1].first", "Captain") 206 m.Set("names[1].last", "Underpants") 207 208 assert.Equal(t, "Mat", m.Get("names[0].first").Data()) 209 assert.Equal(t, "Ryer", m.Get("names[0].last").Data()) 210 assert.Equal(t, "Captain", m.Get("names[1].first").Data()) 211 assert.Equal(t, "Underpants", m.Get("names[1].last").Data()) 212} 213 214func TestAccessorsSet(t *testing.T) { 215 m := objx.Map{"name": "Tyler"} 216 217 m.Set("name", "Mat") 218 219 assert.Equal(t, "Mat", m.Get("name").Data()) 220} 221