rss-nokogiri 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/.gemtest +0 -0
  2. data/.gitignore +19 -0
  3. data/.gitmodules +3 -0
  4. data/BSDL +22 -0
  5. data/COPYING +56 -0
  6. data/COPYING.ja +51 -0
  7. data/Gemfile +4 -0
  8. data/LEGAL +8 -0
  9. data/README.markdown +51 -0
  10. data/Rakefile +12 -0
  11. data/lib/rss/nokogiri.rb +92 -0
  12. data/rss-nokogiri.gemspec +24 -0
  13. data/test/regression/dot.png +0 -0
  14. data/test/regression/rss-assertions.rb +2090 -0
  15. data/test/regression/rss-testcase.rb +478 -0
  16. data/test/regression/test_1.0.rb +295 -0
  17. data/test/regression/test_2.0.rb +409 -0
  18. data/test/regression/test_accessor.rb +103 -0
  19. data/test/regression/test_atom.rb +681 -0
  20. data/test/regression/test_content.rb +104 -0
  21. data/test/regression/test_dublincore.rb +279 -0
  22. data/test/regression/test_image.rb +214 -0
  23. data/test/regression/test_inherit.rb +40 -0
  24. data/test/regression/test_itunes.rb +347 -0
  25. data/test/regression/test_maker_0.9.rb +474 -0
  26. data/test/regression/test_maker_1.0.rb +516 -0
  27. data/test/regression/test_maker_2.0.rb +757 -0
  28. data/test/regression/test_maker_atom_entry.rb +393 -0
  29. data/test/regression/test_maker_atom_feed.rb +454 -0
  30. data/test/regression/test_maker_content.rb +47 -0
  31. data/test/regression/test_maker_dc.rb +149 -0
  32. data/test/regression/test_maker_image.rb +62 -0
  33. data/test/regression/test_maker_itunes.rb +471 -0
  34. data/test/regression/test_maker_slash.rb +37 -0
  35. data/test/regression/test_maker_sy.rb +44 -0
  36. data/test/regression/test_maker_taxo.rb +81 -0
  37. data/test/regression/test_maker_trackback.rb +41 -0
  38. data/test/regression/test_maker_xml-stylesheet.rb +83 -0
  39. data/test/regression/test_parser.rb +62 -0
  40. data/test/regression/test_parser_1.0.rb +528 -0
  41. data/test/regression/test_parser_2.0.rb +122 -0
  42. data/test/regression/test_parser_atom_entry.rb +163 -0
  43. data/test/regression/test_parser_atom_feed.rb +276 -0
  44. data/test/regression/test_setup_maker_0.9.rb +246 -0
  45. data/test/regression/test_setup_maker_1.0.rb +550 -0
  46. data/test/regression/test_setup_maker_2.0.rb +308 -0
  47. data/test/regression/test_setup_maker_atom_entry.rb +409 -0
  48. data/test/regression/test_setup_maker_atom_feed.rb +445 -0
  49. data/test/regression/test_setup_maker_itunes.rb +144 -0
  50. data/test/regression/test_setup_maker_slash.rb +38 -0
  51. data/test/regression/test_slash.rb +64 -0
  52. data/test/regression/test_syndication.rb +125 -0
  53. data/test/regression/test_taxonomy.rb +172 -0
  54. data/test/regression/test_to_s.rb +670 -0
  55. data/test/regression/test_trackback.rb +135 -0
  56. data/test/regression/test_version.rb +9 -0
  57. data/test/regression/test_xml-stylesheet.rb +108 -0
  58. metadata +220 -0
