Skip to content

Commit e7be426

Browse files
authored
Fix XML unmarshaling (#7)
1 parent 69ce7dc commit e7be426

File tree

2 files changed

+160
-23
lines changed

2 files changed

+160
-23
lines changed

senml.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ func (p Pack) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
189189
// UnmarshalXML implements xml.Unmarshaler. It decodes a XML encoded SenML Pack.
190190
func (p *Pack) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
191191
n := xmlPack{}
192-
err := d.Decode(&n)
192+
err := d.DecodeElement(&n, &start)
193193
if err != nil {
194194
return err
195195
}

senml_test.go

Lines changed: 159 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,134 @@ func fptr(f float64) *float64 {
1010
return &f
1111
}
1212

13+
func fbool(b bool) *bool {
14+
return &b
15+
}
16+
17+
func TestEquals(t *testing.T) {
18+
tcs := []struct {
19+
a Pack
20+
b Pack
21+
res bool
22+
}{
23+
{
24+
a: Pack{
25+
{Name: "foo", Value: fptr(1)},
26+
{Name: "bar", BoolValue: fbool(true)},
27+
},
28+
b: Pack{
29+
{Name: "foo", Value: fptr(1)},
30+
{Name: "bar", BoolValue: fbool(true)},
31+
},
32+
res: true,
33+
},
34+
{
35+
a: Pack{
36+
{Name: "foo", Value: fptr(1)},
37+
},
38+
b: nil,
39+
res: false,
40+
},
41+
{
42+
a: nil,
43+
b: Pack{
44+
{Name: "foo", Value: fptr(1)},
45+
},
46+
res: false,
47+
},
48+
{
49+
a: Pack{
50+
{Name: "foo", Value: fptr(1)},
51+
},
52+
b: Pack{
53+
{Name: "foo", Value: fptr(1)},
54+
{Name: "foo", Value: fptr(1)},
55+
},
56+
res: false,
57+
},
58+
{
59+
a: Pack{
60+
{Name: "foo", Value: fptr(1)},
61+
{Name: "foo", Value: fptr(1)},
62+
},
63+
b: Pack{
64+
{Name: "foo", Value: fptr(1)},
65+
},
66+
res: false,
67+
},
68+
{
69+
a: Pack{
70+
{Name: "foo", Value: fptr(1)},
71+
},
72+
b: Pack{
73+
{Name: "foo", Value: fptr(2)},
74+
},
75+
res: false,
76+
},
77+
{
78+
a: Pack{
79+
{Name: "foo", Value: fptr(1)},
80+
},
81+
b: Pack{
82+
{Name: "foo"},
83+
},
84+
res: false,
85+
},
86+
{
87+
a: Pack{
88+
{Name: "foo", BoolValue: fbool(true)},
89+
},
90+
b: Pack{
91+
{Name: "foo", BoolValue: fbool(false)},
92+
},
93+
res: false,
94+
},
95+
{
96+
a: Pack{
97+
{Name: "foo", BoolValue: fbool(true)},
98+
},
99+
b: Pack{
100+
{Name: "foo"},
101+
},
102+
res: false,
103+
},
104+
}
105+
for _, tc := range tcs {
106+
if tc.a.Equals(tc.b) != tc.res {
107+
t.Errorf("Equals with %+v and %+v should return %v", tc.a, tc.b, tc.res)
108+
}
109+
}
110+
}
111+
13112
func TestNormalize(t *testing.T) {
14113
tcs := []struct {
15114
src Pack
16115
norm Pack
17116
}{
18117
{
19118
src: Pack{
20-
{BaseName: "urn:dev:ow:10e2073a01080063", BaseTime: 1.320067464e+09, BaseUnit: "%RH", Value: fptr(20)},
21-
{Unit: "lon", Value: fptr(24.30621)},
22-
{Unit: "lat", Value: fptr(60.07965)},
119+
{BaseName: "urn:dev:ow:10e2073a01080063", BaseTime: 1.320067464e+09, BaseUnit: RelativeHumidity, Value: fptr(20)},
120+
{Unit: DegreesLongitude, Value: fptr(24.30621)},
121+
{Unit: DegreesLatitude, Value: fptr(60.07965)},
23122
{Time: 60, Value: fptr(20.3)},
24-
{Unit: "lon", Time: 60, Value: fptr(24.30622)},
25-
{Unit: "lat", Time: 60, Value: fptr(60.07965)},
123+
{Unit: DegreesLongitude, Time: 60, Value: fptr(24.30622)},
124+
{Unit: DegreesLatitude, Time: 60, Value: fptr(60.07965)},
26125
{Time: 120, Value: fptr(20.7)},
27-
{Unit: "lon", Time: 120, Value: fptr(24.30623)},
28-
{Unit: "lat", Time: 120, Value: fptr(60.07966)},
29-
{Unit: "%EL", Time: 150, Value: fptr(98)},
126+
{Unit: DegreesLongitude, Time: 120, Value: fptr(24.30623)},
127+
{Unit: DegreesLatitude, Time: 120, Value: fptr(60.07966)},
128+
{Unit: EnergyLevel, Time: 150, Value: fptr(98)},
30129
},
31130
norm: Pack{
32-
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067464e+09, Unit: "%RH", Value: fptr(20), Version: 5},
33-
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067464e+09, Unit: "lon", Value: fptr(24.30621), Version: 5},
34-
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067464e+09, Unit: "lat", Value: fptr(60.07965), Version: 5},
35-
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067524e+09, Unit: "%RH", Value: fptr(20.3), Version: 5},
36-
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067524e+09, Unit: "lon", Value: fptr(24.30622), Version: 5},
37-
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067524e+09, Unit: "lat", Value: fptr(60.07965), Version: 5},
38-
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067584e+09, Unit: "%RH", Value: fptr(20.7), Version: 5},
39-
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067584e+09, Unit: "lon", Value: fptr(24.30623), Version: 5},
40-
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067584e+09, Unit: "lat", Value: fptr(60.07966), Version: 5},
41-
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067614e+09, Unit: "%EL", Value: fptr(98), Version: 5},
131+
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067464e+09, Unit: RelativeHumidity, Value: fptr(20)},
132+
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067464e+09, Unit: DegreesLongitude, Value: fptr(24.30621)},
133+
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067464e+09, Unit: DegreesLatitude, Value: fptr(60.07965)},
134+
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067524e+09, Unit: RelativeHumidity, Value: fptr(20.3)},
135+
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067524e+09, Unit: DegreesLongitude, Value: fptr(24.30622)},
136+
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067524e+09, Unit: DegreesLatitude, Value: fptr(60.07965)},
137+
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067584e+09, Unit: RelativeHumidity, Value: fptr(20.7)},
138+
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067584e+09, Unit: DegreesLongitude, Value: fptr(24.30623)},
139+
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067584e+09, Unit: DegreesLatitude, Value: fptr(60.07966)},
140+
{Name: "urn:dev:ow:10e2073a01080063", Time: 1.320067614e+09, Unit: EnergyLevel, Value: fptr(98)},
42141
},
43142
},
44143
{
@@ -47,7 +146,7 @@ func TestNormalize(t *testing.T) {
47146
{Name: "bar", Value: fptr(1)},
48147
},
49148
norm: Pack{
50-
{Name: "foo.bar", Value: fptr(1), Version: 5},
149+
{Name: "foo.bar", Value: fptr(1)},
51150
},
52151
},
53152
{
@@ -56,7 +155,7 @@ func TestNormalize(t *testing.T) {
56155
{Name: "foo", Value: fptr(1)},
57156
},
58157
norm: Pack{
59-
{Name: "foo", Value: fptr(2), Version: 5},
158+
{Name: "foo", Value: fptr(2)},
60159
},
61160
},
62161
{
@@ -65,12 +164,31 @@ func TestNormalize(t *testing.T) {
65164
{Name: "foo", Sum: fptr(1)},
66165
},
67166
norm: Pack{
68-
{Name: "foo", Sum: fptr(2), Version: 5},
167+
{Name: "foo", Sum: fptr(2)},
168+
},
169+
},
170+
{
171+
src: Pack{
172+
{BaseTime: 1},
173+
{Name: "foo", Time: 1, Value: fptr(1)},
174+
},
175+
norm: Pack{
176+
{Name: "foo", Time: 2, Value: fptr(1)},
177+
},
178+
},
179+
{
180+
src: Pack{
181+
{Name: "foo", Time: 2, Value: fptr(1)},
182+
{Name: "foo", Time: 1, Value: fptr(2)},
183+
},
184+
norm: Pack{
185+
{Name: "foo", Time: 1, Value: fptr(2)},
186+
{Name: "foo", Time: 2, Value: fptr(1)},
69187
},
70188
},
71189
}
72190
for _, tc := range tcs {
73-
norm := tc.norm.Normalize()
191+
norm := tc.src.Normalize()
74192
if !norm.Equals(tc.norm) {
75193
t.Errorf("Normalized version of %+v should be %+v not %+v", tc.src, tc.norm, norm)
76194
}
@@ -97,8 +215,18 @@ func TestJSON(t *testing.T) {
97215
if string(enc) != tc.json {
98216
t.Errorf("JSON encoding of %+v should be %s not %s", tc.src, tc.json, enc)
99217
}
218+
219+
dec := Pack{}
220+
err = json.Unmarshal([]byte(tc.json), &dec)
221+
if err != nil {
222+
t.Errorf("JSON decoding of %s returned an error : %s", tc.json, err)
223+
}
224+
if !tc.src.Equals(dec) {
225+
t.Errorf("JSON decoding of %s should be %+v not %+v", tc.json, tc.src, dec)
226+
}
100227
}
101228
}
229+
102230
func TestXML(t *testing.T) {
103231
tcs := []struct {
104232
src Pack
@@ -131,5 +259,14 @@ func TestXML(t *testing.T) {
131259
if string(enc) != tc.xml {
132260
t.Errorf("XML encoding of %+v should be %s not %s", tc.src, tc.xml, enc)
133261
}
262+
263+
dec := Pack{}
264+
err = xml.Unmarshal([]byte(tc.xml), &dec)
265+
if err != nil {
266+
t.Errorf("XML decoding of %s returned an error : %s", tc.xml, err)
267+
}
268+
if !tc.src.Equals(dec) {
269+
t.Errorf("XML decoding of %s should be %+v not %+v", tc.xml, tc.src, dec)
270+
}
134271
}
135272
}

0 commit comments

Comments
 (0)