rss-nokogiri 0.0.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.
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