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