ruby/test/rss/rss-assertions.rb

2091 строка
68 KiB
Ruby

require 'erb'
module RSS
module Assertions
def _wrap_assertion
yield
end
def assert_parse(rss, assert_method, *args)
__send__("assert_#{assert_method}", *args) do
::RSS::Parser.parse(rss)
end
__send__("assert_#{assert_method}", *args) do
::RSS::Parser.parse(rss, false).validate
end
end
def assert_ns(prefix, uri)
_wrap_assertion do
begin
yield
flunk("Not raise NSError")
rescue ::RSS::NSError => e
assert_equal(prefix, e.prefix)
assert_equal(uri, e.uri)
end
end
end
def assert_missing_tag(tag, parent)
_wrap_assertion do
begin
yield
flunk("Not raise MissingTagError")
rescue ::RSS::MissingTagError => e
assert_equal(tag, e.tag)
assert_equal(parent, e.parent)
end
end
end
def assert_too_much_tag(tag, parent)
_wrap_assertion do
begin
yield
flunk("Not raise TooMuchTagError")
rescue ::RSS::TooMuchTagError => e
assert_equal(tag, e.tag)
assert_equal(parent, e.parent)
end
end
end
def assert_missing_attribute(tag, attrname)
_wrap_assertion do
begin
yield
flunk("Not raise MissingAttributeError")
rescue ::RSS::MissingAttributeError => e
assert_equal(tag, e.tag)
assert_equal(attrname, e.attribute)
end
end
end
def assert_not_expected_tag(tag, uri, parent)
_wrap_assertion do
begin
yield
flunk("Not raise NotExpectedTagError")
rescue ::RSS::NotExpectedTagError => e
assert_equal(tag, e.tag)
assert_equal(uri, e.uri)
assert_equal(parent, e.parent)
end
end
end
def assert_not_available_value(tag, value, attribute=nil)
_wrap_assertion do
begin
yield
flunk("Not raise NotAvailableValueError")
rescue ::RSS::NotAvailableValueError => e
assert_equal(tag, e.tag)
assert_equal(value, e.value)
assert_equal(attribute, e.attribute)
end
end
end
def assert_not_set_error(name, variables)
_wrap_assertion do
begin
yield
flunk("Not raise NotSetError")
rescue ::RSS::NotSetError => e
assert_equal(name, e.name)
assert_kind_of(Array, variables)
assert_equal(variables.sort, e.variables.sort)
end
end
end
def assert_xml_declaration(version, encoding, standalone, rss)
_wrap_assertion do
assert_equal(version, rss.version)
assert_equal(encoding, rss.encoding)
assert_equal(standalone, rss.standalone)
end
end
def assert_xml_stylesheet_attrs(attrs, xsl)
_wrap_assertion do
n_attrs = normalized_attrs(attrs)
::RSS::XMLStyleSheet::ATTRIBUTES.each do |name|
assert_equal(n_attrs[name], xsl.__send__(name))
end
end
end
def assert_xml_stylesheet(target, attrs, xsl)
_wrap_assertion do
if attrs.has_key?(:href)
if !attrs.has_key?(:type) and attrs.has_key?(:guess_type)
attrs[:type] = attrs[:guess_type]
end
assert_equal("xml-stylesheet", target)
assert_xml_stylesheet_attrs(attrs, xsl)
else
assert_nil(target)
assert_equal("", xsl.to_s)
end
end
end
def assert_xml_stylesheet_pis(attrs_ary, rss=nil)
_wrap_assertion do
if rss.nil?
rss = ::RSS::RDF.new
setup_rss10(rss)
end
xss_strs = []
attrs_ary.each do |attrs|
xss = ::RSS::XMLStyleSheet.new(attrs)
xss_strs.push(xss.to_s)
rss.xml_stylesheets.push(xss)
end
pi_str = rss.to_s.gsub(/<\?xml .*\n/, "").gsub(/\s*<[^\?].*\z/m, "")
assert_equal(xss_strs.join("\n"), pi_str)
end
end
def assert_xml_stylesheets(attrs, xss)
_wrap_assertion do
xss.each_with_index do |xs, i|
assert_xml_stylesheet_attrs(attrs[i], xs)
end
end
end
def assert_atom_person(tag_name, generator)
_wrap_assertion do
name = "Mark Pilgrim"
uri = "http://example.org/"
email = "f8dy@example.com"
assert_parse(generator.call(<<-EOA), :missing_tag, "name", tag_name)
<#{tag_name}/>
EOA
assert_parse(generator.call(<<-EOA), :missing_tag, "name", tag_name)
<#{tag_name}>
<uri>#{uri}</uri>
<email>#{email}</email>
</#{tag_name}>
EOA
assert_parse(generator.call(<<-EOA), :nothing_raised)
<#{tag_name}>
<name>#{name}</name>
</#{tag_name}>
EOA
feed = RSS::Parser.parse(generator.call(<<-EOA))
<#{tag_name}>
<name>#{name}</name>
<uri>#{uri}</uri>
<email>#{email}</email>
</#{tag_name}>
EOA
person = yield(feed)
assert_not_nil(person)
assert_equal(name, person.name.content)
assert_equal(uri, person.uri.content)
assert_equal(email, person.email.content)
end
end
def assert_atom_category(generator)
_wrap_assertion do
term = "Music"
scheme = "http://xmlns.com/wordnet/1.6/"
label = "music"
missing_args = [:missing_attribute, "category", "term"]
assert_parse(generator.call(<<-EOA), *missing_args)
<category/>
EOA
assert_parse(generator.call(<<-EOA), *missing_args)
<category scheme="#{scheme}" label="#{label}"/>
EOA
assert_parse(generator.call(<<-EOA), :nothing_raised)
<category term="#{term}"/>
EOA
feed = RSS::Parser.parse(generator.call(<<-EOA))
<category term="#{term}" scheme="#{scheme}" label="#{label}"/>
EOA
category = yield(feed)
assert_not_nil(category)
assert_equal(term, category.term)
assert_equal(scheme, category.scheme)
assert_equal(label, category.label)
end
end
def assert_atom_link(generator)
_wrap_assertion do
href = "http://example.org/feed.atom"
rel = "self"
type = "application/atom+xml"
hreflang = "en"
title = "Atom"
length = "1024"
assert_parse(generator.call(<<-EOA), :missing_attribute, "link", "href")
<link/>
EOA
assert_parse(generator.call(<<-EOA), :missing_attribute, "link", "href")
<link rel="#{rel}" type="#{type}" hreflang="#{hreflang}"
title="#{title}" length="#{length}"/>
EOA
assert_parse(generator.call(<<-EOA), :nothing_raised)
<link href="#{href}"/>
EOA
feed = RSS::Parser.parse(generator.call(<<-EOA))
<link href="#{href}" rel="#{rel}" type="#{type}" hreflang="#{hreflang}"
title="#{title}" length="#{length}"/>
EOA
link = yield(feed)
assert_not_nil(link)
assert_equal(href, link.href)
assert_equal(rel, link.rel)
assert_equal(type, link.type)
assert_equal(hreflang, link.hreflang)
assert_equal(title, link.title)
assert_equal(length, link.length)
href = "http://example.org/index.html.ja"
parent = link.parent.tag_name
return if parent == "source"
optional_attributes = %w(hreflang="ja" type="text/html")
0.upto(optional_attributes.size) do |i|
combination(optional_attributes, i).each do |attributes|
attrs = attributes.join(" ")
assert_parse(generator.call(<<-EOA), :too_much_tag, "link", parent)
<link rel="alternate" #{attrs} href="#{href}"/>
<link rel="alternate" #{attrs} href="#{href}"/>
EOA
end
end
end
end
def assert_atom_generator(generator)
_wrap_assertion do
uri = "http://www.example.com/"
version = "1.0"
content = "Example Toolkit"
assert_parse(generator.call(<<-EOA), :nothing_raised)
<generator/>
EOA
assert_parse(generator.call(<<-EOA), :nothing_raised)
<generator uri="#{uri}" version="#{version}"/>
EOA
feed = RSS::Parser.parse(generator.call(<<-EOA))
<generator uri="#{uri}" version="#{version}">#{content}</generator>
EOA
gen = yield(feed)
assert_not_nil(gen)
assert_equal(uri, gen.uri)
assert_equal(version, gen.version)
assert_equal(content, gen.content)
end
end
def assert_atom_icon(generator)
_wrap_assertion do
content = "http://www.example.com/example.png"
assert_parse(generator.call(<<-EOA), :nothing_raised)
<icon/>
EOA
feed = RSS::Parser.parse(generator.call(<<-EOA))
<icon>#{content}</icon>
EOA
icon = yield(feed)
assert_not_nil(icon)
assert_equal(content, icon.content)
end
end
def assert_atom_text_construct(tag_name, generator)
_wrap_assertion do
[nil, "text", "html"].each do |type|
attr = ""
attr = " type=\"#{type}\""if type
assert_parse(generator.call(<<-EOA), :nothing_raised)
<#{tag_name}#{attr}/>
EOA
end
assert_parse(generator.call(<<-EOA), :missing_tag, "div", tag_name)
<#{tag_name} type="xhtml"/>
EOA
args = ["x", Atom::URI, tag_name]
assert_parse(generator.call(<<-EOA), :not_expected_tag, *args)
<#{tag_name} type="xhtml"><x/></#{tag_name}>
EOA
invalid_value = "invalid"
args = ["type", invalid_value]
assert_parse(generator.call(<<-EOA), :not_available_value, *args)
<#{tag_name} type="#{invalid_value}"/>
EOA
[
[nil, "A lot of effort went into making this effortless"],
["text", "A lot of effort went into making this effortless"],
["html", "A <em>lot</em> of effort went into making this effortless"],
].each do |type, content|
attr = ""
attr = " type=\"#{type}\"" if type
feed = RSS::Parser.parse(generator.call(<<-EOA))
<#{tag_name}#{attr}>#{h content}</#{tag_name}>
EOA
element = yield(feed)
assert_not_nil(element)
assert_equal(type, element.type)
assert_equal(content, element.content)
end
[false, true].each do |with_space|
xhtml_uri = "http://www.w3.org/1999/xhtml"
xhtml_content = "<div xmlns=\"#{xhtml_uri}\">abc</div>"
xhtml_element = RSS::XML::Element.new("div", nil, xhtml_uri,
{"xmlns" => xhtml_uri},
["abc"])
content = xhtml_content
content = " #{content} " if with_space
feed = RSS::Parser.parse(generator.call(<<-EOA))
<#{tag_name} type="xhtml">#{content}</#{tag_name}>
EOA
element = yield(feed)
assert_not_nil(element)
assert_equal("xhtml", element.type)
assert_equal(xhtml_content, element.content)
assert_equal(xhtml_element, element.xhtml)
end
end
end
def assert_atom_date_construct(tag_name, generator)
_wrap_assertion do
args = [tag_name, ""]
assert_parse(generator.call(<<-EOR), :not_available_value, *args)
<#{tag_name}/>
EOR
[
["xxx", false],
["2007", false],
["2007/02/09", true],
].each do |invalid_value, can_parse|
assert_not_available_value(tag_name, invalid_value) do
RSS::Parser.parse(generator.call(<<-EOR))
<#{tag_name}>#{invalid_value}</#{tag_name}>
EOR
end
feed = RSS::Parser.parse(generator.call(<<-EOR), false)
<#{tag_name}>#{invalid_value}</#{tag_name}>
EOR
value = yield(feed).content
if can_parse
assert_equal(Time.parse(invalid_value), value)
else
assert_nil(value)
end
end
[
"2003-12-13T18:30:02Z",
"2003-12-13T18:30:02.25Z",
"2003-12-13T18:30:02+01:00",
"2003-12-13T18:30:02.25+01:00",
].each do |valid_value|
assert_parse(generator.call(<<-EOR), :nothing_raised)
<#{tag_name}>#{valid_value}</#{tag_name}>
EOR
feed = RSS::Parser.parse(generator.call(<<-EOR))
<#{tag_name}>#{valid_value}</#{tag_name}>
EOR
assert_equal(Time.parse(valid_value), yield(feed).content)
end
end
end
def assert_atom_logo(generator)
_wrap_assertion do
content = "http://www.example.com/example.png"
assert_parse(generator.call(<<-EOA), :nothing_raised)
<logo/>
EOA
feed = RSS::Parser.parse(generator.call(<<-EOA))
<logo>#{content}</logo>
EOA
logo = yield(feed)
assert_not_nil(logo)
assert_equal(content, logo.content)
end
end
def assert_atom_content(generator, &getter)
_wrap_assertion do
assert_atom_content_inline_text(generator, &getter)
assert_atom_content_inline_xhtml(generator, &getter)
assert_atom_content_inline_other(generator, &getter)
assert_atom_content_out_of_line(generator, &getter)
end
end
def assert_atom_content_inline_text(generator)
_wrap_assertion do
[nil, "text", "html"].each do |type|
content = "<content"
content << " type='#{type}'" if type
suffix = "/>"
assert_parse(generator.call(content + suffix), :nothing_raised)
suffix = ">xxx</content>"
assert_parse(generator.call(content + suffix), :nothing_raised)
end
[
["text", "sample content"],
["text/plain", "sample content"],
["html", "<em>sample</em> content"]
].each do |type, content_content|
feed = RSS::Parser.parse(generator.call(<<-EOA))
<content type="#{type}">#{h content_content}</content>
EOA
content = yield(feed)
assert_equal(type, content.type)
if %w(text html).include?(type)
assert(content.inline_text?)
else
assert(!content.inline_text?)
end
if type == "html"
assert(content.inline_html?)
else
assert(!content.inline_html?)
end
assert(!content.inline_xhtml?)
if type == "text/plain"
assert(content.inline_other?)
assert(content.inline_other_text?)
else
assert(!content.inline_other?)
assert(!content.inline_other_text?)
end
assert(!content.inline_other_xml?)
assert(!content.inline_other_base64?)
assert(!content.out_of_line?)
assert(!content.have_xml_content?)
assert_equal(content_content, content.content)
end
end
end
def assert_atom_content_inline_xhtml(generator)
_wrap_assertion do
args = ["div", "content"]
assert_parse(generator.call(<<-EOA), :missing_tag, *args)
<content type="xhtml"/>
EOA
args = ["x", Atom::URI, "content"]
assert_parse(generator.call(<<-EOA), :not_expected_tag, *args)
<content type="xhtml"><x/></content>
EOA
xhtml_uri = "http://www.w3.org/1999/xhtml"
xhtml_content = "<div xmlns=\"#{xhtml_uri}\">abc</div>"
xhtml_element = RSS::XML::Element.new("div", nil, xhtml_uri,
{"xmlns" => xhtml_uri},
["abc"])
feed = RSS::Parser.parse(generator.call(<<-EOA))
<content type="xhtml">#{xhtml_content}</content>
EOA
content = yield(feed)
assert_not_nil(content)
assert_equal("xhtml", content.type)
assert(!content.inline_text?)
assert(!content.inline_html?)
assert(content.inline_xhtml?)
assert(!content.inline_other?)
assert(!content.inline_other_text?)
assert(!content.inline_other_xml?)
assert(!content.inline_other_base64?)
assert(!content.out_of_line?)
assert(content.have_xml_content?)
assert_equal(xhtml_content, content.content)
assert_equal(xhtml_element, content.xhtml)
end
end
def assert_atom_content_inline_other(generator, &getter)
_wrap_assertion do
assert_atom_content_inline_other_text(generator, &getter)
assert_atom_content_inline_other_xml(generator, &getter)
end
end
def assert_atom_content_inline_other_text(generator)
_wrap_assertion do
type = "image/png"
assert_parse(generator.call(<<-EOA), :nothing_raised)
<content type="#{type}"/>
EOA
png_file = File.join(File.dirname(__FILE__), "dot.png")
png = File.open(png_file, "rb") do |file|
file.read.force_encoding("binary")
end
base64_content = [png].pack("m").delete("\n")
[false, true].each do |with_space|
xml_content = base64_content
xml_content = " #{base64_content}" if with_space
feed = RSS::Parser.parse(generator.call(<<-EOA))
<content type="#{type}">#{xml_content}</content>
EOA
content = yield(feed)
assert_not_nil(content)
assert_equal(type, content.type)
assert(!content.inline_text?)
assert(!content.inline_html?)
assert(!content.inline_xhtml?)
assert(content.inline_other?)
assert(!content.inline_other_text?)
assert(!content.inline_other_xml?)
assert(content.inline_other_base64?)
assert(!content.out_of_line?)
assert(!content.have_xml_content?)
assert_equal(png, content.content)
xml = REXML::Document.new(content.to_s).root
assert_rexml_element([], {"type" => type}, base64_content, xml)
end
end
end
def assert_atom_content_inline_other_xml(generator)
_wrap_assertion do
type = "image/svg+xml"
assert_parse(generator.call(<<-EOA), :nothing_raised)
<content type="#{type}"/>
EOA
svg_uri = "http://www.w3.org/2000/svg"
svg_width = "50pt"
svg_height = "20pt"
svg_version = "1.0"
text_x = "15"
text_y = "15"
text = "text"
svg_content = <<-EOS
<svg
xmlns="#{svg_uri}"
width="#{svg_width}"
height="#{svg_height}"
version="#{svg_version}"
><text x="#{text_x}" y="#{text_y}">#{text}</text
></svg>
EOS
text_element = RSS::XML::Element.new("text", nil, svg_uri,
{
"x" => text_x,
"y" => text_y,
},
[text])
svg_element = RSS::XML::Element.new("svg", nil, svg_uri,
{
"xmlns" => svg_uri,
"width" => svg_width,
"height" => svg_height,
"version" => svg_version,
},
[text_element])
feed = RSS::Parser.parse(generator.call(<<-EOA))
<content type="#{type}">#{svg_content}</content>
EOA
content = yield(feed)
assert_not_nil(content)
assert_equal(type, content.type)
assert(!content.inline_text?)
assert(!content.inline_html?)
assert(!content.inline_xhtml?)
assert(content.inline_other?)
assert(!content.inline_other_text?)
assert(content.inline_other_xml?)
assert(!content.inline_other_base64?)
assert(!content.out_of_line?)
assert(content.have_xml_content?)
assert_equal(REXML::Document.new(svg_content).to_s.chomp,
REXML::Document.new(content.content).to_s.chomp)
assert_equal(svg_element, content.xml)
assert_nil(content.xhtml)
end
end
def assert_atom_content_out_of_line(generator)
_wrap_assertion do
text_type = "text/plain"
text_src = "http://example.com/README.txt"
missing_args = [:missing_attribute, "content", "type"]
# RSS Parser raises error even if this is "should" not "must".
assert_parse(generator.call(<<-EOA), *missing_args)
<content src="#{text_src}"/>
EOA
content_content = "xxx"
not_available_value_args = [:not_available_value,
"content", content_content]
assert_parse(generator.call(<<-EOA), *not_available_value_args)
<content type="#{text_type}" src="#{text_src}">#{content_content}</content>
EOA
feed = RSS::Parser.parse(generator.call(<<-EOA))
<content type="#{text_type}" src="#{text_src}"/>
EOA
content = yield(feed)
assert_not_nil(content)
assert_equal(text_type, content.type)
assert_equal(text_src, content.src)
assert(!content.inline_text?)
assert(!content.inline_html?)
assert(!content.inline_xhtml?)
assert(!content.inline_other?)
assert(!content.inline_other_text?)
assert(!content.inline_other_xml?)
assert(!content.inline_other_base64?)
assert(content.out_of_line?)
assert(!content.have_xml_content?)
assert_nil(content.xml)
assert_nil(content.xhtml)
assert_equal("", content.content)
end
end
def assert_atom_source(generator, &getter)
_wrap_assertion do
assert_atom_source_author(generator, &getter)
assert_atom_source_category(generator, &getter)
assert_atom_source_contributor(generator, &getter)
assert_atom_source_generator(generator, &getter)
assert_atom_source_icon(generator, &getter)
assert_atom_source_id(generator, &getter)
assert_atom_source_link(generator, &getter)
assert_atom_source_logo(generator, &getter)
assert_atom_source_rights(generator, &getter)
assert_atom_source_subtitle(generator, &getter)
assert_atom_source_title(generator, &getter)
assert_atom_source_updated(generator, &getter)
end
end
def assert_atom_source_author(generator)
assert_atom_person("author", generator) do |feed|
source = yield(feed)
assert_equal(1, source.authors.size)
source.author
end
end
def assert_atom_source_category(generator)
assert_atom_category(generator) do |feed|
source = yield(feed)
assert_equal(1, source.categories.size)
source.category
end
end
def assert_atom_source_contributor(generator)
assert_atom_person("contributor", generator) do |feed|
source = yield(feed)
assert_equal(1, source.contributors.size)
source.contributor
end
end
def assert_atom_source_generator(generator)
assert_atom_generator(generator) do |feed|
yield(feed).generator
end
end
def assert_atom_source_icon(generator)
assert_atom_icon(generator) do |feed|
yield(feed).icon
end
end
def assert_atom_source_id(generator)
id_content = "urn:uuid:a2fb588b-5674-4898-b420-265a734fea69"
id = "<id>#{id_content}</id>"
feed = RSS::Parser.parse(generator.call(id))
assert_equal(id_content, yield(feed).id.content)
end
def assert_atom_source_link(generator)
assert_atom_link(generator) do |feed|
source = yield(feed)
assert_equal(1, source.links.size)
source.link
end
end
def assert_atom_source_logo(generator)
assert_atom_logo(generator) do |feed|
yield(feed).logo
end
end
def assert_atom_source_rights(generator)
assert_atom_text_construct("rights", generator) do |feed|
yield(feed).rights
end
end
def assert_atom_source_subtitle(generator)
assert_atom_text_construct("subtitle", generator) do |feed|
yield(feed).subtitle
end
end
def assert_atom_source_title(generator)
assert_atom_text_construct("title", generator) do |feed|
yield(feed).title
end
end
def assert_atom_source_updated(generator)
assert_atom_date_construct("updated", generator) do |feed|
yield(feed).updated
end
end
def assert_dublin_core(elems, target)
_wrap_assertion do
elems.each do |name, value|
assert_equal(value, target.__send__("dc_#{name}"))
end
end
end
def assert_multiple_dublin_core(elems, target)
_wrap_assertion do
elems.each do |name, values, plural|
plural ||= "#{name}s"
actual = target.__send__("dc_#{plural}").collect{|x| x.value}
assert_equal(values, actual)
end
end
end
def assert_syndication(elems, target)
_wrap_assertion do
elems.each do |name, value|
meth = "sy_#{name}"
value = value.to_i if meth == "sy_updateFrequency"
assert_equal(value, target.__send__(meth ))
end
end
end
def assert_content(elems, target)
_wrap_assertion do
elems.each do |name, value|
assert_equal(value, target.__send__("content_#{name}"))
end
end
end
def assert_trackback(attrs, target)
_wrap_assertion do
n_attrs = normalized_attrs(attrs)
if n_attrs["ping"]
assert_equal(n_attrs["ping"], target.trackback_ping)
end
if n_attrs["abouts"]
n_attrs["abouts"].each_with_index do |about, i|
assert_equal(about, target.trackback_abouts[i].value)
end
end
end
end
def assert_taxo_topic(topics, target)
_wrap_assertion do
topics.each_with_index do |topic, i|
taxo_topic = target.taxo_topics[i]
topic.each do |name, value|
case name
when :link
assert_equal(value, taxo_topic.about)
assert_equal(value, taxo_topic.taxo_link)
when :topics
assert_equal(value, taxo_topic.taxo_topics.resources)
else
assert_equal(value, taxo_topic.__send__("dc_#{name}"))
end
end
end
end
end
def assert_attributes(attrs, names, target)
_wrap_assertion do
n_attrs = normalized_attrs(attrs)
names.each do |info|
if info.is_a?(String)
name = info
type = nil
else
name, type = info
end
value = n_attrs[name]
if value.is_a?(Time)
actual = target.__send__(name)
assert_instance_of(Time, actual)
assert_equal(value.to_i, actual.to_i)
elsif value
case type
when :integer
value = value.to_i
when :boolean
value = value == "true" if value.is_a?(String)
end
assert_equal(value, target.__send__(name))
end
end
end
end
def assert_rexml_element(children, attrs, text, element, text_type=nil)
_wrap_assertion do
if children
children_info = element.elements.collect {|e| [e.namespace, e.name]}
assert_equal(children.collect {|uri, name| [uri, name]}.sort,
children_info.sort)
end
if attrs
assert_equal(attrs.collect {|k, v| [k, v]}.sort,
element.attributes.collect {|k, v| [k, v]}.sort)
end
case text_type
when :time
assert_not_nil(element.text)
assert_equal(Time.parse(text).to_s, Time.parse(element.text).to_s)
else
assert_equal(text, element.text)
end
end
end
def _assert_maker_atom_persons(feed_type, maker_readers, feed_readers)
_wrap_assertion do
persons = []
feed = RSS::Maker.make("atom:#{feed_type}") do |maker|
yield maker
targets = chain_reader(maker, maker_readers)
targets.each do |target|
person = {
:name => target.name,
:uri => target.uri,
:email => target.email,
}
persons << person if person[:name]
end
end
actual_persons = chain_reader(feed, feed_readers) || []
actual_persons = actual_persons.collect do |person|
{
:name => person.name ? person.name.content : nil,
:uri => person.uri ? person.uri.content : nil,
:email => person.email ? person.email.content : nil,
}
end
assert_equal(persons, actual_persons)
end
end
def assert_maker_atom_persons(feed_type, maker_readers, feed_readers,
not_set_error_name=nil,
parent_not_set_error_name=nil,
parent_not_set_variable=nil)
_wrap_assertion do
not_set_error_name ||= "maker.#{maker_readers.join('.')}"
args = [feed_type, maker_readers, feed_readers]
if parent_not_set_error_name or parent_not_set_variable
assert_not_set_error(parent_not_set_error_name,
parent_not_set_variable) do
_assert_maker_atom_persons(*args) do |maker|
yield maker
end
end
else
_assert_maker_atom_persons(*args) do |maker|
yield maker
end
end
assert_not_set_error(not_set_error_name, %w(name)) do
_assert_maker_atom_persons(feed_type, maker_readers,
feed_readers) do |maker|
yield maker
targets = chain_reader(maker, maker_readers)
targets.new_child
end
end
assert_not_set_error(not_set_error_name, %w(name)) do
_assert_maker_atom_persons(feed_type, maker_readers,
feed_readers) do |maker|
yield maker
targets = chain_reader(maker, maker_readers)
target = targets.new_child
target.uri = "http://example.com/~me/"
end
end
assert_not_set_error(not_set_error_name, %w(name)) do
_assert_maker_atom_persons(feed_type, maker_readers,
feed_readers) do |maker|
yield maker
targets = chain_reader(maker, maker_readers)
target = targets.new_child
target.email = "me@example.com"
end
end
assert_not_set_error(not_set_error_name, %w(name)) do
_assert_maker_atom_persons(feed_type, maker_readers,
feed_readers) do |maker|
yield maker
targets = chain_reader(maker, maker_readers)
target = targets.new_child
target.uri = "http://example.com/~me/"
target.email = "me@example.com"
end
end
_assert_maker_atom_persons(feed_type, maker_readers,
feed_readers) do |maker|
yield maker
targets = chain_reader(maker, maker_readers)
target = targets.new_child
target.name = "me"
end
_assert_maker_atom_persons(feed_type, maker_readers,
feed_readers) do |maker|
yield maker
targets = chain_reader(maker, maker_readers)
target = targets.new_child
target.name = "me"
target.uri = "http://example.com/~me/"
end
_assert_maker_atom_persons(feed_type, maker_readers,
feed_readers) do |maker|
yield maker
targets = chain_reader(maker, maker_readers)
target = targets.new_child
target.name = "me"
target.email = "me@example.com"
end
_assert_maker_atom_persons(feed_type, maker_readers,
feed_readers) do |maker|
yield maker
targets = chain_reader(maker, maker_readers)
target = targets.new_child
target.name = "me"
target.uri = "http://example.com/~me/"
target.email = "me@example.com"
end
_assert_maker_atom_persons(feed_type, maker_readers,
feed_readers) do |maker|
yield maker
targets = chain_reader(maker, maker_readers)
target = targets.new_child
target.name = "me"
target.uri = "http://example.com/~me/"
target.email = "me@example.com"
target = targets.new_child
target.name = "you"
target.uri = "http://example.com/~you/"
target.email = "you@example.com"
end
assert_not_set_error(not_set_error_name, %w(name)) do
_assert_maker_atom_persons(feed_type, maker_readers,
feed_readers) do |maker|
yield maker
targets = chain_reader(maker, maker_readers)
target = targets.new_child
target.name = "me"
target.uri = "http://example.com/~me/"
target.email = "me@example.com"
target = targets.new_child
end
end
end
end
def _assert_maker_atom_text_construct(feed_type, maker_readers,
feed_readers, &block)
maker_extractor = Proc.new do |target|
text = {
:type => target.type,
:content => target.content,
:xml_content => target.xml_content,
}
if text[:type] == "xhtml"
if text[:xml_content]
xml_content = text[:xml_content]
xhtml_uri = "http://www.w3.org/1999/xhtml"
unless xml_content.is_a?(RSS::XML::Element) and
["div", xhtml_uri] == [xml_content.name, xml_content.uri]
children = xml_content
children = [children] unless children.is_a?(Array)
xml_content = RSS::XML::Element.new("div", nil, xhtml_uri,
{"xmlns" => xhtml_uri},
children)
text[:xml_content] = xml_content
end
text
else
nil
end
else
text[:content] ? text : nil
end
end
feed_extractor = Proc.new do |target|
{
:type => target.type,
:content => target.content,
:xml_content => target.xhtml,
}
end
_assert_maker_atom_element(feed_type, maker_readers, feed_readers,
maker_extractor, feed_extractor,
&block)
end
def assert_maker_atom_text_construct(feed_type, maker_readers, feed_readers,
parent_not_set_error_name=nil,
parent_not_set_variable=nil,
not_set_error_name=nil)
_wrap_assertion do
not_set_error_name ||= "maker.#{maker_readers.join('.')}"
args = [feed_type, maker_readers, feed_readers]
if parent_not_set_error_name or parent_not_set_variable
assert_not_set_error(parent_not_set_error_name,
parent_not_set_variable) do
_assert_maker_atom_text_construct(*args) do |maker|
yield maker
end
end
else
_assert_maker_atom_text_construct(*args) do |maker|
yield maker
end
end
assert_not_set_error(not_set_error_name, %w(content)) do
_assert_maker_atom_text_construct(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers) {|x| x}
target.type = "text"
end
end
assert_not_set_error(not_set_error_name, %w(content)) do
_assert_maker_atom_text_construct(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers) {|x| x}
target.type = "html"
end
end
assert_not_set_error(not_set_error_name, %w(xml_content)) do
_assert_maker_atom_text_construct(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers) {|x| x}
target.type = "xhtml"
end
end
assert_not_set_error(not_set_error_name, %w(xml_content)) do
_assert_maker_atom_text_construct(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers) {|x| x}
target.type = "xhtml"
target.content = "Content"
end
end
_assert_maker_atom_text_construct(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers) {|x| x}
target.type = "text"
target.content = "Content"
end
_assert_maker_atom_text_construct(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers) {|x| x}
target.type = "html"
target.content = "<em>Content</em>"
end
_assert_maker_atom_text_construct(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers) {|x| x}
target.type = "xhtml"
target.xml_content = "text only"
end
_assert_maker_atom_text_construct(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers) {|x| x}
target.type = "xhtml"
target.xml_content = RSS::XML::Element.new("unknown")
end
end
end
def _assert_maker_atom_date_construct(feed_type, maker_readers,
feed_readers, &block)
maker_extractor = Proc.new do |target|
date = {
:content => target,
}
date[:content] ? date : nil
end
feed_extractor = Proc.new do |target|
{
:content => target.content,
}
end
_assert_maker_atom_element(feed_type, maker_readers, feed_readers,
maker_extractor, feed_extractor,
&block)
end
def assert_maker_atom_date_construct(feed_type, maker_readers, feed_readers,
parent_not_set_error_name=nil,
parent_not_set_variable=nil)
_wrap_assertion do
args = [feed_type, maker_readers, feed_readers]
if parent_not_set_error_name or parent_not_set_variable
assert_not_set_error(parent_not_set_error_name,
parent_not_set_variable) do
_assert_maker_atom_date_construct(*args) do |maker|
yield maker
end
end
else
_assert_maker_atom_date_construct(*args) do |maker|
yield maker
end
end
maker_readers = maker_readers.dup
writer = "#{maker_readers.pop}="
_assert_maker_atom_date_construct(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.__send__(writer, Time.now)
end
end
end
def _assert_maker_atom_element(feed_type, maker_readers, feed_readers,
maker_extractor, feed_extractor)
_wrap_assertion do
element = nil
feed = RSS::Maker.make("atom:#{feed_type}") do |maker|
yield maker
target = chain_reader(maker, maker_readers) {|x| x}
element = maker_extractor.call(target)
end
target = chain_reader(feed, feed_readers)
if target
actual_element = feed_extractor.call(target)
else
actual_element = nil
end
assert_equal(element, actual_element)
end
end
def _assert_maker_atom_elements(feed_type, maker_readers, feed_readers,
maker_extractor, feed_extractor,
invalid_feed_checker=nil)
_wrap_assertion do
elements = []
invalid_feed_exception = nil
feed = nil
begin
feed = RSS::Maker.make("atom:#{feed_type}") do |maker|
yield maker
targets = chain_reader(maker, maker_readers)
targets.each do |target|
element = maker_extractor.call(target)
elements << element if element
end
if invalid_feed_checker
invalid_feed_exception = invalid_feed_checker.call(targets)
end
end
rescue RSS::Error
if invalid_feed_exception.is_a?(RSS::TooMuchTagError)
assert_too_much_tag(invalid_feed_exception.tag,
invalid_feed_exception.parent) do
raise
end
else
raise
end
end
if invalid_feed_exception.nil?
actual_elements = chain_reader(feed, feed_readers) || []
actual_elements = actual_elements.collect do |target|
feed_extractor.call(target)
end
assert_equal(elements, actual_elements)
end
end
end
def assert_maker_atom_element(feed_type, maker_readers, feed_readers,
setup_target, optional_variables,
required_variable, assert_method_name,
not_set_error_name=nil,
*additional_args)
_wrap_assertion do
not_set_error_name ||= "maker.#{maker_readers.join('.')}"
0.upto(optional_variables.size) do |i|
combination(optional_variables, i).each do |names|
have = {}
names.each do |name|
have[name.intern] = true
end
have_required_variable_too =
have.merge({required_variable.intern => true})
assert_not_set_error(not_set_error_name, [required_variable]) do
__send__(assert_method_name, feed_type, maker_readers,
feed_readers, *additional_args) do |maker|
yield maker
target = chain_reader(maker, maker_readers) {|x| x}
setup_target.call(target, have)
end
end
__send__(assert_method_name, feed_type, maker_readers, feed_readers,
*additional_args) do |maker|
yield maker
target = chain_reader(maker, maker_readers) {|x| x}
setup_target.call(target, have_required_variable_too)
end
end
end
end
end
def assert_maker_atom_elements(feed_type, maker_readers, feed_readers,
setup_target, optional_variables,
required_variable, assert_method_name,
not_set_error_name=nil,
*additional_args)
_wrap_assertion do
not_set_error_name ||= "maker.#{maker_readers.join('.')}"
0.upto(optional_variables.size) do |i|
combination(optional_variables, i).each do |names|
have = {}
names.each do |name|
have[name.intern] = true
end
have_required_variable_too =
have.merge({required_variable.intern => true})
assert_not_set_error(not_set_error_name, [required_variable]) do
__send__(assert_method_name, feed_type, maker_readers,
feed_readers, *additional_args) do |maker|
yield maker
targets = chain_reader(maker, maker_readers)
setup_target.call(targets, have)
end
end
__send__(assert_method_name, feed_type, maker_readers, feed_readers,
*additional_args) do |maker|
yield maker
targets = chain_reader(maker, maker_readers)
setup_target.call(targets, have_required_variable_too)
end
__send__(assert_method_name, feed_type, maker_readers, feed_readers,
*additional_args) do |maker|
yield maker
targets = chain_reader(maker, maker_readers)
setup_target.call(targets, have_required_variable_too)
setup_target.call(targets, have_required_variable_too)
end
assert_not_set_error(not_set_error_name, [required_variable]) do
__send__(assert_method_name, feed_type, maker_readers, feed_readers,
*additional_args) do |maker|
yield maker
targets = chain_reader(maker, maker_readers)
setup_target.call(targets, have_required_variable_too)
setup_target.call(targets, have)
end
end
end
end
end
end
def _assert_maker_atom_categories(feed_type, maker_readers,
feed_readers, &block)
maker_extractor = Proc.new do |target|
category = {
:term => target.term,
:scheme => target.scheme,
:label => target.label,
}
category[:term] ? category : nil
end
feed_extractor = Proc.new do |target|
{
:term => target.term,
:scheme => target.scheme,
:label => target.label,
}
end
_assert_maker_atom_elements(feed_type, maker_readers, feed_readers,
maker_extractor, feed_extractor, &block)
end
def assert_maker_atom_categories(feed_type, maker_readers, feed_readers,
not_set_error_name=nil, &block)
_wrap_assertion do
_assert_maker_atom_categories(feed_type, maker_readers,
feed_readers) do |maker|
yield maker
end
setup_target = Proc.new do |targets, have|
target = targets.new_child
target.term = "music" if have[:term]
target.scheme = "http://example.com/category/music" if have[:scheme]
target.label = "Music" if have[:label]
end
optional_variables = %w(scheme label)
assert_maker_atom_elements(feed_type, maker_readers, feed_readers,
setup_target, optional_variables,
"term", :_assert_maker_atom_categories,
not_set_error_name, &block)
end
end
def _assert_maker_atom_generator(feed_type, maker_readers,
feed_readers, &block)
maker_extractor = Proc.new do |target|
generator = {
:uri => target.uri,
:version => target.version,
:content => target.content,
}
generator[:content] ? generator : nil
end
feed_extractor = Proc.new do |target|
{
:uri => target.uri,
:version => target.version,
:content => target.content,
}
end
_assert_maker_atom_element(feed_type, maker_readers, feed_readers,
maker_extractor, feed_extractor,
&block)
end
def assert_maker_atom_generator(feed_type, maker_readers, feed_readers,
not_set_error_name=nil, &block)
_wrap_assertion do
not_set_error_name ||= "maker.#{maker_readers.join('.')}"
_assert_maker_atom_generator(feed_type, maker_readers,
feed_readers) do |maker|
yield maker
end
setup_target = Proc.new do |target, have|
target.content = "RSS Maker" if have[:content]
target.uri = "http://example.com/rss/maker" if have[:uri]
target.version = "0.0.1" if have[:version]
end
optional_variables = %w(uri version)
assert_maker_atom_element(feed_type, maker_readers, feed_readers,
setup_target, optional_variables,
"content", :_assert_maker_atom_generator,
not_set_error_name, &block)
end
end
def _assert_maker_atom_icon(feed_type, maker_readers, feed_readers,
accessor_base, &block)
maker_extractor = Proc.new do |target|
icon = {
:content => target.__send__(accessor_base),
}
icon[:content] ? icon : nil
end
feed_extractor = Proc.new do |target|
{
:content => target.content,
}
end
_assert_maker_atom_element(feed_type, maker_readers, feed_readers,
maker_extractor, feed_extractor,
&block)
end
def assert_maker_atom_icon(feed_type, maker_readers, feed_readers,
accessor_base=nil, not_set_error_name=nil)
_wrap_assertion do
accessor_base ||= "url"
not_set_error_name ||= "maker.#{maker_readers.join('.')}"
_assert_maker_atom_icon(feed_type, maker_readers, feed_readers,
accessor_base) do |maker|
yield maker
end
_assert_maker_atom_icon(feed_type, maker_readers, feed_readers,
accessor_base) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.__send__("#{accessor_base}=", "http://example.com/icon.png")
end
end
end
def _assert_maker_atom_links(feed_type, maker_readers, feed_readers,
allow_duplication=false, &block)
maker_extractor = Proc.new do |target|
link = {
:href => target.href,
:rel => target.rel,
:type => target.type,
:hreflang => target.hreflang,
:title => target.title,
:length => target.length,
}
link[:href] ? link : nil
end
feed_extractor = Proc.new do |target|
{
:href => target.href,
:rel => target.rel,
:type => target.type,
:hreflang => target.hreflang,
:title => target.title,
:length => target.length,
}
end
if feed_readers.first == "entries"
parent = "entry"
else
parent = feed_type
end
invalid_feed_checker = Proc.new do |targets|
infos = {}
invalid_exception = nil
targets.each do |target|
key = [target.hreflang, target.type]
if infos.has_key?(key)
invalid_exception = RSS::TooMuchTagError.new("link", parent)
break
end
infos[key] = true if target.rel.nil? or target.rel == "alternate"
end
invalid_exception
end
invalid_feed_checker = nil if allow_duplication
_assert_maker_atom_elements(feed_type, maker_readers, feed_readers,
maker_extractor, feed_extractor,
invalid_feed_checker,
&block)
end
def assert_maker_atom_links(feed_type, maker_readers, feed_readers,
not_set_error_name=nil, allow_duplication=false,
&block)
_wrap_assertion do
_assert_maker_atom_links(feed_type, maker_readers,
feed_readers) do |maker|
yield maker
end
langs = %(ja en fr zh po)
setup_target = Proc.new do |targets, have|
target = targets.new_child
lang = langs[targets.size % langs.size]
target.href = "http://example.com/index.html.#{lang}" if have[:href]
target.rel = "alternate" if have[:rel]
target.type = "text/xhtml" if have[:type]
target.hreflang = lang if have[:hreflang]
target.title = "FrontPage(#{lang})" if have[:title]
target.length = 1024 if have[:length]
end
optional_variables = %w(rel type hreflang title length)
assert_maker_atom_elements(feed_type, maker_readers, feed_readers,
setup_target, optional_variables,
"href", :_assert_maker_atom_links,
not_set_error_name, allow_duplication,
&block)
end
end
def _assert_maker_atom_logo(feed_type, maker_readers, feed_readers,
accessor_base, &block)
maker_extractor = Proc.new do |target|
logo = {
:uri => target.__send__(accessor_base),
}
logo[:uri] ? logo : nil
end
feed_extractor = Proc.new do |target|
{
:uri => target.content,
}
end
_assert_maker_atom_element(feed_type, maker_readers, feed_readers,
maker_extractor, feed_extractor,
&block)
end
def assert_maker_atom_logo(feed_type, maker_readers, feed_readers,
accessor_base=nil, not_set_error_name=nil)
_wrap_assertion do
accessor_base ||= "uri"
not_set_error_name ||= "maker.#{maker_readers.join('.')}"
_assert_maker_atom_logo(feed_type, maker_readers, feed_readers,
accessor_base) do |maker|
yield maker
end
_assert_maker_atom_logo(feed_type, maker_readers, feed_readers,
accessor_base) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.__send__("#{accessor_base}=", "http://example.com/logo.png")
end
end
end
def _assert_maker_atom_id(feed_type, maker_readers, feed_readers, &block)
maker_extractor = Proc.new do |target|
id = {
:uri => target.id,
}
id[:uri] ? id : nil
end
feed_extractor = Proc.new do |target|
if target.id
{
:uri => target.id.content,
}
else
nil
end
end
_assert_maker_atom_element(feed_type, maker_readers, feed_readers,
maker_extractor, feed_extractor,
&block)
end
def assert_maker_atom_id(feed_type, maker_readers, feed_readers,
not_set_error_name=nil)
_wrap_assertion do
not_set_error_name ||= "maker.#{maker_readers.join('.')}"
args = [feed_type, maker_readers, feed_readers]
_assert_maker_atom_id(*args) do |maker|
yield maker
end
_assert_maker_atom_id(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.id = "http://example.com/id/1"
end
end
end
def _assert_maker_atom_content(feed_type, maker_readers,
feed_readers, &block)
maker_extractor = Proc.new do |target|
content = {
:type => target.type,
:src => target.src,
:content => target.content,
:xml => target.xml,
:inline_text => target.inline_text?,
:inline_html => target.inline_html?,
:inline_xhtml => target.inline_xhtml?,
:inline_other => target.inline_other?,
:inline_other_text => target.inline_other_text?,
:inline_other_xml => target.inline_other_xml?,
:inline_other_base64 => target.inline_other_base64?,
:out_of_line => target.out_of_line?,
}
content[:src] = nil if content[:src] and content[:content]
if content[:type] or content[:content]
content
else
nil
end
end
feed_extractor = Proc.new do |target|
{
:type => target.type,
:src => target.src,
:content => target.content,
:xml => target.xml,
:inline_text => target.inline_text?,
:inline_html => target.inline_html?,
:inline_xhtml => target.inline_xhtml?,
:inline_other => target.inline_other?,
:inline_other_text => target.inline_other_text?,
:inline_other_xml => target.inline_other_xml?,
:inline_other_base64 => target.inline_other_base64?,
:out_of_line => target.out_of_line?,
}
end
_assert_maker_atom_element(feed_type, maker_readers, feed_readers,
maker_extractor, feed_extractor,
&block)
end
def assert_maker_atom_content(feed_type, maker_readers, feed_readers,
not_set_error_name=nil, &block)
_wrap_assertion do
not_set_error_name ||= "maker.#{maker_readers.join('.')}"
args = [feed_type, maker_readers, feed_readers, not_set_error_name]
assert_maker_atom_content_inline_text(*args, &block)
assert_maker_atom_content_inline_xhtml(*args, &block)
assert_maker_atom_content_inline_other(*args, &block)
assert_maker_atom_content_out_of_line(*args, &block)
end
end
def assert_maker_atom_content_inline_text(feed_type, maker_readers,
feed_readers, not_set_error_name)
_wrap_assertion do
args = [feed_type, maker_readers, feed_readers]
_assert_maker_atom_content(*args) do |maker|
yield maker
end
assert_not_set_error(not_set_error_name, %w(content)) do
RSS::Maker.make("atom:#{feed_type}") do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "text"
end
end
assert_not_set_error(not_set_error_name, %w(content)) do
RSS::Maker.make("atom:#{feed_type}") do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "html"
end
end
_assert_maker_atom_content(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.content = ""
end
_assert_maker_atom_content(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "text"
target.content = "example content"
end
_assert_maker_atom_content(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "html"
target.content = "<em>text</em>"
end
end
end
def assert_maker_atom_content_inline_xhtml(feed_type, maker_readers,
feed_readers, not_set_error_name)
_wrap_assertion do
args = [feed_type, maker_readers, feed_readers]
assert_not_set_error(not_set_error_name, %w(xml_content)) do
RSS::Maker.make("atom:#{feed_type}") do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "xhtml"
end
end
assert_not_set_error(not_set_error_name, %w(xml_content)) do
RSS::Maker.make("atom:#{feed_type}") do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "xhtml"
target.content = "dummy"
end
end
_assert_maker_atom_content(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "xhtml"
target.xml_content = "text"
end
_assert_maker_atom_content(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "xhtml"
target.xml = "text"
end
_assert_maker_atom_content(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "xhtml"
target.xml_content =
RSS::XML::Element.new("em", nil, nil, {}, ["text"])
end
_assert_maker_atom_content(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "xhtml"
target.xml = RSS::XML::Element.new("em", nil, nil, {}, ["text"])
end
xhtml_uri = "http://www.w3.org/1999/xhtml"
em = RSS::XML::Element.new("em", nil, nil, {}, ["text"])
em_with_xhtml_uri =
RSS::XML::Element.new("em", nil, xhtml_uri, {}, ["text"])
feed = RSS::Maker.make("atom:#{feed_type}") do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "xhtml"
target.xml = em
end
assert_equal(RSS::XML::Element.new("div", nil, xhtml_uri,
{"xmlns" => xhtml_uri},
[em_with_xhtml_uri]),
chain_reader(feed, feed_readers).xml)
div = RSS::XML::Element.new("div", nil, xhtml_uri,
{"xmlns" => xhtml_uri,
"class" => "sample"},
["text"])
feed = RSS::Maker.make("atom:#{feed_type}") do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "xhtml"
target.xml = div
end
assert_equal(div, chain_reader(feed, feed_readers).xml)
end
end
def assert_maker_atom_content_inline_other(*args, &block)
_wrap_assertion do
assert_maker_atom_content_inline_other_xml(*args, &block)
assert_maker_atom_content_inline_other_text(*args, &block)
assert_maker_atom_content_inline_other_base64(*args, &block)
end
end
def assert_maker_atom_content_inline_other_xml(feed_type, maker_readers,
feed_readers,
not_set_error_name)
_wrap_assertion do
args = [feed_type, maker_readers, feed_readers]
assert_not_set_error(not_set_error_name, %w(xml_content)) do
RSS::Maker.make("atom:#{feed_type}") do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "application/xml"
end
end
assert_not_set_error(not_set_error_name, %w(xml_content)) do
RSS::Maker.make("atom:#{feed_type}") do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "svg/image+xml"
end
end
svg_uri = "http://www.w3.org/2000/svg"
rect = RSS::XML::Element.new("rect", nil, svg_uri,
{"x" => "0.5cm",
"y" => "0.5cm",
"width" => "2cm",
"height" => "1cm"})
svg = RSS::XML::Element.new("svg", nil, svg_uri,
{"xmlns" => svg_uri,
"version" => "1.1",
"width" => "5cm",
"height" => "4cm"},
[rect])
_assert_maker_atom_content(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "image/svg+xml"
target.xml = svg
end
feed = RSS::Maker.make("atom:#{feed_type}") do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "image/svg+xml"
target.xml = svg
end
assert_equal(svg, chain_reader(feed, feed_readers).xml)
end
end
def assert_maker_atom_content_inline_other_text(feed_type, maker_readers,
feed_readers,
not_set_error_name)
_wrap_assertion do
args = [feed_type, maker_readers, feed_readers]
assert_not_set_error(not_set_error_name, %w(content)) do
RSS::Maker.make("atom:#{feed_type}") do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "text/plain"
end
end
_assert_maker_atom_content(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "text/plain"
target.content = "text"
end
end
end
def assert_maker_atom_content_inline_other_base64(feed_type, maker_readers,
feed_readers,
not_set_error_name)
_wrap_assertion do
args = [feed_type, maker_readers, feed_readers]
content = "\211PNG\r\n\032\n"
_assert_maker_atom_content(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "image/png"
target.content = content
end
_assert_maker_atom_content(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "image/png"
target.src = "http://example.com/logo.png"
target.content = content
end
feed = RSS::Maker.make("atom:#{feed_type}") do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "image/png"
target.src = "http://example.com/logo.png"
target.content = content
end
target = chain_reader(feed, feed_readers)
assert_nil(target.src)
assert_equal(content, target.content)
end
end
def assert_maker_atom_content_out_of_line(feed_type, maker_readers,
feed_readers, not_set_error_name)
_wrap_assertion do
args = [feed_type, maker_readers, feed_readers]
assert_not_set_error(not_set_error_name, %w(content)) do
RSS::Maker.make("atom:#{feed_type}") do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "image/png"
end
end
assert_not_set_error(not_set_error_name, %w(type)) do
RSS::Maker.make("atom:#{feed_type}") do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.src = "http://example.com/logo.png"
end
end
_assert_maker_atom_content(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "image/png"
target.src = "http://example.com/logo.png"
end
_assert_maker_atom_content(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "image/png"
target.content = "\211PNG\r\n\032\n"
end
_assert_maker_atom_content(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "application/xml"
target.src = "http://example.com/sample.xml"
end
_assert_maker_atom_content(*args) do |maker|
yield maker
target = chain_reader(maker, maker_readers)
target.type = "text/plain"
target.src = "http://example.com/README.txt"
end
end
end
def assert_slash_elements(expected, target)
assert_equal(expected,
{
"section" => target.slash_section,
"department" => target.slash_department,
"comments" => target.slash_comments,
"hit_parades" => target.slash_hit_parades,
})
assert_equal(expected["hit_parades"].join(","),
target.slash_hit_parade)
end
def chain_reader(target, readers, &block)
readers.inject(target) do |result, reader|
return nil if result.nil?
result.__send__(reader, &block)
end
end
def normalized_attrs(attrs)
n_attrs = {}
attrs.each do |name, value|
n_attrs[name.to_s] = value
end
n_attrs
end
def combination(elements, n)
if n <= 0 or elements.size < n
[]
elsif n == 1
elements.collect {|element| [element]}
else
first, *rest = elements
combination(rest, n - 1).collect do |sub_elements|
[first, *sub_elements]
end + combination(rest, n)
end
end
def tag(name, content=nil, attributes={})
attributes = attributes.collect do |key, value|
"#{ERB::Util.h(key)}=\"#{ERB::Util.h(value)}\""
end.join(" ")
begin_tag = "<#{name}"
begin_tag << " #{attributes}" unless attributes.empty?
if content
"#{begin_tag}>#{content}</#{name}>\n"
else
"#{begin_tag}/>\n"
end
end
end
end