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