eim_xml 0.0.4 → 1.0.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.
- checksums.yaml +7 -0
- data/LICENSE +339 -0
- data/lib/eim_xml/assertions.rb +14 -14
- data/lib/eim_xml/dsl.rb +104 -96
- data/lib/eim_xml/formatter/element_wrapper.rb +8 -6
- data/lib/eim_xml/formatter.rb +105 -106
- data/lib/eim_xml/matcher.rb +23 -20
- data/lib/eim_xml/parser.rb +68 -70
- data/lib/eim_xml/xhtml/dsl.rb +16 -14
- data/lib/eim_xml/xhtml.rb +156 -152
- data/lib/eim_xml.rb +202 -202
- metadata +31 -61
- data/Rakefile +0 -26
- data/Rakefile.utirake +0 -374
- data/spec/assertions_test.rb +0 -30
- data/spec/dsl_spec.rb +0 -217
- data/spec/eim_xml_spec.rb +0 -441
- data/spec/formatter_spec.rb +0 -260
- data/spec/parser_spec.rb +0 -102
- data/spec/xhtml_spec.rb +0 -524
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 == "<>"'&"
|
10
|
-
PCString.encode("&test;").should == "&test;"
|
11
|
-
PCString.encode("&").should == "&amp;"
|
12
|
-
PCString.encode(:'sym&').should == "sym&"
|
13
|
-
end
|
14
|
-
|
15
|
-
it ".new" do
|
16
|
-
PCString.new("&").encoded_string.should == "&"
|
17
|
-
PCString.new("&", true).encoded_string.should == "&"
|
18
|
-
pcs = PCString.new(:'sym&')
|
19
|
-
pcs.encoded_string.should == "sym&"
|
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("&", true)
|
43
|
-
end
|
44
|
-
|
45
|
-
describe "#write_to" do
|
46
|
-
before do
|
47
|
-
@pc = PCString.new("&")
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should return encoded string" do
|
51
|
-
@pc.write_to.should == "&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=''"<>&'/
|
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='&\"'<>'>&"'<>&\"'<></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("&", 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("&", 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("&", 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("&", 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("<", 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
|
data/spec/formatter_spec.rb
DELETED
@@ -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 = "&<>\n'""
|
76
|
-
write(EimXML::Element.new(:e, :a=>"&<>\n'\"").add("&<>\n'\"")).should == "<e a='&<>\n'"'>\n &<>\n '"\n</e>\n"
|
77
|
-
write(EimXML::Element.new(:e, :a=>"&<>\n'\"").add(EimXML::PCString.new("&<>\n'\"", true))).should == "<e a='&<>\n'"'>\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
|