protojson 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +1 -3
- data/README.md +24 -19
- data/Rakefile +10 -8
- data/examples/addressbook.pb.rb +70 -0
- data/examples/addressbook.proto +37 -0
- data/examples/addressbook2.pb.rb +56 -0
- data/examples/example.rb +54 -0
- data/examples/main.rb +50 -0
- data/{spec → examples}/person +0 -0
- data/examples/repeated.pb.rb +32 -0
- data/examples/repeated.proto +12 -0
- data/examples/simple.pb.rb +23 -0
- data/examples/simple.proto +7 -0
- data/lib/protojson.rb +81 -3
- data/lib/protojson/codec/binary.rb +21 -0
- data/lib/protojson/codec/codec_interface.rb +15 -0
- data/lib/protojson/codec/hash.rb +121 -0
- data/lib/protojson/codec/json.rb +24 -0
- data/lib/protojson/codec/json_indexed.rb +85 -0
- data/lib/protojson/codec/json_tag_map.rb +25 -0
- data/lib/protojson/version.rb +1 -1
- data/protojson.gemspec +17 -10
- data/spec/codec_binary_spec.rb +150 -0
- data/spec/codec_json_hash_tag_spec.rb +179 -0
- data/spec/codec_json_indexed_spec.rb +182 -0
- data/spec/codec_json_spec.rb +153 -0
- data/spec/codecs_registry_spec.rb +85 -0
- metadata +75 -18
- data/spec/main.rb +0 -55
@@ -0,0 +1,179 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
4
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'examples')
|
5
|
+
|
6
|
+
require 'protojson'
|
7
|
+
|
8
|
+
require 'simple.pb'
|
9
|
+
require 'repeated.pb'
|
10
|
+
require 'addressbook.pb'
|
11
|
+
|
12
|
+
describe Protojson::Codec::JsonTagMap do
|
13
|
+
before(:all) do
|
14
|
+
Protojson.set_default_codec(Protojson::Codec::JsonTagMap)
|
15
|
+
end
|
16
|
+
|
17
|
+
context "simple message" do
|
18
|
+
|
19
|
+
before(:each) do
|
20
|
+
@simple = Examples::Simple.new
|
21
|
+
@simple.foo = "Foo"
|
22
|
+
@simple.bar = 1000
|
23
|
+
@encoded = Protojson.encode(@simple)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should encode properly when two required attributes provided" do
|
27
|
+
@encoded.should eql('{"1":"Foo","2":1000}')
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should decode properly" do
|
31
|
+
decoded = Protojson.decode(Examples::Simple, @encoded)
|
32
|
+
decoded.foo.should eql(@simple.foo)
|
33
|
+
decoded.bar.should eql(@simple.bar)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
context "simple message (II)" do
|
39
|
+
|
40
|
+
before(:each) do
|
41
|
+
@simple = Examples::Simple.new
|
42
|
+
@simple.foo = "Foo"
|
43
|
+
@simple.bar = 1000
|
44
|
+
@simple.baz = "Bazz"
|
45
|
+
@encoded = Protojson.encode(@simple)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should encode properly when two required attributes and one optional attribute provided" do
|
49
|
+
@encoded.should eql('{"1":"Foo","2":1000,"3":"Bazz"}')
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should decode properly" do
|
53
|
+
decoded = Protojson.decode(Examples::Simple, @encoded)
|
54
|
+
decoded.foo.should eql(@simple.foo)
|
55
|
+
decoded.bar.should eql(@simple.bar)
|
56
|
+
decoded.baz.should eql(@simple.baz)
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
context "repeated message" do
|
62
|
+
|
63
|
+
it "should encode properly when the string field has more than one value" do
|
64
|
+
repeated = Examples::Repeated.new
|
65
|
+
repeated.string << "one"
|
66
|
+
repeated.string << "two"
|
67
|
+
repeated.string << "three"
|
68
|
+
Protojson.encode(repeated).should eql('{"1":["one","two","three"]}')
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should encode properly when the int field has more than one value" do
|
72
|
+
repeated = Examples::Repeated.new
|
73
|
+
repeated.int << 1
|
74
|
+
repeated.int << 2
|
75
|
+
repeated.int << 3
|
76
|
+
Protojson.encode(repeated).should eql('{"2":[1,2,3]}')
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should encode properly when both int and string fields has more than one value" do
|
80
|
+
repeated = Examples::Repeated.new
|
81
|
+
repeated.string << "one"
|
82
|
+
repeated.string << "two"
|
83
|
+
repeated.string << "three"
|
84
|
+
repeated.int << 1
|
85
|
+
repeated.int << 2
|
86
|
+
repeated.int << 3
|
87
|
+
Protojson.encode(repeated).should eql('{"1":["one","two","three"],"2":[1,2,3]}')
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should encode properly when the nested field has more than one value" do
|
91
|
+
repeated = Examples::Repeated.new
|
92
|
+
(1..3).each { |id|
|
93
|
+
nested = Examples::Repeated::Nested.new
|
94
|
+
nested.id = id
|
95
|
+
repeated.nested << nested
|
96
|
+
}
|
97
|
+
Protojson.encode(repeated).should eql('{"3":[{"1":1},{"1":2},{"1":3}]}')
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
context "complex message" do
|
103
|
+
it "should encode and decode the address_book example" do
|
104
|
+
book = Examples::AddressBook.new
|
105
|
+
person = Examples::Person.new
|
106
|
+
person.name = 'John Doe'
|
107
|
+
person.id = 2051
|
108
|
+
person.email = "john.doe@gmail.com"
|
109
|
+
phone = Examples::Person::PhoneNumber.new
|
110
|
+
phone.number = '1231231212'
|
111
|
+
phone.type = Examples::Person::PhoneType::HOME
|
112
|
+
person.phone << phone
|
113
|
+
phone = Examples::Person::PhoneNumber.new
|
114
|
+
phone.number = '55512321312'
|
115
|
+
phone.type = Examples::Person::PhoneType::MOBILE
|
116
|
+
person.phone << phone
|
117
|
+
book.person << person
|
118
|
+
|
119
|
+
person = Examples::Person.new
|
120
|
+
person.name = "Ivan Montes"
|
121
|
+
person.id = 23
|
122
|
+
person.email = "drslump@pollinimini.net"
|
123
|
+
phone = Examples::Person::PhoneNumber.new
|
124
|
+
phone.number = '3493123123'
|
125
|
+
phone.type = Examples::Person::PhoneType::WORK
|
126
|
+
person.phone << phone
|
127
|
+
book.person << person
|
128
|
+
|
129
|
+
person = Examples::Person.new
|
130
|
+
person.name = "Juan de Bravo"
|
131
|
+
person.id = 24
|
132
|
+
person.email = "juan@pollinimini.net"
|
133
|
+
phone = Examples::Person::PhoneNumber.new
|
134
|
+
phone.number = '3493123124'
|
135
|
+
phone.type = Examples::Person::PhoneType::WORK
|
136
|
+
person.phone << phone
|
137
|
+
book.person << person
|
138
|
+
|
139
|
+
expected =<<END
|
140
|
+
{
|
141
|
+
"1":[
|
142
|
+
{
|
143
|
+
"1":"John Doe",
|
144
|
+
"2":2051,
|
145
|
+
"3":"john.doe@gmail.com",
|
146
|
+
"4":[
|
147
|
+
{"1":"1231231212","2":1},
|
148
|
+
{"1":"55512321312","2":0}
|
149
|
+
]
|
150
|
+
},
|
151
|
+
{
|
152
|
+
"1":"Ivan Montes",
|
153
|
+
"2":23,
|
154
|
+
"3":"drslump@pollinimini.net",
|
155
|
+
"4":[{"1":"3493123123","2":2}]
|
156
|
+
},
|
157
|
+
{
|
158
|
+
"1":"Juan de Bravo",
|
159
|
+
"2":24,
|
160
|
+
"3":"juan@pollinimini.net",
|
161
|
+
"4":[{"1":"3493123124","2":2}]
|
162
|
+
}
|
163
|
+
]
|
164
|
+
}
|
165
|
+
END
|
166
|
+
|
167
|
+
encoded = Protojson.encode(book)
|
168
|
+
encoded.should eql(expected.gsub(/\n\s*/, ''))
|
169
|
+
decoded = Protojson.decode(Examples::AddressBook, encoded)
|
170
|
+
decoded.person.length.should eql 3
|
171
|
+
decoded.person[0].name.should eql "John Doe"
|
172
|
+
decoded.person[1].name.should eql "Ivan Montes"
|
173
|
+
decoded.person[2].name.should eql "Juan de Bravo"
|
174
|
+
decoded.person[0].phone[1].number.should eql "55512321312"
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
4
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'examples')
|
5
|
+
|
6
|
+
require 'protojson'
|
7
|
+
|
8
|
+
require 'simple.pb'
|
9
|
+
require 'repeated.pb'
|
10
|
+
require 'addressbook.pb'
|
11
|
+
|
12
|
+
describe Protojson::Codec::JsonTagMap do
|
13
|
+
before(:all) do
|
14
|
+
Protojson.set_default_codec(Protojson::Codec::JsonIndexed)
|
15
|
+
end
|
16
|
+
|
17
|
+
context "simple message" do
|
18
|
+
|
19
|
+
before(:each) do
|
20
|
+
@simple = Examples::Simple.new
|
21
|
+
@simple.foo = "Foo"
|
22
|
+
@simple.bar = 1000
|
23
|
+
@encoded = Protojson.encode(@simple)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should encode properly when two required attributes provided" do
|
27
|
+
@encoded.to_s.should eql('["12", "Foo", 1000]')
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should decode properly" do
|
31
|
+
decoded = Protojson.decode(Examples::Simple, @encoded)
|
32
|
+
decoded.foo.should eql(@simple.foo)
|
33
|
+
decoded.bar.should eql(@simple.bar)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
context "simple message (II)" do
|
39
|
+
|
40
|
+
before(:each) do
|
41
|
+
@simple = Examples::Simple.new
|
42
|
+
@simple.foo = "Foo"
|
43
|
+
@simple.bar = 1000
|
44
|
+
@simple.baz = "Bazz"
|
45
|
+
@encoded = Protojson.encode(@simple)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should encode properly when two required attributes and one optional attribute provided" do
|
49
|
+
@encoded.to_s.should eql('["123", "Foo", 1000, "Bazz"]')
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should decode properly" do
|
53
|
+
decoded = Protojson.decode(Examples::Simple, @encoded)
|
54
|
+
decoded.foo.should eql(@simple.foo)
|
55
|
+
decoded.bar.should eql(@simple.bar)
|
56
|
+
decoded.baz.should eql(@simple.baz)
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
context "repeated message" do
|
62
|
+
|
63
|
+
it "should encode properly when the string field has more than one value" do
|
64
|
+
repeated = Examples::Repeated.new
|
65
|
+
repeated.string << "one"
|
66
|
+
repeated.string << "two"
|
67
|
+
repeated.string << "three"
|
68
|
+
Protojson.encode(repeated).to_s.should eql('["1", ["one", "two", "three"]]')
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should encode properly when the int field has more than one value" do
|
72
|
+
repeated = Examples::Repeated.new
|
73
|
+
repeated.int << 1
|
74
|
+
repeated.int << 2
|
75
|
+
repeated.int << 3
|
76
|
+
Protojson.encode(repeated).to_s.should eql('["2", [1, 2, 3]]')
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should encode properly when both int and string fields has more than one value" do
|
80
|
+
repeated = Examples::Repeated.new
|
81
|
+
repeated.string << "one"
|
82
|
+
repeated.string << "two"
|
83
|
+
repeated.string << "three"
|
84
|
+
repeated.int << 1
|
85
|
+
repeated.int << 2
|
86
|
+
repeated.int << 3
|
87
|
+
Protojson.encode(repeated).to_s.should eql('["12", ["one", "two", "three"], [1, 2, 3]]')
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should encode properly when the nested field has more than one value" do
|
91
|
+
repeated = Examples::Repeated.new
|
92
|
+
(1..3).each { |id|
|
93
|
+
nested = Examples::Repeated::Nested.new
|
94
|
+
nested.id = id
|
95
|
+
repeated.nested << nested
|
96
|
+
}
|
97
|
+
Protojson.encode(repeated).to_s.should eql('["3", [["1", 1], ["1", 2], ["1", 3]]]')
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
context "complex message" do
|
103
|
+
|
104
|
+
it "should encode and decode the address_book example" do
|
105
|
+
book = Examples::AddressBook.new
|
106
|
+
person = Examples::Person.new
|
107
|
+
person.name = 'John Doe'
|
108
|
+
person.id = 2051
|
109
|
+
person.email = "john.doe@gmail.com"
|
110
|
+
phone = Examples::Person::PhoneNumber.new
|
111
|
+
phone.number = '1231231212'
|
112
|
+
phone.type = Examples::Person::PhoneType::HOME
|
113
|
+
person.phone << phone
|
114
|
+
phone = Examples::Person::PhoneNumber.new
|
115
|
+
phone.number = '55512321312'
|
116
|
+
phone.type = Examples::Person::PhoneType::MOBILE
|
117
|
+
person.phone << phone
|
118
|
+
book.person << person
|
119
|
+
|
120
|
+
person = Examples::Person.new
|
121
|
+
person.name = "Ivan Montes"
|
122
|
+
person.id = 23
|
123
|
+
person.email = "drslump@pollinimini.net"
|
124
|
+
phone = Examples::Person::PhoneNumber.new
|
125
|
+
phone.number = '3493123123'
|
126
|
+
phone.type = Examples::Person::PhoneType::WORK
|
127
|
+
person.phone << phone
|
128
|
+
book.person << person
|
129
|
+
|
130
|
+
person = Examples::Person.new
|
131
|
+
person.name = "Juan de Bravo"
|
132
|
+
person.id = 24
|
133
|
+
person.email = "juan@pollinimini.net"
|
134
|
+
phone = Examples::Person::PhoneNumber.new
|
135
|
+
phone.number = '3493123124'
|
136
|
+
phone.type = Examples::Person::PhoneType::WORK
|
137
|
+
person.phone << phone
|
138
|
+
book.person << person
|
139
|
+
|
140
|
+
expected =<<END
|
141
|
+
[
|
142
|
+
"1",[
|
143
|
+
[
|
144
|
+
"1234",
|
145
|
+
"John Doe",
|
146
|
+
2051,
|
147
|
+
"john.doe@gmail.com",
|
148
|
+
[
|
149
|
+
["12", "1231231212", 1],
|
150
|
+
["12", "55512321312", 0]
|
151
|
+
]
|
152
|
+
],
|
153
|
+
[
|
154
|
+
"1234",
|
155
|
+
Ivan Montes",
|
156
|
+
23,
|
157
|
+
"drslump@pollinimini.net",
|
158
|
+
[["12", "3493123123", 2]]
|
159
|
+
],
|
160
|
+
{
|
161
|
+
"1234",
|
162
|
+
Juan de Bravo",
|
163
|
+
24,
|
164
|
+
"juan@pollinimini.net",
|
165
|
+
["12", "3493123124", 2]]
|
166
|
+
]
|
167
|
+
]
|
168
|
+
]
|
169
|
+
END
|
170
|
+
|
171
|
+
encoded = Protojson.encode(book)
|
172
|
+
decoded = Protojson.decode(Examples::AddressBook, encoded)
|
173
|
+
decoded.person.length.should eql 3
|
174
|
+
decoded.person[0].name.should eql "John Doe"
|
175
|
+
decoded.person[1].name.should eql "Ivan Montes"
|
176
|
+
decoded.person[2].name.should eql "Juan de Bravo"
|
177
|
+
decoded.person[0].phone[1].number.should eql "55512321312"
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
4
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'examples')
|
5
|
+
|
6
|
+
require 'protojson'
|
7
|
+
|
8
|
+
require 'simple.pb'
|
9
|
+
require 'repeated.pb'
|
10
|
+
require 'addressbook.pb'
|
11
|
+
|
12
|
+
describe Protojson::Codec::Json do
|
13
|
+
before(:all) do
|
14
|
+
Protojson.set_default_codec(Protojson::Codec::Json)
|
15
|
+
end
|
16
|
+
|
17
|
+
context "simple message" do
|
18
|
+
|
19
|
+
it "should encode properly when two required attributes provided" do
|
20
|
+
simple = Examples::Simple.new
|
21
|
+
simple.foo = "Foo"
|
22
|
+
simple.bar = 1000
|
23
|
+
Protojson.encode(simple).should eql('{"foo":"Foo","bar":1000}')
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should encode properly when two required attributes and one optional attribute provided" do
|
27
|
+
simple = Examples::Simple.new
|
28
|
+
simple.foo = "Foo"
|
29
|
+
simple.bar = 1000
|
30
|
+
simple.baz = "Bazz"
|
31
|
+
Protojson.encode(simple).should eql('{"foo":"Foo","bar":1000,"baz":"Bazz"}')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "repeated message" do
|
36
|
+
|
37
|
+
it "should encode properly when the string field has more than one value" do
|
38
|
+
repeated = Examples::Repeated.new
|
39
|
+
repeated.string << "one"
|
40
|
+
repeated.string << "two"
|
41
|
+
repeated.string << "three"
|
42
|
+
Protojson.encode(repeated).should eql('{"string":["one","two","three"]}')
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should encode properly when the int field has more than one value" do
|
46
|
+
repeated = Examples::Repeated.new
|
47
|
+
repeated.int << 1
|
48
|
+
repeated.int << 2
|
49
|
+
repeated.int << 3
|
50
|
+
Protojson.encode(repeated).should eql('{"int":[1,2,3]}')
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should encode properly when both int and string fields has more than one value" do
|
54
|
+
repeated = Examples::Repeated.new
|
55
|
+
repeated.string << "one"
|
56
|
+
repeated.string << "two"
|
57
|
+
repeated.string << "three"
|
58
|
+
repeated.int << 1
|
59
|
+
repeated.int << 2
|
60
|
+
repeated.int << 3
|
61
|
+
Protojson.encode(repeated).should eql('{"string":["one","two","three"],"int":[1,2,3]}')
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should encode properly when the nested field has more than one value" do
|
65
|
+
repeated = Examples::Repeated.new
|
66
|
+
(1..3).each { |id|
|
67
|
+
nested = Examples::Repeated::Nested.new
|
68
|
+
nested.id = id
|
69
|
+
repeated.nested << nested
|
70
|
+
}
|
71
|
+
Protojson.encode(repeated).should eql('{"nested":[{"id":1},{"id":2},{"id":3}]}')
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
context "complex message" do
|
77
|
+
it "should work!! :)" do
|
78
|
+
book = Examples::AddressBook.new
|
79
|
+
person = Examples::Person.new
|
80
|
+
person.name = 'John Doe'
|
81
|
+
person.id = 2051
|
82
|
+
person.email = "john.doe@gmail.com"
|
83
|
+
phone = Examples::Person::PhoneNumber.new
|
84
|
+
phone.number = '1231231212'
|
85
|
+
phone.type = Examples::Person::PhoneType::HOME
|
86
|
+
person.phone << phone
|
87
|
+
phone = Examples::Person::PhoneNumber.new
|
88
|
+
phone.number = '55512321312'
|
89
|
+
phone.type = Examples::Person::PhoneType::MOBILE
|
90
|
+
person.phone << phone
|
91
|
+
book.person << person
|
92
|
+
|
93
|
+
person = Examples::Person.new
|
94
|
+
person.name = "Ivan Montes"
|
95
|
+
person.id = 23
|
96
|
+
person.email = "drslump@pollinimini.net"
|
97
|
+
phone = Examples::Person::PhoneNumber.new
|
98
|
+
phone.number = '3493123123'
|
99
|
+
phone.type = Examples::Person::PhoneType::WORK
|
100
|
+
person.phone << phone
|
101
|
+
book.person << person
|
102
|
+
|
103
|
+
person = Examples::Person.new
|
104
|
+
person.name = "Juan de Bravo"
|
105
|
+
person.id = 24
|
106
|
+
person.email = "juan@pollinimini.net"
|
107
|
+
phone = Examples::Person::PhoneNumber.new
|
108
|
+
phone.number = '3493123124'
|
109
|
+
phone.type = Examples::Person::PhoneType::WORK
|
110
|
+
person.phone << phone
|
111
|
+
book.person << person
|
112
|
+
|
113
|
+
expected =<<END
|
114
|
+
{
|
115
|
+
"person":[
|
116
|
+
{
|
117
|
+
"name":"John Doe",
|
118
|
+
"id":2051,
|
119
|
+
"email":"john.doe@gmail.com",
|
120
|
+
"phone":[
|
121
|
+
{"number":"1231231212","type":1},
|
122
|
+
{"number":"55512321312","type":0}
|
123
|
+
]
|
124
|
+
},
|
125
|
+
{
|
126
|
+
"name":"Ivan Montes",
|
127
|
+
"id":23,
|
128
|
+
"email":"drslump@pollinimini.net",
|
129
|
+
"phone":[{"number":"3493123123","type":2}]
|
130
|
+
},
|
131
|
+
{
|
132
|
+
"name":"Juan de Bravo",
|
133
|
+
"id":24,
|
134
|
+
"email":"juan@pollinimini.net",
|
135
|
+
"phone":[{"number":"3493123124","type":2}]
|
136
|
+
}
|
137
|
+
]
|
138
|
+
}
|
139
|
+
END
|
140
|
+
|
141
|
+
encoded = Protojson.encode(book)
|
142
|
+
encoded.should eql(expected.gsub(/\n\s*/, ''))
|
143
|
+
decoded = Protojson.decode(Examples::AddressBook, encoded)
|
144
|
+
decoded.person.length.should eql 3
|
145
|
+
decoded.person[0].name.should eql "John Doe"
|
146
|
+
decoded.person[1].name.should eql "Ivan Montes"
|
147
|
+
decoded.person[2].name.should eql "Juan de Bravo"
|
148
|
+
decoded.person[0].phone[1].number.should eql "55512321312"
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|