@@ -0,0 +1,104 @@
1
+ require "cgi"
2
+ require "rexml/document"
3
+
4
+ require "rss-testcase"
5
+
6
+ require "rss/content"
7
+
8
+ module RSS
9
+ class TestContent < TestCase
10
+ def setup
11
+ @prefix = "content"
12
+ @uri = "http://purl.org/rss/1.0/modules/content/"
13
+
14
+ @elems = {
15
+ :encoded => "<em>ATTENTION</em>",
16
+ }
17
+
18
+ @content_nodes = @elems.collect do |name, value|
19
+ "<#{@prefix}:#{name}>#{CGI.escapeHTML(value.to_s)}</#{@prefix}:#{name}>"
20
+ end.join("\n")
21
+
22
+ @rss10_source = make_RDF(<<-EOR, {@prefix => @uri})
23
+ #{make_channel()}
24
+ #{make_image()}
25
+ #{make_item(@content_nodes)}
26
+ #{make_textinput()}
27
+ EOR
28
+
29
+ @rss10 = Parser.parse(@rss10_source)
30
+
31
+
32
+ @rss20_source = make_rss20(<<-EOR, {@prefix => @uri})
33
+ #{make_channel20(make_item20(@content_nodes))}
34
+ EOR
35
+
36
+ @rss20 = Parser.parse(@rss20_source)
37
+ end
38
+
39
+ def test_parser
40
+ assert_nothing_raised do
41
+ Parser.parse(@rss10_source)
42
+ end
43
+
44
+ assert_nothing_raised do
45
+ Parser.parse(@rss20_source)
46
+ end
47
+
48
+ @elems.each do |tag, value|
49
+ tag_name = "#{@prefix}:#{tag}"
50
+ content_encodes = make_element(tag_name, {}, value) * 2
51
+
52
+ assert_too_much_tag(tag.to_s, "item") do
53
+ Parser.parse(make_RDF(<<-EOR, {@prefix => @uri}))
54
+ #{make_channel}
55
+ #{make_item(content_encodes)}
56
+ EOR
57
+ end
58
+
59
+ assert_too_much_tag(tag.to_s, "item") do
60
+ Parser.parse(make_rss20(<<-EOR, {@prefix => @uri}))
61
+ #{make_channel20(make_item20(content_encodes))}
62
+ EOR
63
+ end
64
+ end
65
+ end
66
+
67
+ def test_accessor
68
+ new_value = {
69
+ :encoded => "<![CDATA[<it>hoge</it>]]>",
70
+ }
71
+
72
+ @elems.each do |name, value|
73
+ [@rss10, @rss20].each do |rss|
74
+ meth = "#{RSS::CONTENT_PREFIX}_#{name}"
75
+ parent = rss.items.last
76
+ assert_equal(value, parent.__send__(meth))
77
+ parent.__send__("#{meth}=", new_value[name].to_s)
78
+ assert_equal(new_value[name], parent.__send__(meth))
79
+ end
80
+ end
81
+ end
82
+
83
+ def test_to_s
84
+ @elems.each do |name, value|
85
+ excepted = make_element("#{@prefix}:#{name}", {}, value)
86
+ meth = "#{RSS::CONTENT_PREFIX}_#{name}_element"
87
+ [@rss10, @rss20].each do |rss|
88
+ assert_equal(excepted, rss.items.last.__send__(meth))
89
+ end
90
+ end
91
+
92
+ [@rss10_source, @rss20_source].each do |source|
93
+ REXML::Document.new(source).root.each_element do |parent|
94
+ next unless parent.name != "item"
95
+ parent.each_element do |elem|
96
+ if elem.namespace == @uri
97
+ assert_equal(elem.text, @elems[elem.name.intern].to_s)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,279 @@
1
+ require "cgi"
2
+ require "rexml/document"
3
+
4
+ require "rss-testcase"
5
+
6
+ require "rss/1.0"
7
+ require "rss/dublincore"
8
+
9
+ module RSS
10
+ class TestDublinCore < TestCase
11
+ def setup
12
+ @rss10_parents = [%w(channel), %w(image), %w(item), %w(textinput)]
13
+
14
+ @rss10_source = make_RDF(<<-EOR, {DC_PREFIX => DC_URI})
15
+ #{make_channel(DC_NODES)}
16
+ #{make_image(DC_NODES)}
17
+ #{make_item(DC_NODES)}
18
+ #{make_textinput(DC_NODES)}
19
+ EOR
20
+
21
+ @rss20_parents = [%w(channel), %w(items last)]
22
+
23
+ @rss20_source = make_rss20(<<-EOR, {DC_PREFIX => DC_URI})
24
+ #{make_channel20(DC_NODES + make_item20(DC_NODES))}
25
+ EOR
26
+
27
+ @atom_feed_parents = [[], %w(entries last)]
28
+
29
+ @atom_feed_source = make_feed(<<-EOR, {DC_PREFIX => DC_URI})
30
+ #{DC_NODES}
31
+ #{make_entry(DC_NODES)}
32
+ EOR
33
+
34
+ @atom_entry_parents = [[]]
35
+
36
+ @atom_entry_source = make_entry_document(<<-EOR, {DC_PREFIX => DC_URI})
37
+ #{DC_NODES}
38
+ EOR
39
+ end
40
+
41
+ def test_parser
42
+ rss10_maker = Proc.new do |content, xmlns|
43
+ make_RDF(<<-EOR, xmlns)
44
+ #{make_channel(content)}
45
+ #{make_image(content)}
46
+ #{make_item(content)}
47
+ #{make_textinput(content)}
48
+ EOR
49
+ end
50
+ assert_dc_parse(@rss10_source, @rss10_parents, false, &rss10_maker)
51
+ assert_dc_parse(@rss10_source, @rss10_parents, true, &rss10_maker)
52
+
53
+ rss20_maker = Proc.new do |content, xmlns|
54
+ make_rss20(<<-EOR, xmlns)
55
+ #{make_channel20(content + make_item20(content))}
56
+ EOR
57
+ end
58
+ assert_dc_parse(@rss20_source, @rss20_parents, false, &rss20_maker)
59
+ assert_dc_parse(@rss20_source, @rss20_parents, true, &rss20_maker)
60
+
61
+ atom_feed_maker = Proc.new do |content, xmlns|
62
+ make_feed(<<-EOR, xmlns)
63
+ #{content}
64
+ #{make_entry(content)}
65
+ EOR
66
+ end
67
+ assert_dc_parse(@atom_feed_source, @atom_feed_parents, false,
68
+ &atom_feed_maker)
69
+ assert_dc_parse(@atom_feed_source, @atom_feed_parents, true,
70
+ &atom_feed_maker)
71
+
72
+ atom_entry_maker = Proc.new do |content, xmlns|
73
+ make_entry_document(<<-EOR, xmlns)
74
+ #{content}
75
+ EOR
76
+ end
77
+ assert_dc_parse(@atom_entry_source, @atom_entry_parents, false,
78
+ &atom_entry_maker)
79
+ assert_dc_parse(@atom_entry_source, @atom_entry_parents, true,
80
+ &atom_entry_maker)
81
+ end
82
+
83
+ def test_singular_accessor
84
+ assert_dc_singular_accessor(@rss10_source, @rss10_parents)
85
+ assert_dc_singular_accessor(@rss20_source, @rss20_parents)
86
+ assert_dc_singular_accessor(@atom_feed_source, @atom_feed_parents)
87
+ assert_dc_singular_accessor(@atom_entry_source, @atom_entry_parents)
88
+ end
89
+
90
+ def test_plural_accessor
91
+ assert_dc_plural_accessor(@rss10_source, @rss10_parents, false)
92
+ assert_dc_plural_accessor(@rss10_source, @rss10_parents, true)
93
+
94
+ assert_dc_plural_accessor(@rss20_source, @rss20_parents, false)
95
+ assert_dc_plural_accessor(@rss20_source, @rss20_parents, true)
96
+
97
+ assert_dc_plural_accessor(@atom_feed_source, @atom_feed_parents, false)
98
+ assert_dc_plural_accessor(@atom_feed_source, @atom_feed_parents, true)
99
+
100
+ assert_dc_plural_accessor(@atom_entry_source, @atom_entry_parents, false)
101
+ assert_dc_plural_accessor(@atom_entry_source, @atom_entry_parents, true)
102
+ end
103
+
104
+ def test_to_s
105
+ assert_dc_to_s(@rss10_source, @rss10_parents, false)
106
+ assert_dc_to_s(@rss10_source, @rss10_parents, true)
107
+
108
+ targets = ["channel", "channel/item[3]"]
109
+ assert_dc_to_s(@rss20_source, @rss20_parents, false, targets)
110
+ assert_dc_to_s(@rss20_source, @rss20_parents, true, targets)
111
+
112
+ targets = [".", "entry"]
113
+ assert_dc_to_s(@atom_feed_source, @atom_feed_parents, false, targets)
114
+ assert_dc_to_s(@atom_feed_source, @atom_feed_parents, true, targets)
115
+
116
+ targets = ["."]
117
+ assert_dc_to_s(@atom_entry_source, @atom_entry_parents, false, targets)
118
+ assert_dc_to_s(@atom_entry_source, @atom_entry_parents, true, targets)
119
+ end
120
+
121
+ private
122
+ def dc_plural_suffix(name, check_backward_compatibility)
123
+ if name == :rights
124
+ if check_backward_compatibility
125
+ "es"
126
+ else
127
+ "_list"
128
+ end
129
+ else
130
+ "s"
131
+ end
132
+ end
133
+
134
+ def assert_dc_parse(source, parents, check_backward_compatibility, &maker)
135
+ assert_nothing_raised do
136
+ Parser.parse(source)
137
+ end
138
+
139
+ DC_ELEMENTS.each do |name, value|
140
+ parents.each do |parent_readers|
141
+ feed = nil
142
+ assert_nothing_raised do
143
+ tag = "#{DC_PREFIX}:#{name}"
144
+ dc_content = "<#{tag}>#{value}</#{tag}>\n"
145
+ dc_content *= 2
146
+ feed = Parser.parse(maker.call(dc_content, {DC_PREFIX => DC_URI}))
147
+ end
148
+ parent = chain_reader(feed, parent_readers)
149
+
150
+ plural_suffix = dc_plural_suffix(name, check_backward_compatibility)
151
+ plural_reader = "dc_#{name}#{plural_suffix}"
152
+ values = parent.__send__(plural_reader).collect do |x|
153
+ val = x.value
154
+ if val.kind_of?(String)
155
+ CGI.escapeHTML(val)
156
+ else
157
+ val
158
+ end
159
+ end
160
+ assert_equal([value, value], values)
161
+ end
162
+ end
163
+ end
164
+
165
+ def assert_dc_singular_accessor(source, parents)
166
+ feed = Parser.parse(source)
167
+ new_value = "hoge"
168
+
169
+ parents.each do |parent_readers|
170
+ parent = chain_reader(feed, parent_readers)
171
+ DC_ELEMENTS.each do |name, value|
172
+ parsed_value = parent.__send__("dc_#{name}")
173
+ if parsed_value.kind_of?(String)
174
+ parsed_value = CGI.escapeHTML(parsed_value)
175
+ end
176
+ assert_equal(value, parsed_value)
177
+ if name == :date
178
+ t = Time.iso8601("2003-01-01T02:30:23+09:00")
179
+ class << t
180
+ alias_method(:to_s, :iso8601)
181
+ end
182
+ parent.__send__("dc_#{name}=", t.iso8601)
183
+ assert_equal(t, parent.__send__("dc_#{name}"))
184
+ if parent.class.method_defined?(:date_without_dc_date=)
185
+ assert_nil(parent.date)
186
+ else
187
+ assert_equal(t, parent.date)
188
+ end
189
+
190
+ parent.date = value
191
+ assert_equal(value, parent.date)
192
+ assert_equal(value, parent.__send__("dc_#{name}"))
193
+ else
194
+ parent.__send__("dc_#{name}=", new_value)
195
+ assert_equal(new_value, parent.__send__("dc_#{name}"))
196
+ end
197
+ end
198
+ end
199
+ end
200
+
201
+ def assert_dc_plural_accessor(source, parents, check_backward_compatibility)
202
+ feed = Parser.parse(source)
203
+ new_value = "hoge"
204
+
205
+ DC_ELEMENTS.each do |name, value|
206
+ parents.each do |parent_readers|
207
+ parent = chain_reader(feed, parent_readers)
208
+ parsed_value = parent.__send__("dc_#{name}")
209
+ if parsed_value.kind_of?(String)
210
+ parsed_value = CGI.escapeHTML(parsed_value)
211
+ end
212
+ assert_equal(value, parsed_value)
213
+
214
+ plural_suffix = dc_plural_suffix(name, check_backward_compatibility)
215
+ plural_reader = "dc_#{name}#{plural_suffix}"
216
+ klass_name = "DublinCore#{Utils.to_class_name(name.to_s)}"
217
+ klass = DublinCoreModel.const_get(klass_name)
218
+ if name == :date
219
+ t = Time.iso8601("2003-01-01T02:30:23+09:00")
220
+ class << t
221
+ alias_method(:to_s, :iso8601)
222
+ end
223
+ elems = parent.__send__(plural_reader)
224
+ elems << klass.new(t.iso8601)
225
+ new_elems = parent.__send__(plural_reader)
226
+ values = new_elems.collect{|x| x.value}
227
+ assert_equal([parent.__send__("dc_#{name}"), t], values)
228
+ else
229
+ elems = parent.__send__(plural_reader)
230
+ elems << klass.new(new_value)
231
+ new_elems = parent.__send__(plural_reader)
232
+ values = new_elems.collect{|x| x.value}
233
+ assert_equal([parent.__send__("dc_#{name}"), new_value],
234
+ values)
235
+ end
236
+ end
237
+ end
238
+ end
239
+
240
+ def assert_dc_to_s(source, parents, check_backward_compatibility,
241
+ targets=nil)
242
+ feed = Parser.parse(source)
243
+
244
+ DC_ELEMENTS.each do |name, value|
245
+ excepted = "<#{DC_PREFIX}:#{name}>#{value}</#{DC_PREFIX}:#{name}>"
246
+ parents.each do |parent_readers|
247
+ parent = chain_reader(feed, parent_readers)
248
+ assert_equal(excepted, parent.__send__("dc_#{name}_elements"))
249
+ end
250
+
251
+ plural_suffix = dc_plural_suffix(name, check_backward_compatibility)
252
+ reader = "dc_#{name}#{plural_suffix}"
253
+ excepted = Array.new(2, excepted).join("\n")
254
+ parents.each do |parent_readers|
255
+ parent = chain_reader(feed, parent_readers)
256
+ elems = parent.__send__(reader)
257
+ klass_name = "DublinCore#{Utils.to_class_name(name.to_s)}"
258
+ klass = DublinCoreModel.const_get(klass_name)
259
+ elems << klass.new(parent.__send__("dc_#{name}"))
260
+ assert_equal(excepted, parent.__send__("dc_#{name}_elements"))
261
+ end
262
+ end
263
+
264
+ targets ||= parents.collect do |parent_readers|
265
+ parent_readers.first
266
+ end
267
+ feed_root = REXML::Document.new(source).root
268
+ targets.each do |target_xpath|
269
+ parent = feed_root.elements[target_xpath]
270
+ parent.each_element do |elem|
271
+ if elem.namespace == DC_URI
272
+ assert_equal(CGI.escapeHTML(elem.text),
273
+ DC_ELEMENTS[elem.name.intern].to_s)
274
+ end
275
+ end
276
+ end
277
+ end
278
+ end
279
+ end
@@ -0,0 +1,214 @@
1
+ require "cgi"
2
+ require "rexml/document"
3
+
4
+ require "rss-testcase"
5
+
6
+ require "rss/1.0"
7
+ require "rss/image"
8
+
9
+ module RSS
10
+ class TestImage < TestCase
11
+
12
+ def setup
13
+ @prefix = "image"
14
+ @uri = "http://purl.org/rss/1.0/modules/image/"
15
+
16
+ @favicon_attrs = {
17
+ "rdf:about" => "http://www.kuro5hin.org/favicon.ico",
18
+ "#{@prefix}:size" => "small",
19
+ }
20
+ @favicon_contents = {"dc:title" => "Kuro5hin",}
21
+ @items = [
22
+ [
23
+ {
24
+ "rdf:about" => "http://www.example.org/item.png",
25
+ "rdf:resource" => "http://www.example.org/item",
26
+ },
27
+ {
28
+ "dc:title" => "Example Image",
29
+ "#{@prefix}:width" => "100",
30
+ "#{@prefix}:height" => "65",
31
+ },
32
+ ],
33
+ [
34
+ {
35
+ "rdf:about" => "http://www.kuro5hin.org/images/topics/culture.jpg",
36
+ },
37
+ {
38
+ "dc:title" => "Culture",
39
+ "#{@prefix}:width" => "80",
40
+ "#{@prefix}:height" => "50",
41
+ },
42
+ ]
43
+ ]
44
+
45
+
46
+ @channel_nodes = make_element("#{@prefix}:favicon",
47
+ @favicon_attrs,
48
+ @favicon_contents)
49
+ items = ""
50
+ @items.each do |attrs, contents|
51
+ image_item = make_element("#{@prefix}:item", attrs, contents)
52
+ items << make_item(image_item)
53
+ end
54
+
55
+ @ns = {
56
+ @prefix => @uri,
57
+ DC_PREFIX => DC_URI,
58
+ }
59
+ @rss_source = make_RDF(<<-EOR, @ns)
60
+ #{make_channel(@channel_nodes)}
61
+ #{make_image}
62
+ #{items}
63
+ #{make_textinput}
64
+ EOR
65
+
66
+ @rss = Parser.parse(@rss_source)
67
+ end
68
+
69
+ def test_parser
70
+ assert_nothing_raised do
71
+ Parser.parse(@rss_source)
72
+ end
73
+
74
+ assert_too_much_tag("favicon", "channel") do
75
+ Parser.parse(make_RDF(<<-EOR, @ns))
76
+ #{make_channel(@channel_nodes * 2)}
77
+ #{make_item}
78
+ EOR
79
+ end
80
+
81
+ attrs = {"rdf:about" => "http://www.example.org/item.png"}
82
+ contents = [["#{@prefix}:width", "80"]] * 5
83
+ image_item = make_element("#{@prefix}:item", attrs, contents)
84
+ assert_too_much_tag("width", "item") do
85
+ Parser.parse(make_RDF(<<-EOR, @ns))
86
+ #{make_channel}
87
+ #{make_item(image_item)}
88
+ EOR
89
+ end
90
+ end
91
+
92
+ def test_favicon_accessor
93
+ favicon = @rss.channel.image_favicon
94
+ [
95
+ %w(about rdf:about http://example.com/favicon.ico),
96
+ %w(size image:size large),
97
+ %w(image_size image:size medium),
98
+ ].each do |name, full_name, new_value|
99
+ assert_equal(@favicon_attrs[full_name], favicon.__send__(name))
100
+ favicon.__send__("#{name}=", new_value)
101
+ assert_equal(new_value, favicon.__send__(name))
102
+ favicon.__send__("#{name}=", @favicon_attrs[full_name])
103
+ assert_equal(@favicon_attrs[full_name], favicon.__send__(name))
104
+ end
105
+
106
+ %w(small medium large).each do |value|
107
+ assert_nothing_raised do
108
+ favicon.size = value
109
+ favicon.image_size = value
110
+ end
111
+ end
112
+
113
+ %w(aaa AAA SMALL MEDIUM LARGE).each do |value|
114
+ args = ["#{@prefix}:favicon", value, "#{@prefix}:size"]
115
+ assert_not_available_value(*args) do
116
+ favicon.size = value
117
+ end
118
+ assert_not_available_value(*args) do
119
+ favicon.image_size = value
120
+ end
121
+ end
122
+
123
+ [
124
+ %w(dc_title dc:title sample-favicon),
125
+ ].each do |name, full_name, new_value|
126
+ assert_equal(@favicon_contents[full_name], favicon.__send__(name))
127
+ favicon.__send__("#{name}=", new_value)
128
+ assert_equal(new_value, favicon.__send__(name))
129
+ favicon.__send__("#{name}=", @favicon_contents[full_name])
130
+ assert_equal(@favicon_contents[full_name], favicon.__send__(name))
131
+ end
132
+ end
133
+
134
+ def test_item_accessor
135
+ @rss.items.each_with_index do |item, i|
136
+ image_item = item.image_item
137
+ attrs, contents = @items[i]
138
+ [
139
+ %w(about rdf:about http://example.com/image.png),
140
+ %w(resource rdf:resource http://example.com/),
141
+ ].each do |name, full_name, new_value|
142
+ assert_equal(attrs[full_name], image_item.__send__(name))
143
+ image_item.__send__("#{name}=", new_value)
144
+ assert_equal(new_value, image_item.__send__(name))
145
+ image_item.__send__("#{name}=", attrs[full_name])
146
+ assert_equal(attrs[full_name], image_item.__send__(name))
147
+ end
148
+
149
+ [
150
+ ["width", "image:width", "111"],
151
+ ["image_width", "image:width", "44"],
152
+ ["height", "image:height", "222"],
153
+ ["image_height", "image:height", "88"],
154
+ ].each do |name, full_name, new_value|
155
+ assert_equal(contents[full_name].to_i, image_item.__send__(name))
156
+ image_item.__send__("#{name}=", new_value)
157
+ assert_equal(new_value.to_i, image_item.__send__(name))
158
+ image_item.__send__("#{name}=", contents[full_name])
159
+ assert_equal(contents[full_name].to_i, image_item.__send__(name))
160
+ end
161
+
162
+ [
163
+ ["dc_title", "dc:title", "sample-image"],
164
+ ].each do |name, full_name, new_value|
165
+ assert_equal(contents[full_name], image_item.__send__(name))
166
+ image_item.__send__("#{name}=", new_value)
167
+ assert_equal(new_value, image_item.__send__(name))
168
+ image_item.__send__("#{name}=", contents[full_name])
169
+ assert_equal(contents[full_name], image_item.__send__(name))
170
+ end
171
+ end
172
+ end
173
+
174
+ def test_favicon_to_s
175
+ favicon = @rss.channel.image_favicon
176
+ expected_xml = image_xmlns_container(make_element("#{@prefix}:favicon",
177
+ @favicon_attrs,
178
+ @favicon_contents))
179
+ expected = REXML::Document.new(expected_xml)
180
+ actual_xml = image_xmlns_container(favicon.to_s(false, ""))
181
+ actual = REXML::Document.new(actual_xml)
182
+ assert_equal(expected.to_s, actual.to_s)
183
+ end
184
+
185
+ def test_item_to_s
186
+ @rss.items.each_with_index do |item, i|
187
+ attrs, contents = @items[i]
188
+ expected_xml = make_element("#{@prefix}:item", attrs, contents)
189
+ expected_xml = image_xmlns_container(expected_xml)
190
+ expected = REXML::Document.new(expected_xml)
191
+ actual_xml = image_xmlns_container(item.image_item.to_s(false, ""))
192
+ actual = REXML::Document.new(actual_xml)
193
+
194
+ assert_equal(expected[0].attributes, actual[0].attributes)
195
+
196
+ %w(image:height image:width dc:title).each do |name|
197
+ actual_target = actual.elements["//#{name}"]
198
+ expected_target = expected.elements["//#{name}"]
199
+ assert_equal(expected_target.to_s, actual_target.to_s)
200
+ end
201
+ end
202
+ end
203
+
204
+ private
205
+ def image_xmlns_container(content)
206
+ xmlns_container({
207
+ @prefix => @uri,
208
+ "dc" => "http://purl.org/dc/elements/1.1/",
209
+ "rdf" => "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
210
+ },
211
+ content)
212
+ end
213
+ end
214
+ end