1// misc_test.go
2
3package mxj
4
5import (
6	"fmt"
7	"testing"
8)
9
10var miscdata = []byte(`
11<doc>
12	<elem1 name="elem1" seq="1">
13		<sub1 name="sub1" seq="1">sub_value_1</sub1>
14		<sub2 name="sub2" seq="2">sub_value_2</sub2>
15	</elem1>
16	<elem2 name="elem2" seq="2">element_2</elem2>
17</doc>
18`)
19
20func TestMisc(t *testing.T) {
21	PrependAttrWithHyphen(true) // be safe
22	fmt.Println("\n------------------ misc_test.go ...")
23}
24
25func TestRoot(t *testing.T) {
26	m, err := NewMapXml(miscdata)
27	if err != nil {
28		t.Fatal(err)
29	}
30	r, err := m.Root()
31	if err != nil {
32		t.Fatal(err)
33	}
34	if r != "doc" {
35		t.Fatal("Root not doc:", r)
36	}
37}
38
39func TestElements(t *testing.T) {
40	m, err := NewMapXml(miscdata)
41	if err != nil {
42		t.Fatal(err)
43	}
44	e, err := m.Elements("doc")
45	if err != nil {
46		t.Fatal(err)
47	}
48	elist := []string{"elem1", "elem2"}
49	for i, ee := range e {
50		if ee != elist[i] {
51			t.Fatal("error in list, elem#:", i, "-", ee, ":", elist[i])
52		}
53	}
54
55	e, err = m.Elements("doc.elem1")
56	if err != nil {
57		t.Fatal(err)
58	}
59	elist = []string{"sub1", "sub2"}
60	for i, ee := range e {
61		if ee != elist[i] {
62			t.Fatal("error in list, elem#:", i, "-", ee, ":", elist[i])
63		}
64	}
65}
66
67func TestAttributes(t *testing.T) {
68	m, err := NewMapXml(miscdata)
69	if err != nil {
70		t.Fatal(err)
71	}
72	a, err := m.Attributes("doc.elem2")
73	if err != nil {
74		t.Fatal(err)
75	}
76	alist := []string{"name", "seq"}
77	for i, aa := range a {
78		if aa != alist[i] {
79			t.Fatal("error in list, elem#:", i, "-", aa, ":", alist[i])
80		}
81	}
82
83	a, err = m.Attributes("doc.elem1.sub2")
84	if err != nil {
85		t.Fatal(err)
86	}
87	alist = []string{"name", "seq"}
88	for i, aa := range a {
89		if aa != alist[i] {
90			t.Fatal("error in list, elem#:", i, "-", aa, ":", alist[i])
91		}
92	}
93}
94
95func TestElementsAttrPrefix(t *testing.T) {
96	SetAttrPrefix("__")
97	m, err := NewMapXml(miscdata)
98	if err != nil {
99		t.Fatal(err)
100	}
101	e, err := m.Elements("doc")
102	if err != nil {
103		t.Fatal(err)
104	}
105	elist := []string{"elem1", "elem2"}
106	for i, ee := range e {
107		if ee != elist[i] {
108			t.Fatal("error in list, elem#:", i, "-", ee, ":", elist[i])
109		}
110	}
111
112	e, err = m.Elements("doc.elem1")
113	if err != nil {
114		t.Fatal(err)
115	}
116	elist = []string{"sub1", "sub2"}
117	for i, ee := range e {
118		if ee != elist[i] {
119			t.Fatal("error in list, elem#:", i, "-", ee, ":", elist[i])
120		}
121	}
122}
123
124func TestAttributesAttrPrefix(t *testing.T) {
125	SetAttrPrefix("__")
126	m, err := NewMapXml(miscdata)
127	if err != nil {
128		t.Fatal(err)
129	}
130	a, err := m.Attributes("doc.elem2")
131	if err != nil {
132		t.Fatal(err)
133	}
134	alist := []string{"name", "seq"}
135	for i, aa := range a {
136		if aa != alist[i] {
137			t.Fatal("error in list, elem#:", i, "-", aa, ":", alist[i])
138		}
139	}
140
141	a, err = m.Attributes("doc.elem1.sub2")
142	if err != nil {
143		t.Fatal(err)
144	}
145	alist = []string{"name", "seq"}
146	for i, aa := range a {
147		if aa != alist[i] {
148			t.Fatal("error in list, elem#:", i, "-", aa, ":", alist[i])
149		}
150	}
151}
152
153func TestElementsNoAttrPrefix(t *testing.T) {
154	PrependAttrWithHyphen(false)
155	m, err := NewMapXml(miscdata)
156	if err != nil {
157		t.Fatal(err)
158	}
159	e, err := m.Elements("doc")
160	if err != nil {
161		t.Fatal(err)
162	}
163	if len(e) != 2 {
164		t.Fatal("didn't get 2 elements:", e)
165	}
166
167	e, err = m.Elements("doc.elem1")
168	if err != nil {
169		t.Fatal(err)
170	}
171	if len(e) != 4 {
172		t.Fatal("didn't get 4 elements:", e)
173	}
174	PrependAttrWithHyphen(true)
175}
176
177func TestAttributesNoAttrPrefix(t *testing.T) {
178	PrependAttrWithHyphen(false)
179	m, err := NewMapXml(miscdata)
180	if err != nil {
181		t.Fatal(err)
182	}
183	a, err := m.Attributes("doc.elem2")
184	if err != nil {
185		t.Fatal(err)
186	}
187	if len(a) > 0 {
188		t.Fatal("found attributes where there are none:", a)
189	}
190
191	a, err = m.Attributes("doc.elem1.sub2")
192	if err != nil {
193		t.Fatal(err)
194	}
195	if len(a) > 0 {
196		t.Fatal("found attributes where there are none:", a)
197	}
198	PrependAttrWithHyphen(true)
199}
200
201var whiteSpaceData = []byte("<doc><elem3> hello world </elem3></doc>")
202
203func TestPreserveSpaceDisableByDefault(t *testing.T) {
204	const (
205		path       = "doc.elem3"
206		input      = " hello world "
207		trimmed    = "hello world"
208		notTrimmed = input
209	)
210	tcs := []struct {
211		name           string
212		args           []bool
213		expectedOutput string
214	}{
215		{
216			name:           "Default Preserve Space disabled should trim values",
217			args:           nil, // nil will result in the `DisableWhiteSpace` to be skipped
218			expectedOutput: trimmed,
219		},
220		{
221			name:           "Single true is passed should not trim values",
222			args:           []bool{true},
223			expectedOutput: notTrimmed,
224		},
225		{
226			name:           "Single false is passed should trim values",
227			args:           []bool{false},
228			expectedOutput: trimmed,
229		},
230		{
231			name:           "No args are passed should not trim values",
232			args:           []bool{},
233			expectedOutput: notTrimmed,
234		},
235		{
236			name:           "Extra arguments should be ignored",
237			args:           []bool{true, false},
238			expectedOutput: notTrimmed,
239		},
240		{
241			name:           "Extra arguments should be ignored with false",
242			args:           []bool{false, true},
243			expectedOutput: trimmed,
244		},
245	}
246	for _, tc := range tcs {
247		t.Run(tc.name, func(t *testing.T) {
248			if tc.args != nil {
249				DisableTrimWhiteSpace(tc.args...)
250			}
251			m, err := NewMapXml(whiteSpaceData)
252
253			if err != nil {
254				t.Fatal(err)
255			}
256
257			s, err := m.ValueForPath(path)
258			if err != nil {
259				t.Fatal(err)
260			}
261			if s != tc.expectedOutput {
262				t.Fatalf("expected '%s' got '%s'", tc.expectedOutput, s)
263			}
264		})
265	}
266	// Set it back to false after all tests are done
267	DisableTrimWhiteSpace(false)
268}
269