eimxml 0.0.2 → 0.0.3.1
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/Rakefile +24 -95
- data/Rakefile.utirake +374 -0
- data/lib/eim_xml.rb +95 -220
- data/lib/eim_xml/dsl.rb +105 -0
- data/lib/eim_xml/formatter.rb +123 -0
- data/lib/eim_xml/formatter/element_wrapper.rb +7 -0
- data/lib/eim_xml/parser.rb +12 -40
- data/lib/eim_xml/xhtml.rb +84 -56
- data/lib/eim_xml/xhtml/dsl.rb +18 -0
- data/{test → spec}/assertions_test.rb +1 -0
- data/spec/dsl_spec.rb +217 -0
- data/spec/eim_xml_spec.rb +441 -0
- data/spec/formatter_spec.rb +260 -0
- data/spec/parser_spec.rb +102 -0
- data/spec/xhtml_spec.rb +524 -0
- metadata +52 -38
- data/README +0 -58
- data/test/eim_xml_test.rb +0 -648
- data/test/parser_test.rb +0 -102
- data/test/xhtml_test.rb +0 -340
@@ -0,0 +1,260 @@
|
|
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
|
data/spec/parser_spec.rb
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
require "eim_xml/parser"
|
2
|
+
|
3
|
+
module Module.new::M
|
4
|
+
include EimXML
|
5
|
+
|
6
|
+
describe Parser do
|
7
|
+
def parse(src)
|
8
|
+
Parser.new(src).parse
|
9
|
+
end
|
10
|
+
|
11
|
+
it "'parser' method for test" do
|
12
|
+
s = " <e /> "
|
13
|
+
parse(s).should == Parser.new(s).parse
|
14
|
+
end
|
15
|
+
|
16
|
+
it "#parse with empty element" do
|
17
|
+
parse("<e />").should == Element.new("e")
|
18
|
+
parse("<e/>").should == Element.new("e")
|
19
|
+
|
20
|
+
parse(%[<e key="value"/>]).should == Element.new("e", :key=>"value")
|
21
|
+
parse(%[<e key='value'/>]).should == Element.new("e", :key=>"value")
|
22
|
+
parse(%[<e key="value" />]).should == Element.new("e", :key=>"value")
|
23
|
+
parse(%[<e key='value' />]).should == Element.new("e", :key=>"value")
|
24
|
+
|
25
|
+
parse(%[<e key="value" key2="value2"/>]).should == Element.new("e", :key=>"value", :key2=>"value2")
|
26
|
+
parse(%[<e key="value" key2="value2" />]).should == Element.new("e", :key=>"value", :key2=>"value2")
|
27
|
+
|
28
|
+
s = " <e1 /> <e2 /> "
|
29
|
+
p = Parser.new(s)
|
30
|
+
p.parse.should == PCString.new(" ")
|
31
|
+
p.parse.should == Element.new("e1")
|
32
|
+
p.parse.should == PCString.new(" ")
|
33
|
+
p.parse.should == Element.new("e2")
|
34
|
+
end
|
35
|
+
|
36
|
+
it "#parse with nonempty element" do
|
37
|
+
parse("<super><sub /></super>").should == Element.new("super") << Element.new("sub")
|
38
|
+
|
39
|
+
parse("<out><in></in></out>").should == Element.new("out") << Element.new("in")
|
40
|
+
|
41
|
+
lambda{parse("<el></e>")}.should raise_error(ParseError, "End tag mismatched.")
|
42
|
+
lambda{parse("<el><></el>")}.should raise_error(ParseError, "Syntax error.")
|
43
|
+
end
|
44
|
+
|
45
|
+
it "#parse with string" do
|
46
|
+
e = parse("string&")
|
47
|
+
e.should be_kind_of(PCString)
|
48
|
+
e.to_s.should == "string&"
|
49
|
+
e = parse(" string & ")
|
50
|
+
e.should be_kind_of(PCString)
|
51
|
+
e.to_s.should == " string & "
|
52
|
+
|
53
|
+
e = Element.new("e")
|
54
|
+
e << PCString.new(" string ")
|
55
|
+
parse("<e> string </e>").should == e
|
56
|
+
|
57
|
+
e = Element.new("e")
|
58
|
+
e << PCString.new("string")
|
59
|
+
parse("<e>string</e>").should == e
|
60
|
+
end
|
61
|
+
|
62
|
+
it "#parse escaped characters" do
|
63
|
+
e = parse("&"'<>")
|
64
|
+
e.to_s.should == "&"'<>"
|
65
|
+
e.src.should == "&\"'<>"
|
66
|
+
end
|
67
|
+
|
68
|
+
it "#parse with holding space" do
|
69
|
+
s = "<e> string with space\n</e>"
|
70
|
+
e = Element.new("e")
|
71
|
+
e << PCString.new(" string with space\n")
|
72
|
+
parse(s).should == e
|
73
|
+
parse(s).to_s.should == s
|
74
|
+
|
75
|
+
s = "<ns:e> string with space\n</ns:e>"
|
76
|
+
e = Element.new("ns:e")
|
77
|
+
e << PCString.new(" string with space\n")
|
78
|
+
parse(s).should == e
|
79
|
+
parse(s).to_s.should == s
|
80
|
+
|
81
|
+
s = "<a> string without space <b> string with space <a> string with space 2 </a> </b> </a>"
|
82
|
+
oa = Element.new("a") << PCString.new(" string without space ")
|
83
|
+
b = Element.new("b")
|
84
|
+
b << PCString.new(" string with space ")
|
85
|
+
ia = Element.new("a")
|
86
|
+
ia << PCString.new(" string with space 2 ")
|
87
|
+
b << ia
|
88
|
+
b << PCString.new(" ")
|
89
|
+
oa << b
|
90
|
+
oa << PCString.new(" ")
|
91
|
+
parse(s).should == oa
|
92
|
+
parse(s).to_s.should == s
|
93
|
+
|
94
|
+
s = "<a><b/></a>"
|
95
|
+
a = Element.new("a")
|
96
|
+
b = Element.new("b")
|
97
|
+
a << b
|
98
|
+
parse(s).should == a
|
99
|
+
parse(s).to_s.should == "<a><b /></a>"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
data/spec/xhtml_spec.rb
ADDED
@@ -0,0 +1,524 @@
|
|
1
|
+
require "stringio"
|
2
|
+
require "eim_xml/xhtml/dsl"
|
3
|
+
|
4
|
+
module Module.new::M
|
5
|
+
include EimXML
|
6
|
+
include EimXML::XHTML
|
7
|
+
XDSL = XHTML::DSL
|
8
|
+
|
9
|
+
describe XHTML do
|
10
|
+
it "DSL.base_ should raise NoMethodError" do
|
11
|
+
lambda{XDSL.base_}.should raise_error(NoMethodError)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "HTML" do
|
15
|
+
h = HTML.new(:attr=>"value")
|
16
|
+
h.should == Element.new(:html, :attr=>"value")
|
17
|
+
|
18
|
+
h = HTML.new do |e|
|
19
|
+
e <<= Element.new(:sub)
|
20
|
+
end
|
21
|
+
h2 = HTML.new
|
22
|
+
h2 << Element.new(:sub)
|
23
|
+
h2.should == h
|
24
|
+
|
25
|
+
lambda{EimXML::DSL.html}.should raise_error(NoMethodError)
|
26
|
+
XDSL.html(:key=>"v").should == HTML.new(:key=>"v")
|
27
|
+
OpenDSL.html(:key=>"v").should == HTML.new(:key=>"v")
|
28
|
+
|
29
|
+
h = HTML.new
|
30
|
+
h.write_to.should == "<html />"
|
31
|
+
h.prefix='<?xml version="1.0"?>'
|
32
|
+
h.write_to.should == %[<?xml version="1.0"?>\n<html />]
|
33
|
+
end
|
34
|
+
|
35
|
+
it "HEAD" do
|
36
|
+
HEAD.new.name.should == :head
|
37
|
+
XDSL.head.should be_kind_of(HEAD)
|
38
|
+
OpenDSL.head.should be_kind_of(HEAD)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "META" do
|
42
|
+
META.new.name.should == :meta
|
43
|
+
XDSL.meta.should be_kind_of(META)
|
44
|
+
OpenDSL.meta.should be_kind_of(META)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "LINK" do
|
48
|
+
LINK.new.name.should == :link
|
49
|
+
XDSL.link.should be_kind_of(LINK)
|
50
|
+
OpenDSL.link.should be_kind_of(LINK)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "STYLE" do
|
54
|
+
STYLE.new.name.should == :style
|
55
|
+
XDSL.style.should be_kind_of(STYLE)
|
56
|
+
OpenDSL.style.should be_kind_of(STYLE)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "IMG" do
|
60
|
+
IMG.new.name.should == :img
|
61
|
+
XDSL.img.should be_kind_of(IMG)
|
62
|
+
OpenDSL.img.should be_kind_of(IMG)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "SCRIPT" do
|
66
|
+
SCRIPT.new.name.should == :script
|
67
|
+
XDSL.script.should be_kind_of(SCRIPT)
|
68
|
+
OpenDSL.script.should be_kind_of(SCRIPT)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "TITLE" do
|
72
|
+
TITLE.new.name.should == :title
|
73
|
+
XDSL.title.should be_kind_of(TITLE)
|
74
|
+
OpenDSL.title.should be_kind_of(TITLE)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "BODY" do
|
78
|
+
BODY.new.name.should == :body
|
79
|
+
XDSL.body.should be_kind_of(BODY)
|
80
|
+
OpenDSL.body.should be_kind_of(BODY)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "PRE" do
|
84
|
+
PRE.new.name.should == :pre
|
85
|
+
XDSL.pre.should be_kind_of(PRE)
|
86
|
+
OpenDSL.pre.should be_kind_of(PRE)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "Hn" do
|
90
|
+
h1 = Hn.new(1)
|
91
|
+
h6 = Hn.new(6)
|
92
|
+
h1.name.should == :h1
|
93
|
+
h1.should be_kind_of(H1)
|
94
|
+
h6.name.should == :h6
|
95
|
+
h6.should be_kind_of(H6)
|
96
|
+
lambda{Hn.new(7)}.should raise_error(ArgumentError)
|
97
|
+
lambda{Hn.new(0)}.should raise_error(ArgumentError)
|
98
|
+
|
99
|
+
h = Hn.new(1, :key=>:value) do |hn|
|
100
|
+
hn << "test"
|
101
|
+
end
|
102
|
+
h[:key].should == :value
|
103
|
+
h[0].should == "test"
|
104
|
+
|
105
|
+
[
|
106
|
+
[H1, XDSL.h1, OpenDSL.h1],
|
107
|
+
[H2, XDSL.h2, OpenDSL.h2],
|
108
|
+
[H3, XDSL.h3, OpenDSL.h3],
|
109
|
+
[H4, XDSL.h4, OpenDSL.h4],
|
110
|
+
[H5, XDSL.h5, OpenDSL.h5],
|
111
|
+
[H6, XDSL.h6, OpenDSL.h6]
|
112
|
+
].each do |klass, dsl, od|
|
113
|
+
dsl.should be_kind_of(klass)
|
114
|
+
od.should be_kind_of(klass)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
it "P" do
|
119
|
+
P.new.name.should == :p
|
120
|
+
XDSL.p.should be_kind_of(P)
|
121
|
+
OpenDSL.p.should be_kind_of(P)
|
122
|
+
end
|
123
|
+
|
124
|
+
it "A" do
|
125
|
+
A.new.name.should == :a
|
126
|
+
XDSL.a.should be_kind_of(A)
|
127
|
+
OpenDSL.a.should be_kind_of(A)
|
128
|
+
end
|
129
|
+
|
130
|
+
it "EM" do
|
131
|
+
EM.new.name.should == :em
|
132
|
+
XDSL.em.should be_kind_of(EM)
|
133
|
+
OpenDSL.em.should be_kind_of(EM)
|
134
|
+
end
|
135
|
+
|
136
|
+
it "STRONG" do
|
137
|
+
STRONG.new.name.should == :strong
|
138
|
+
XDSL.strong.should be_kind_of(STRONG)
|
139
|
+
OpenDSL.strong.should be_kind_of(STRONG)
|
140
|
+
end
|
141
|
+
|
142
|
+
it "DIV" do
|
143
|
+
DIV.new.name.should == :div
|
144
|
+
XDSL.div.should be_kind_of(DIV)
|
145
|
+
OpenDSL.div.should be_kind_of(DIV)
|
146
|
+
end
|
147
|
+
|
148
|
+
it "SPAN" do
|
149
|
+
SPAN.new.name.should == :span
|
150
|
+
XDSL.span.should be_kind_of(SPAN)
|
151
|
+
OpenDSL.span.should be_kind_of(SPAN)
|
152
|
+
end
|
153
|
+
|
154
|
+
it "UL" do
|
155
|
+
UL.new.name.should == :ul
|
156
|
+
XDSL.ul.should be_kind_of(UL)
|
157
|
+
OpenDSL.ul.should be_kind_of(UL)
|
158
|
+
end
|
159
|
+
|
160
|
+
it "OL" do
|
161
|
+
OL.new.name.should == :ol
|
162
|
+
XDSL.ol.should be_kind_of(OL)
|
163
|
+
OpenDSL.ol.should be_kind_of(OL)
|
164
|
+
end
|
165
|
+
|
166
|
+
it "LI" do
|
167
|
+
LI.new.name.should == :li
|
168
|
+
XDSL.li.should be_kind_of(LI)
|
169
|
+
OpenDSL.li.should be_kind_of(LI)
|
170
|
+
end
|
171
|
+
|
172
|
+
it "DL" do
|
173
|
+
DL.new.name.should == :dl
|
174
|
+
XDSL.dl.should be_kind_of(DL)
|
175
|
+
OpenDSL.dl.should be_kind_of(DL)
|
176
|
+
end
|
177
|
+
|
178
|
+
it "DT" do
|
179
|
+
DT.new.name.should == :dt
|
180
|
+
XDSL.dt.should be_kind_of(DT)
|
181
|
+
OpenDSL.dt.should be_kind_of(DT)
|
182
|
+
end
|
183
|
+
|
184
|
+
it "DD" do
|
185
|
+
DD.new.name.should == :dd
|
186
|
+
XDSL.dd.should be_kind_of(DD)
|
187
|
+
OpenDSL.dd.should be_kind_of(DD)
|
188
|
+
end
|
189
|
+
|
190
|
+
it "TABLE" do
|
191
|
+
TABLE.new.name.should == :table
|
192
|
+
XDSL.table.should be_kind_of(TABLE)
|
193
|
+
OpenDSL.table.should be_kind_of(TABLE)
|
194
|
+
end
|
195
|
+
|
196
|
+
it "CAPTION" do
|
197
|
+
CAPTION.new.name.should == :caption
|
198
|
+
XDSL.caption.should be_kind_of(CAPTION)
|
199
|
+
OpenDSL.caption.should be_kind_of(CAPTION)
|
200
|
+
end
|
201
|
+
|
202
|
+
it "TR" do
|
203
|
+
TR.new.name.should == :tr
|
204
|
+
XDSL.tr.should be_kind_of(TR)
|
205
|
+
OpenDSL.tr.should be_kind_of(TR)
|
206
|
+
end
|
207
|
+
|
208
|
+
it "TH" do
|
209
|
+
TH.new.name.should == :th
|
210
|
+
XDSL.th.should be_kind_of(TH)
|
211
|
+
OpenDSL.th.should be_kind_of(TH)
|
212
|
+
end
|
213
|
+
|
214
|
+
it "TD" do
|
215
|
+
TD.new.name.should == :td
|
216
|
+
XDSL.td.should be_kind_of(TD)
|
217
|
+
OpenDSL.td.should be_kind_of(TD)
|
218
|
+
end
|
219
|
+
|
220
|
+
it "FORM" do
|
221
|
+
FORM.new.name.should == :form
|
222
|
+
XDSL.form.should be_kind_of(FORM)
|
223
|
+
OpenDSL.form.should be_kind_of(FORM)
|
224
|
+
|
225
|
+
FORM.new.should_not include(HIDDEN)
|
226
|
+
end
|
227
|
+
|
228
|
+
it "FORM.new should be able to receive CGI::Session object and set random token" do
|
229
|
+
s = mock("session")
|
230
|
+
h = {}
|
231
|
+
s.should_receive(:[]).any_number_of_times{|k| h[k]}
|
232
|
+
s.should_receive(:[]=).any_number_of_times{|k, v| h[k]=v}
|
233
|
+
f = FORM.new(:session=>s)
|
234
|
+
h["token"].size.should == 40
|
235
|
+
h["token"].should =~ /\A[0-9a-f]{40}\z/
|
236
|
+
f.should include(HIDDEN.new(:name=>"token", :value=>h["token"]))
|
237
|
+
|
238
|
+
s = mock("session")
|
239
|
+
h = {}
|
240
|
+
s.should_receive(:[]).any_number_of_times{|k| h[k]}
|
241
|
+
s.should_receive(:[]=).any_number_of_times{|k, v| h[k]=v}
|
242
|
+
f = FORM.new(:session=>s, :session_name=>"random_key")
|
243
|
+
h["token"].should be_nil
|
244
|
+
h["random_key"].size.should == 40
|
245
|
+
h["random_key"].should =~ /\A[0-9a-f]{40}\z/
|
246
|
+
f.should include(HIDDEN.new(:name=>"random_key", :value=>h["random_key"]))
|
247
|
+
|
248
|
+
s = mock("session")
|
249
|
+
h = {}
|
250
|
+
s.should_receive(:[]).any_number_of_times{|k| h[k]}
|
251
|
+
s.should_receive(:[]=).any_number_of_times{|k, v| h[k]=v}
|
252
|
+
FORM.new(:session=>s)
|
253
|
+
token = s["token"]
|
254
|
+
FORM.new(:session=>s).should include(HIDDEN.new(:name=>"token", :value=>token))
|
255
|
+
s["token"].should == token
|
256
|
+
end
|
257
|
+
|
258
|
+
it "TEXTAREA" do
|
259
|
+
TEXTAREA.new(:name=>"item").should == Element.new(:textarea, :name=>"item")
|
260
|
+
TEXTAREA.new(:name=>:item).should == Element.new(:textarea, :name=>:item)
|
261
|
+
TEXTAREA.new(:name=>"item", :class=>"cv").should == Element.new(:textarea, :name=>"item", :class=>"cv")
|
262
|
+
|
263
|
+
t = XDSL.textarea(:name=>"t")
|
264
|
+
t.should be_kind_of(TEXTAREA)
|
265
|
+
t[:name].should == "t"
|
266
|
+
|
267
|
+
t = OpenDSL.textarea(:name=>"t")
|
268
|
+
t.should be_kind_of(TEXTAREA)
|
269
|
+
t[:name].should == "t"
|
270
|
+
end
|
271
|
+
|
272
|
+
it "BUTTON" do
|
273
|
+
BUTTON.new.should == Element.new(:button)
|
274
|
+
end
|
275
|
+
|
276
|
+
it "INPUT" do
|
277
|
+
INPUT.new(:type=>:test, :name=>:item, :value=>"v").should == Element.new(:input, :type=>:test, :name=>:item, :value=>"v")
|
278
|
+
INPUT.new(:type=>"test", :name=>"item", :value=>"v").should == Element.new(:input, :type=>"test", :name=>"item", :value=>"v")
|
279
|
+
INPUT.new(:type=>:test, :name=>:item, :value=>"v", :class=>"c").should == Element.new(:input, :type=>:test, :name=>:item, :value=>"v", :class=>"c")
|
280
|
+
|
281
|
+
INPUT.new(:type=>:submit, :value=>"v").should == Element.new(:input, :type=>:submit, :value=>"v")
|
282
|
+
INPUT.new(:type=>:submit, :name=>"item").should == Element.new(:input, :type=>:submit, :name=>"item")
|
283
|
+
|
284
|
+
i = XDSL.input(:type=>:dummy, :name=>:n, :value=>:v)
|
285
|
+
i.should be_kind_of(INPUT)
|
286
|
+
i.should =~ INPUT.new(:type=>:dummy, :name=>:n, :value=>:v)
|
287
|
+
|
288
|
+
i = OpenDSL.input(:type=>:dummy, :name=>:n, :value=>:v)
|
289
|
+
i.should be_kind_of(INPUT)
|
290
|
+
i.should == INPUT.new(:type=>:dummy, :name=>:n, :value=>:v)
|
291
|
+
end
|
292
|
+
|
293
|
+
it "HIDDEN" do
|
294
|
+
HIDDEN.new(:name=>"item", :value=>"v").should == Element.new(:input, :type=>:hidden, :name=>"item", :value=>"v")
|
295
|
+
HIDDEN.new(:name=>:item, :value=>"v").should == Element.new(:input, :type=>:hidden, :name=>:item, :value=>"v")
|
296
|
+
HIDDEN.new(:name=>:item, :value=>"v", :class=>"c").should == Element.new(:input, :type=>:hidden, :name=>:item, :value=>"v", :class=>"c")
|
297
|
+
|
298
|
+
h = XDSL.hidden(:name=>:n, :value=>:v)
|
299
|
+
h.should be_kind_of(HIDDEN)
|
300
|
+
h.should =~ HIDDEN.new(:name=>:n, :value=>:v)
|
301
|
+
|
302
|
+
h = OpenDSL.hidden(:name=>:n, :value=>:v)
|
303
|
+
h.should be_kind_of(HIDDEN)
|
304
|
+
h.should == HIDDEN.new(:name=>:n, :value=>:v)
|
305
|
+
end
|
306
|
+
|
307
|
+
it "SUBMIT" do
|
308
|
+
SUBMIT.new.should == Element.new(:button, :type=>:submit)
|
309
|
+
SUBMIT.new(:value=>"OK").should == Element.new(:button, :type=>:submit, :value=>"OK")
|
310
|
+
SUBMIT.new(:value=>"OK", :class=>"c").should == Element.new(:button, :type=>:submit, :value=>"OK", :class=>"c")
|
311
|
+
opt = {:value=>"v", :name=>"n"}
|
312
|
+
opt2 = opt.dup
|
313
|
+
SUBMIT.new(opt2)
|
314
|
+
opt2.should == opt
|
315
|
+
|
316
|
+
s = XDSL.submit
|
317
|
+
s.should be_kind_of(SUBMIT)
|
318
|
+
s.should =~ SUBMIT.new
|
319
|
+
(!s[:name]).should be_true
|
320
|
+
(!s[:value]).should be_true
|
321
|
+
s = XDSL.submit(:name=>:s, :value=>:v)
|
322
|
+
s[:name].should == :s
|
323
|
+
s[:value].should == :v
|
324
|
+
|
325
|
+
s = OpenDSL.submit
|
326
|
+
s.should be_kind_of(SUBMIT)
|
327
|
+
s.should == SUBMIT.new
|
328
|
+
s[:name].should be_nil
|
329
|
+
s[:value].should be_nil
|
330
|
+
s = OpenDSL.submit(:name=>:s, :value=>:v)
|
331
|
+
s.should == SUBMIT.new(:name=>:s, :value=>:v)
|
332
|
+
end
|
333
|
+
|
334
|
+
it "TEXT" do
|
335
|
+
TEXT.new(:name=>:item).should == Element.new(:input, :type=>:text, :name=>:item)
|
336
|
+
TEXT.new(:name=>"item").should == Element.new(:input, :type=>:text, :name=>"item")
|
337
|
+
TEXT.new(:name=>:item, :value=>"txt").should == Element.new(:input, :type=>:text, :name=>:item, :value=>"txt")
|
338
|
+
TEXT.new(:name=>:item, :value=>"txt", :class=>"c").should == Element.new(:input, :type=>:text, :name=>:item, :value=>"txt", :class=>"c")
|
339
|
+
|
340
|
+
t = XDSL.text(:name=>:n, :value=>:v)
|
341
|
+
t.should be_kind_of(TEXT)
|
342
|
+
t.should =~ TEXT.new(:name=>:n, :value=>:v)
|
343
|
+
|
344
|
+
t = OpenDSL.text(:name=>:n, :value=>:v)
|
345
|
+
t.should be_kind_of(TEXT)
|
346
|
+
t.should == TEXT.new(:name=>:n, :value=>:v)
|
347
|
+
end
|
348
|
+
|
349
|
+
it "PASSWORD" do
|
350
|
+
PASSWORD.new(:name=>:item).should == Element.new(:input, :type=>:password, :name=>:item)
|
351
|
+
PASSWORD.new(:name=>"item").should == Element.new(:input, :type=>:password, :name=>"item")
|
352
|
+
PASSWORD.new(:name=>:item, :value=>"txt").should == Element.new(:input, :type=>:password, :name=>:item, :value=>"txt")
|
353
|
+
PASSWORD.new(:name=>:item, :value=>"txt", :class=>"c").should == Element.new(:input, :type=>:password, :name=>:item, :value=>"txt", :class=>"c")
|
354
|
+
|
355
|
+
t = XDSL.password(:name=>:n, :value=>:v)
|
356
|
+
t.should be_kind_of(PASSWORD)
|
357
|
+
t.should =~ PASSWORD.new(:name=>:n, :value=>:v)
|
358
|
+
|
359
|
+
t = OpenDSL.password(:name=>:n, :value=>:v)
|
360
|
+
t.should be_kind_of(PASSWORD)
|
361
|
+
t.should == PASSWORD.new(:name=>:n, :value=>:v)
|
362
|
+
end
|
363
|
+
|
364
|
+
it "FILE" do
|
365
|
+
FILE.new(:name=>:foo).should == Element.new(:input, :type=>:file, :name=>:foo)
|
366
|
+
XDSL.file(:name=>:foo).should =~ FILE.new(:name=>:foo)
|
367
|
+
|
368
|
+
OpenDSL.file(:name=>:foo).should == FILE.new(:name=>:foo)
|
369
|
+
end
|
370
|
+
|
371
|
+
it "SELECT" do
|
372
|
+
SELECT.new(:name=>:foo).should == Element.new(:select, :name=>:foo)
|
373
|
+
XDSL.select(:name=>:foo).should == SELECT.new(:name=>:foo)
|
374
|
+
|
375
|
+
OpenDSL.select(:name=>:foo).should == SELECT.new(:name=>:foo)
|
376
|
+
end
|
377
|
+
|
378
|
+
it "OPTION" do
|
379
|
+
OPTION.new(:value=>:bar, :selected=>true){|e| e << "TEXT"}.should == Element.new(:option, :value=>:bar, :selected=>true){|e| e.add("TEXT")}
|
380
|
+
XDSL.option(:value=>:bar).should == OPTION.new(:value=>:bar)
|
381
|
+
|
382
|
+
OpenDSL.option(:value=>:bar).should == OPTION.new(:value=>:bar)
|
383
|
+
end
|
384
|
+
|
385
|
+
it "BR" do
|
386
|
+
BR.new.name.should == :br
|
387
|
+
XDSL.br.should be_kind_of(BR)
|
388
|
+
OpenDSL.br.should be_kind_of(BR)
|
389
|
+
end
|
390
|
+
|
391
|
+
it "HR" do
|
392
|
+
HR.new.name.should == :hr
|
393
|
+
XDSL.hr.should be_kind_of(HR)
|
394
|
+
OpenDSL.hr.should be_kind_of(HR)
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
describe EimXML::XHTML::OpenDSL do
|
399
|
+
it "replace EimXML::XHTML::DSL" do
|
400
|
+
e = EimXML::XHTML::OpenDSL.html do |d|
|
401
|
+
d.head do
|
402
|
+
d.title.add "Title"
|
403
|
+
end
|
404
|
+
d.body do
|
405
|
+
d.h1.add "Sample"
|
406
|
+
d.p do
|
407
|
+
d.add "text"
|
408
|
+
d.add "next"
|
409
|
+
end
|
410
|
+
end
|
411
|
+
end
|
412
|
+
e.should == EimXML::XHTML::DSL.html do
|
413
|
+
head do
|
414
|
+
title.add "Title"
|
415
|
+
end
|
416
|
+
body do
|
417
|
+
h1.add "Sample"
|
418
|
+
p do
|
419
|
+
add "text"
|
420
|
+
add "next"
|
421
|
+
end
|
422
|
+
end
|
423
|
+
end
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
427
|
+
describe EimXML::XHTML::Formatter do
|
428
|
+
describe "#write" do
|
429
|
+
it "should set :preservers=>PRESERVE_SPACES to default option" do
|
430
|
+
e = EimXML::XHTML::HTML.new
|
431
|
+
EimXML::Formatter.should_receive(:write).with(e, :preservers=>EimXML::XHTML::PRESERVE_SPACES, :opt=>:dummy)
|
432
|
+
EimXML::XHTML::Formatter.write(e, :opt=>:dummy)
|
433
|
+
end
|
434
|
+
|
435
|
+
it "should return string" do
|
436
|
+
h = EimXML::XHTML::DSL.html do
|
437
|
+
head do
|
438
|
+
style.add("style\ntext")
|
439
|
+
script.add("script\ntext")
|
440
|
+
end
|
441
|
+
body do
|
442
|
+
div.add("text\nin\ndiv")
|
443
|
+
pre.add("pre\nt")
|
444
|
+
h1.add("1\nt")
|
445
|
+
h2.add("2\nt")
|
446
|
+
h3.add("3\nt")
|
447
|
+
h4.add("4\nt")
|
448
|
+
h5.add("5\nt")
|
449
|
+
h6.add("6\nt")
|
450
|
+
p.add("p\nt")
|
451
|
+
a.add("a\nt")
|
452
|
+
em.add("e\nt")
|
453
|
+
strong.add("s\nt")
|
454
|
+
span.add("sp\nt")
|
455
|
+
li.add("li\nt")
|
456
|
+
dt.add("dt\nt")
|
457
|
+
dd.add("dd\nt")
|
458
|
+
caption.add("c\nt")
|
459
|
+
th.add("th\nt")
|
460
|
+
td.add("td\nt")
|
461
|
+
button.add("button\nt")
|
462
|
+
end
|
463
|
+
end
|
464
|
+
|
465
|
+
s = <<EOT
|
466
|
+
<html>
|
467
|
+
<head>
|
468
|
+
<style>style
|
469
|
+
text</style>
|
470
|
+
<script>script
|
471
|
+
text</script>
|
472
|
+
</head>
|
473
|
+
<body>
|
474
|
+
<div>
|
475
|
+
text
|
476
|
+
in
|
477
|
+
div
|
478
|
+
</div>
|
479
|
+
<pre>pre
|
480
|
+
t</pre>
|
481
|
+
<h1>1
|
482
|
+
t</h1>
|
483
|
+
<h2>2
|
484
|
+
t</h2>
|
485
|
+
<h3>3
|
486
|
+
t</h3>
|
487
|
+
<h4>4
|
488
|
+
t</h4>
|
489
|
+
<h5>5
|
490
|
+
t</h5>
|
491
|
+
<h6>6
|
492
|
+
t</h6>
|
493
|
+
<p>p
|
494
|
+
t</p>
|
495
|
+
<a>a
|
496
|
+
t</a>
|
497
|
+
<em>e
|
498
|
+
t</em>
|
499
|
+
<strong>s
|
500
|
+
t</strong>
|
501
|
+
<span>sp
|
502
|
+
t</span>
|
503
|
+
<li>li
|
504
|
+
t</li>
|
505
|
+
<dt>dt
|
506
|
+
t</dt>
|
507
|
+
<dd>dd
|
508
|
+
t</dd>
|
509
|
+
<caption>c
|
510
|
+
t</caption>
|
511
|
+
<th>th
|
512
|
+
t</th>
|
513
|
+
<td>td
|
514
|
+
t</td>
|
515
|
+
<button>button
|
516
|
+
t</button>
|
517
|
+
</body>
|
518
|
+
</html>
|
519
|
+
EOT
|
520
|
+
EimXML::XHTML::Formatter.write(h).should == s
|
521
|
+
end
|
522
|
+
end
|
523
|
+
end
|
524
|
+
end
|