eim_xml 0.0.4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/spec/eim_xml_spec.rb DELETED
@@ -1,441 +0,0 @@
1
- require "eim_xml/dsl"
2
-
3
- module Module.new::M
4
- include EimXML
5
- EDSL = EimXML::DSL
6
-
7
- describe PCString do
8
- it ".encode" do
9
- PCString.encode("<>\"'&").should == "&lt;&gt;&quot;&apos;&amp;"
10
- PCString.encode("&test;").should == "&amp;test;"
11
- PCString.encode("&amp;").should == "&amp;amp;"
12
- PCString.encode(:'sym&').should == "sym&amp;"
13
- end
14
-
15
- it ".new" do
16
- PCString.new("&").encoded_string.should == "&amp;"
17
- PCString.new("&", true).encoded_string.should == "&"
18
- pcs = PCString.new(:'sym&')
19
- pcs.encoded_string.should == "sym&amp;"
20
- pcs.src.should == :'sym&'
21
- end
22
-
23
- describe ".[]" do
24
- it "should return itself when given object is a PCString" do
25
- pcs = PCString.new("s")
26
- PCString[pcs].should equal(pcs)
27
- end
28
-
29
- it "should return PCString.new(obj) if given obj is not a PCString" do
30
- o = "str"
31
- r = PCString[o]
32
- r.is_a?(EimXML::PCString)
33
- r.src.should == o
34
- end
35
- end
36
-
37
- it "#==" do
38
- PCString.new("str").should == PCString.new("str")
39
- PCString.new("&").should == "&"
40
- PCString.new("&", true).should_not == "&"
41
- PCString.new("&", true).should == PCString.new("&", true)
42
- PCString.new("&").should == PCString.new("&amp;", true)
43
- end
44
-
45
- describe "#write_to" do
46
- before do
47
- @pc = PCString.new("&amp;")
48
- end
49
-
50
- it "should return encoded string" do
51
- @pc.write_to.should == "&amp;amp;"
52
- end
53
-
54
- it "should return given destination" do
55
- s = ""
56
- @pc.write_to(s).should be_equal(s)
57
- end
58
- end
59
- end
60
-
61
- describe Comment do
62
- it ".new should raise error if given string include '--'" do
63
- lambda{Comment.new("--")}.should raise_error(ArgumentError)
64
- end
65
-
66
- describe "#write_to" do
67
- it "should return comment with markup" do
68
- Comment.new("flat comment").write_to.should == "<!-- flat comment -->"
69
- Comment.new("multi-line\ncomment").write_to.should == "<!-- multi-line\ncomment -->"
70
- Comment.new("&").write_to.should == "<!-- & -->"
71
- end
72
-
73
- it "should return given destination" do
74
- s = ""
75
- Comment.new("dummy").write_to(s).should be_equal(s)
76
- end
77
- end
78
- end
79
-
80
- describe Element do
81
- class Dummy < Element
82
- def chgname(name)
83
- self.name = name
84
- end
85
- end
86
-
87
- it "#name" do
88
- e = Element.new("el")
89
- e.name.should == :el
90
- lambda{e.name="changed"}.should raise_error(NoMethodError)
91
-
92
- d = Dummy.new("el1")
93
- d.name.should == :el1
94
- d.chgname(:el2)
95
- d.name.should == :el2
96
- d.chgname("el3")
97
- d.name.should == :el3
98
- end
99
-
100
- it "#attributes should return hash whose keys are Symbol" do
101
- e = Element.new("el", "a1"=>"v1", :a2=>"v2", "a3"=>nil)
102
- e.name.should == :el
103
- e.attributes.should == {:a1=>"v1", :a2=>"v2", :a3=>nil}
104
- end
105
-
106
- it "#[]" do
107
- e = Element.new(:el, :attr=>"value")
108
- e << "test"
109
- e[:attr].should == "value"
110
- e[0].should == "test"
111
- end
112
-
113
- it "#add_attribute" do
114
- e = Element.new("el")
115
- e.add_attribute("key_str", "value1")
116
- e.add_attribute(:key_sym, "value2")
117
- e.attributes.should == {:key_str=>"value1", :key_sym=>"value2"}
118
- e.add_attribute(:nil, nil)
119
- e.attributes.should == {:key_str=>"value1", :key_sym=>"value2", :nil=>nil}
120
- end
121
-
122
- it "#del_attribute" do
123
- e = Element.new("el", {:a1=>"v1", :a2=>"v2"})
124
- e.del_attribute("a1")
125
- e.attributes.should == {:a2=>"v2"}
126
- e.del_attribute(:a2)
127
- e.attributes.should == {}
128
- end
129
-
130
- it "#contents" do
131
- sub = Element.new("sub")
132
- e = Element.new("el") << "String1" << "String2" << sub
133
- e.contents.should == ["String1", "String2", sub]
134
- end
135
-
136
- it "#add" do
137
- e = Element.new("el").add(Element.new("sub"))
138
- e.should be_kind_of(Element)
139
- e.name.should == :el
140
-
141
- e = Element.new("el")
142
- e.add(Element.new("sub1"))
143
- e.add([Element.new("sub2").add("text"), "string"])
144
- e.contents.should == [Element.new("sub1"), Element.new("sub2").add("text"), "string"]
145
-
146
- e = Element.new("el")
147
- e.add(nil)
148
- e.contents.size.should == 0
149
-
150
- e = Element.new("el").add(:symbol)
151
- e.contents.should == [:symbol]
152
- e.to_s.should == "<el>symbol</el>"
153
-
154
- e = Element.new("super") << Element.new("sub")
155
- e.name.should == :super
156
- e.contents.should == [Element.new("sub")]
157
- end
158
-
159
- describe "#write_to" do
160
- it "should return flatten string" do
161
- Element.new("e").write_to.should == "<e />"
162
-
163
- e = Element.new("super")
164
- e << Element.new("sub")
165
- e.write_to.should == "<super><sub /></super>"
166
- e << Element.new("sub2")
167
- e.write_to.should == "<super><sub /><sub2 /></super>"
168
-
169
- e = Element.new("super") << "content1"
170
- s = Element.new("sub")
171
- s << "content2"
172
- e << s
173
- e.write_to.should == "<super>content1<sub>content2</sub></super>"
174
-
175
- e = Element.new("el")
176
- e.attributes["a1"] = "v1"
177
- e.attributes["a2"] = "'\"<>&"
178
- s = e.write_to
179
- s.should =~ /\A<el ([^>]*) \/>\z/
180
- s.should =~ /a1='v1'/
181
- s.should =~ /a2='&apos;&quot;&lt;&gt;&amp;'/
182
- end
183
-
184
- it "should return string without attribute whose value is nil or false" do
185
- s = EimXML::Element.new("e", :attr1=>"1", :attr2=>true, :attr3=>nil, :attr4=>false).write_to
186
- re = /\A<e attr(.*?)='(.*?)' attr(.*?)='(.*?)' \/>\z/
187
- s.should match(re)
188
- s =~ /\A<e attr(.*?)='(.*?)' attr(.*?)='(.*?)' \/>\z/
189
- [[$1, $2], [$3, $4]].sort.should == [["1", "1"], ["2", "true"]]
190
- end
191
-
192
- it "should return same string whenever name of element given with string or symbol" do
193
- sym = Element.new(:tag, :attr=>"value")
194
- str_name = Element.new("tag", :attr=>"value")
195
- str_attr = Element.new(:tag, "attr"=>"value")
196
-
197
- str_name.write_to.should == sym.write_to
198
- str_attr.write_to.should == sym.write_to
199
- end
200
- end
201
-
202
- it "encode special characters" do
203
- e = Element.new("el") << "&\"'<>"
204
- e << PCString.new("&\"'<>", true)
205
- e.attributes["key"] = PCString.new("&\"'<>", true)
206
- e.to_s.should == %[<el key='&\"'<>'>&amp;&quot;&apos;&lt;&gt;&\"'<></el>]
207
- end
208
-
209
- it "#dup" do
210
- e = Element.new("el")
211
- e.attributes["key"] = "value"
212
- e << "String"
213
- e << "Freeze".freeze
214
- s = Element.new("sub")
215
- s.attributes["subkey"] = "subvalue"
216
- e << s
217
- f = e.dup
218
-
219
- f.attributes.object_id.should == e.attributes.object_id
220
- f.contents.object_id.should == e.contents.object_id
221
-
222
- f.to_s.should == e.to_s
223
- end
224
-
225
- it "#clone" do
226
- e = Element.new("el")
227
- e.attributes["key"] = "value"
228
- e << "String"
229
- e << "Freeze".freeze
230
- s = Element.new("sub")
231
- s.attributes["subkey"] = "subvalue"
232
- e << s
233
- f = e.clone
234
-
235
- f.attributes.object_id.should == e.attributes.object_id
236
- f.contents.object_id.should == e.contents.object_id
237
-
238
- f.to_s.should == e.to_s
239
- end
240
-
241
- it "#==" do
242
- e1 = Element.new("el")
243
- e1.attributes["key"] = "value"
244
- s = Element.new("sub")
245
- s << "String"
246
- e1 << s
247
- e2 = e1.dup
248
- e2.should == e1
249
-
250
- e3 = Element.new("e")
251
- e3.attributes["key"] = "value"
252
- s = Element.new("sub")
253
- s << "String"
254
- e3 << s
255
- e3.should_not == e1
256
-
257
- e3 = Element.new("e")
258
- e3.attributes["k"] = "value"
259
- s = Element.new("sub")
260
- s << "String"
261
- e3 << s
262
- e3.should_not == e1
263
-
264
- e3 = Element.new("e")
265
- e3.attributes["key"] = "v"
266
- s = Element.new("sub")
267
- s << "String"
268
- e3 << s
269
- e3.should_not == e1
270
-
271
- e3 = Element.new("e")
272
- e3.attributes["key"] = "value"
273
- s = Element.new("sub")
274
- s << "S"
275
- e3 << s
276
- e3.should_not == e1
277
-
278
- e3 = Element.new("e")
279
- e3.attributes["key"] = "value"
280
- s = Element.new("s")
281
- s << "String"
282
- e3 << s
283
- e3.should_not == e1
284
-
285
- "string".should_not == e1
286
- end
287
-
288
- describe ".new" do
289
- it "should convert name of attributes to Symbol" do
290
- e = Element.new(:e, "a"=>"v")
291
- e.attributes.keys.should == [:a]
292
- e[:a].should == "v"
293
- end
294
-
295
- it "with block" do
296
- base = nil
297
- e = Element.new("base") do |b|
298
- b["attr"]="value"
299
- b << Element.new("sub")
300
- base = b
301
- end
302
- base.object_id.should == e.object_id
303
-
304
- e2 = Element.new("base", :attr=>"value")
305
- e2 << Element.new("sub")
306
- e2.should == e
307
-
308
- e = Element.new("base") do |e|
309
- e <<= Element.new("sub1") do |e|
310
- e <<= Element.new("sub12")
311
- end
312
- e <<= Element.new("sub2")
313
- end
314
- base = Element.new("base")
315
- sub1 = Element.new("sub1")
316
- sub1 << Element.new("sub12")
317
- sub2 = Element.new("sub2")
318
- base << sub1 << sub2
319
- e.should == base
320
- end
321
- end
322
-
323
- it "#match" do
324
- e = Element.new(:tag, :attr=>"value")
325
- e.match(:tag).should be_true
326
- e.match(:tag, :attr=>"value").should be_true
327
- e.match(:t).should be_false
328
- e.match(:tag, :attr2=>"value").should be_false
329
- e.match(:tag, :attr=>"value2").should be_false
330
- e.match(:tag, :attr=>/val/).should be_true
331
-
332
- e.match(Element.new(:tag)).should be_true
333
- e.match(Element.new(:tag, :attr=>"value")).should be_true
334
- e.match(Element.new(:tag, :attr=>/alu/)).should be_true
335
- e.match(Element.new(:t)).should be_false
336
- e.match(Element.new(:tag, :attr2=>"value")).should be_false
337
- e.match(Element.new(:tag, :attr=>"value2")).should be_false
338
- e.match(Element.new(:tag, :attr=>/aul/)).should be_false
339
- e.match(Element.new(:tag, :attr=>PCString.new("value"))).should be_true
340
- Element.new(:tag, :attr=>PCString.new("value")).should match(e)
341
-
342
- e.match(Element.new(:tag, :attr=>nil)).should be_false
343
- e.match(Element.new(:tag, :nonattr=>nil)).should be_true
344
-
345
- (!!e.match(/ag/)).should be_true
346
- (!!e.match(/elem/)).should be_false
347
-
348
- e.match(Element).should be_true
349
- e.match(Dummy).should be_false
350
- e.match(String).should be_false
351
-
352
- e = Element.new(:element)
353
- e << Element.new(:sub)
354
- e << "text"
355
- e.match(EDSL.element(:element){element(:sub)}).should be_true
356
- e.match(EDSL.element(:element){element(:other)}).should be_false
357
- e.match(EDSL.element(:element){add("text")}).should be_true
358
- e.match(EDSL.element(:element){add("other")}).should be_false
359
- e.match(EDSL.element(:element){add(/ex/)}).should be_true
360
- e.match(EDSL.element(:element){add(/th/)}).should be_false
361
- e.match(EDSL.element(:element){add(/sub/)}).should be_false
362
-
363
- e = Element.new(:t, :a=>"&")
364
- e.should match(Element.new(:t, :a=>"&"))
365
- e.should match(Element.new(:t, :a=>PCString.new("&amp;", true)))
366
- e.should match(Element.new(:t, :a=>PCString.new("&")))
367
-
368
- Element.new(:t, "a"=>"v").should match(Element.new(:t, :a=>"v"))
369
- end
370
-
371
- it "#=~" do
372
- e = Element.new(:tag, :attr=>"value", :a2=>"v2")
373
- e.should =~ :tag
374
- e.should =~ Element.new(:tag)
375
- e.should =~ Element.new(:tag, :a2=>"v2")
376
- e.should =~ Element.new(:tag, :attr=>/alu/)
377
- e.should =~ Element.new(:tag, :attr=>PCString.new("value"))
378
- e.should_not =~ :t
379
- e.should_not =~ Element.new(:t)
380
- e.should_not =~ Element.new(:tag, :attr=>/aul/)
381
-
382
- e = Element.new(:t, :a=>"&")
383
- e.should =~ Element.new(:t, :a=>"&")
384
- e.should =~ Element.new(:t, :a=>PCString.new("&amp;", true))
385
- e.should =~ Element.new(:t, :a=>PCString.new("&"))
386
- end
387
-
388
- %w[has? has_element? include?].each do |method|
389
- it "##{method}" do
390
- e = Element.new(:base) do |b|
391
- b <<= Element.new(:sub) do |s|
392
- s <<= Element.new(:deep) do |d|
393
- d << "text"
394
- d << PCString.new("&amp;", true)
395
- d << "<"
396
- end
397
- end
398
- b <<= Element.new(:sub, :attr=>"value")
399
- end
400
-
401
- e.send(method, :sub).should be_true
402
- e.send(method, :sub, :attr=>"value").should be_true
403
- e.send(method, :sub, :attr=>"value", :attr2=>"").should be_false
404
- e.send(method, :deep).should be_true
405
-
406
- e.send(method, String).should be_true
407
- e.send(method, PCString).should be_true
408
-
409
- d = Element.new(:deep)
410
- d << "text"
411
- d << PCString.new("&amp;", true)
412
- d << "<"
413
- e.send(method, d).should be_true
414
-
415
- d = Element.new(:deep)
416
- d << PCString.new("text", true)
417
- d << "&"
418
- d << PCString.new("&lt;", true)
419
- e.send(method, d).should be_true
420
- end
421
- end
422
-
423
- it "#find" do
424
- s1 = Element.new(:sub)
425
- d = Element.new(:deep)
426
- d << "3rd"
427
- s1 << "2nd" << d
428
- s2 = Element.new(:sub, :attr=>"value")
429
- e = Element.new(:base)
430
- e << "1st" << s1 << s2
431
-
432
- e.find(:deep).should be_kind_of(Element)
433
- e.find(:deep).name.should == :found
434
- e.find(:deep).contents.should == [d]
435
- e.find(:sub).contents.should == [s1, s2]
436
- e.find(//).contents.should == [e, s1, d, s2]
437
- e.find(:sub, :attr=>"value").contents.should == [s2]
438
- e.find(String).contents.should == ["1st", "2nd", "3rd"]
439
- end
440
- end
441
- end
@@ -1,260 +0,0 @@
1
- require "eim_xml/formatter"
2
- require "eim_xml/dsl"
3
-
4
- describe EimXML::Formatter do
5
- describe ".write" do
6
- it "should return output object" do
7
- s = ""
8
- EimXML::Formatter.write(EimXML::Element.new(:e), :out=>s).should be_equal(s)
9
- end
10
-
11
- it "should return string when destination not given" do
12
- r = EimXML::Formatter.write(EimXML::Element.new(:e))
13
- r.should be_kind_of(String)
14
- end
15
-
16
- describe "should return formatted elements string" do
17
- def write(*arg)
18
- EimXML::Formatter.write(*arg)
19
- end
20
-
21
- it "(element not have content)"do
22
- write(EimXML::DSL.element(:e)).should == "<e />\n"
23
- end
24
-
25
- it "(empty element which has attributes)" do
26
- r = (write(EimXML::DSL.element(:e, :a1=>"v1", :a2=>"v2")) =~ %r[<e (a.='v.') (a.='v.') />])
27
- r.should_not be_nil
28
- [$1, $2].sort.should == ["a1='v1'", "a2='v2'"]
29
- end
30
-
31
- it "(element in element)" do
32
- e = EimXML::DSL.element(:e) do
33
- element(:s)
34
- end
35
- write(e).should == <<EOT
36
- <e>
37
- <s />
38
- </e>
39
- EOT
40
- end
41
-
42
- it "(elements in element)" do
43
- e = EimXML::DSL.element(:e) do
44
- element(:s1)
45
- element(:s2)
46
- end
47
- write(e).should == <<EOT
48
- <e>
49
- <s1 />
50
- <s2 />
51
- </e>
52
- EOT
53
- end
54
-
55
- it "(comment in element)" do
56
- e = EimXML::DSL.element(:e) do
57
- comment("multi\nline\n pre-indented\n comment")
58
- end
59
- write(e).should == <<EOT
60
- <e>
61
- <!-- multi
62
- line
63
- pre-indented
64
- comment -->
65
- </e>
66
- EOT
67
- end
68
-
69
- it "(string in element)" do
70
- e = EimXML::Element.new(:e)
71
- e.add("string")
72
- write(e).should == "<e>\n string\n</e>\n"
73
-
74
- esc = "&<>'\""
75
- esc = "&amp;&lt;&gt;\n&apos;&quot;"
76
- write(EimXML::Element.new(:e, :a=>"&<>\n'\"").add("&<>\n'\"")).should == "<e a='&amp;&lt;&gt;\n&apos;&quot;'>\n &amp;&lt;&gt;\n &apos;&quot;\n</e>\n"
77
- write(EimXML::Element.new(:e, :a=>"&<>\n'\"").add(EimXML::PCString.new("&<>\n'\"", true))).should == "<e a='&amp;&lt;&gt;\n&apos;&quot;'>\n &<>\n '\"\n</e>\n"
78
- end
79
-
80
- it "(multi-line string in element)" do
81
- e = EimXML::Element.new(:e)
82
- e.add("multi\nline")
83
- write(e).should == <<EOT
84
- <e>
85
- multi
86
- line
87
- </e>
88
- EOT
89
- end
90
-
91
- describe "(preserve spaces" do
92
- it "name of element" do
93
- e = EimXML::DSL.element(:e) do
94
- element(:pre1) do
95
- element(:sub1).add("text")
96
- element(:sub2)
97
- end
98
- element(:pre2).add("multi\nline\ntext")
99
- element(:sub1).add("text")
100
- end
101
- s = <<EOT
102
- <e>
103
- <pre1><sub1>text</sub1><sub2 /></pre1>
104
- <pre2>multi
105
- line
106
- text</pre2>
107
- <sub1>
108
- text
109
- </sub1>
110
- </e>
111
- EOT
112
-
113
- write(e, :preservers=>[:pre1, :pre2]).should == s
114
- end
115
-
116
- it "class of element" do
117
- m = Module.new
118
- class m::Pre < EimXML::Element
119
- def initialize(n=nil)
120
- super(n||"pre")
121
- end
122
- end
123
- class m::P1 < m::Pre
124
- def initialize(n=nil)
125
- super(n||"p1")
126
- end
127
- end
128
- class m::P2 < m::P1
129
- def initialize
130
- super("p2")
131
- end
132
- end
133
-
134
- e = EimXML::Element.new(:e)
135
- e << m::Pre.new.add("text\nwith\nnewline")
136
- e << m::Pre.new("dummy").add("t\nn")
137
- e << m::P1.new.add("t1\nn")
138
- e << m::P2.new.add("t2\nn")
139
- e << m::Pre.new.add(EimXML::Element.new(:s).add("t\ns"))
140
- e << m::P2.new.add(EimXML::Element.new(:s).add("t\ns2"))
141
- e << EimXML::Element.new(:s).add(EimXML::Element.new(:s).add("t\ns"))
142
-
143
- s = <<EOT
144
- <e>
145
- <pre>text
146
- with
147
- newline</pre>
148
- <dummy>t
149
- n</dummy>
150
- <p1>t1
151
- n</p1>
152
- <p2>t2
153
- n</p2>
154
- <pre><s>t
155
- s</s></pre>
156
- <p2><s>t
157
- s2</s></p2>
158
- <s>
159
- <s>
160
- t
161
- s
162
- </s>
163
- </s>
164
- </e>
165
- EOT
166
- write(e, :preservers=>[m::Pre]).should == s
167
- end
168
- end
169
-
170
- it "(all)" do
171
- s = <<EOT
172
- <base>
173
- <sub1 />
174
- <sub2>
175
- text2
176
- </sub2>
177
- <sub3 a1='v1'>
178
- <sub31 />
179
- <sub32>
180
- text32
181
- </sub32>
182
- </sub3>
183
- <sub4>
184
- multi-line
185
- text
186
- </sub4>
187
- <sub5>
188
- <sub51 />
189
- sub52
190
- <sub53 />
191
- sub54-1
192
- sub54-2
193
- </sub5>
194
- </base>
195
- EOT
196
- e = EimXML::DSL.element(:base) do
197
- element(:sub1)
198
- element(:sub2).add("text2")
199
- element(:sub3, :a1=>"v1") do
200
- element(:sub31)
201
- element(:sub32).add("text32")
202
- end
203
- element(:sub4).add("multi-line\ntext")
204
- element(:sub5) do
205
- element(:sub51)
206
- add("sub52")
207
- element(:sub53)
208
- add("sub54-1\nsub54-2")
209
- end
210
- end
211
- write(e).should == s
212
- end
213
- end
214
- end
215
- end
216
-
217
- describe EimXML::Formatter::ElementWrapper do
218
- before do
219
- @out = ""
220
- @opt = {:out=>@out, :preservers=>[], :a=>10, :b=>20}
221
- @formatter = EimXML::Formatter.new(@opt)
222
- @m = Module.new
223
- class @m::Wrapper < EimXML::Formatter::ElementWrapper
224
- def initialize(mocks)
225
- @mocks = mocks
226
- end
227
-
228
- def contents(option)
229
- @mocks
230
- end
231
- end
232
- @mocks = [mock(:m1).as_null_object, mock(:m2).as_null_object]
233
- @wrapper = @m::Wrapper.new(@mocks)
234
- @xml = EimXML::Element.new(:e) do |e|
235
- e << @wrapper
236
- end
237
- end
238
-
239
- describe "#each" do
240
- it "will give options from formatter" do
241
- @wrapper.should_receive(:contents).with(:a=>10, :b=>20).and_return([])
242
- @formatter.write(@xml)
243
- end
244
-
245
- it "yield result of contents" do
246
- @mocks.each_with_index do |mock, index|
247
- mock.should_receive(:to_s).and_return("m#{index}")
248
- end
249
- @formatter.write(@xml)
250
- @out.should == "<e>\n m0\n m1\n</e>\n"
251
- end
252
-
253
- it "raise error when subclass of ElementWrapper is not implement #contents" do
254
- class @m::Wrapper2 < EimXML::Formatter::ElementWrapper; end
255
- @xml << @m::Wrapper2.new
256
-
257
- expect{@formatter.write(@xml)}.to raise_error(NoMethodError)
258
- end
259
- end
260
- end