[前][次][番号順一覧][スレッド一覧][生データ]

yarv-diff:259

From: ko1 atdot.net
Date: 15 Feb 2006 10:51:10 -0000
Subject: [yarv-diff:259] r422 - in trunk: . test test/rss

Author: aamine
Date: 2006-02-15 19:51:10 +0900 (Wed, 15 Feb 2006)
New Revision: 422

Added:
   trunk/test/rss/
   trunk/test/rss/rss-assertions.rb
   trunk/test/rss/rss-testcase.rb
   trunk/test/rss/test_1.0.rb
   trunk/test/rss/test_2.0.rb
   trunk/test/rss/test_accessor.rb
   trunk/test/rss/test_content.rb
   trunk/test/rss/test_dublincore.rb
   trunk/test/rss/test_image.rb
   trunk/test/rss/test_inherit.rb
   trunk/test/rss/test_maker_0.9.rb
   trunk/test/rss/test_maker_1.0.rb
   trunk/test/rss/test_maker_2.0.rb
   trunk/test/rss/test_maker_content.rb
   trunk/test/rss/test_maker_dc.rb
   trunk/test/rss/test_maker_image.rb
   trunk/test/rss/test_maker_sy.rb
   trunk/test/rss/test_maker_taxo.rb
   trunk/test/rss/test_maker_trackback.rb
   trunk/test/rss/test_maker_xml-stylesheet.rb
   trunk/test/rss/test_parser.rb
   trunk/test/rss/test_setup_maker_0.9.rb
   trunk/test/rss/test_setup_maker_1.0.rb
   trunk/test/rss/test_setup_maker_2.0.rb
   trunk/test/rss/test_syndication.rb
   trunk/test/rss/test_taxonomy.rb
   trunk/test/rss/test_to_s.rb
   trunk/test/rss/test_trackback.rb
   trunk/test/rss/test_version.rb
   trunk/test/rss/test_xml-stylesheet.rb
Modified:
   trunk/ChangeLog
Log:
* test/rss: imported from Ruby CVS trunk HEAD.


Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-02-15 08:51:05 UTC (rev 421)
+++ trunk/ChangeLog	2006-02-15 10:51:10 UTC (rev 422)
@@ -4,6 +4,11 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2006-02-15(Wed) 19:48:59 +0900  Minero Aoki  <aamine loveruby.net>
+
+	* test/rss: imported from Ruby CVS trunk HEAD.
+
+
 2006-02-15(Wed) 17:39:16 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* eval_intern.h : 

Added: trunk/test/rss/rss-assertions.rb
===================================================================
--- trunk/test/rss/rss-assertions.rb	2006-02-15 08:51:05 UTC (rev 421)
+++ trunk/test/rss/rss-assertions.rb	2006-02-15 10:51:10 UTC (rev 422)
@@ -0,0 +1,505 @@
+module Test
+  module Unit
+    module Assertions
+      # For backward compatibility
+      unless instance_methods.include?("assert_raise")
+        def assert_raise(*args, &block)
+          assert_raises(*args, &block)
+        end
+      end
+    end
+  end
+end
+
+module RSS
+  module Assertions
+    
+    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_excepted_tag(tag, parent)
+      _wrap_assertion do
+        begin
+          yield
+          flunk("Not raise NotExceptedTagError")
+        rescue ::RSS::NotExceptedTagError => e
+          assert_equal(tag, e.tag)
+          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_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
+        rss ||= ::RSS::RDF.new()
+        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_channel10(attrs, channel)
+      _wrap_assertion do
+        n_attrs = normalized_attrs(attrs)
+        
+        names = %w(about title link description)
+        assert_attributes(attrs, names, channel)
+
+        %w(image items textinput).each do |name|
+          value = n_attrs[name]
+          if value
+            target = channel.__send__(name)
+            __send__("assert_channel10_#{name}", value, target)
+          end
+        end
+      end
+    end
+
+    def assert_channel10_image(attrs, image)
+      _wrap_assertion do
+        assert_attributes(attrs, %w(resource), image)
+      end
+    end
+    
+    def assert_channel10_textinput(attrs, textinput)
+      _wrap_assertion do
+        assert_attributes(attrs, %w(resource), textinput)
+      end
+    end
+
+    def assert_channel10_items(attrs, items)
+      _wrap_assertion do
+        assert_equal(items.resources, items.Seq.lis.collect {|x| x.resource})
+        items.Seq.lis.each_with_index do |li, i|
+          assert_attributes(attrs[i], %w(resource), li)
+        end
+      end
+    end
+
+    def assert_image10(attrs, image)
+      _wrap_assertion do
+        names = %w(about title url link)
+        assert_attributes(attrs, names, image)
+      end
+    end
+
+    def assert_items10(attrs, items)
+      _wrap_assertion do
+        names = %w(about title link description)
+        items.each_with_index do |item, i|
+          assert_attributes(attrs[i], names, item)
+        end
+      end
+    end
+
+    def assert_textinput10(attrs, textinput)
+      _wrap_assertion do
+        names = %w(about title description name link)
+        assert_attributes(attrs, names, textinput)
+      end
+    end
+
+
+    def assert_channel09(attrs, channel)
+      _wrap_assertion do
+        n_attrs = normalized_attrs(attrs)
+
+        names = %w(title description link language rating
+                   copyright pubDate lastBuildDate docs
+                   managingEditor webMaster)
+        assert_attributes(attrs, names, channel)
+        
+        %w(skipHours skipDays).each do |name|
+          value = n_attrs[name]
+          if value
+            target = channel.__send__(name)
+            __send__("assert_channel09_#{name}", value, target)
+          end
+        end
+      end
+    end
+
+    def assert_channel09_skipDays(contents, skipDays)
+      _wrap_assertion do
+        days = skipDays.days
+        contents.each_with_index do |content, i|
+          assert_equal(content, days[i].content)
+        end
+      end
+    end
+    
+    def assert_channel09_skipHours(contents, skipHours)
+      _wrap_assertion do
+        hours = skipHours.hours
+        contents.each_with_index do |content, i|
+          assert_equal(content.to_i, hours[i].content)
+        end
+      end
+    end
+    
+    def assert_image09(attrs, image)
+      _wrap_assertion do
+        names = %w(url link title description)
+        names << ["width", :integer]
+        names << ["height", :integer]
+        assert_attributes(attrs, names, image)
+      end
+    end
+
+    def assert_items09(attrs, items)
+      _wrap_assertion do
+        names = %w(title link description)
+        items.each_with_index do |item, i|
+          assert_attributes(attrs[i], names, item)
+        end
+      end
+    end
+    
+    def assert_textinput09(attrs, textinput)
+      _wrap_assertion do
+        names = %w(title description name link)
+        assert_attributes(attrs, names, textinput)
+      end
+    end
+
+
+    def assert_channel20(attrs, channel)
+      _wrap_assertion do
+        n_attrs = normalized_attrs(attrs)
+        
+        names = %w(title link description language copyright
+                   managingEditor webMaster pubDate
+                   lastBuildDate generator docs rating)
+        names << ["ttl", :integer]
+        assert_attributes(attrs, names, channel)
+
+        %w(cloud categories skipHours skipDays).each do |name|
+          value = n_attrs[name]
+          if value
+            target = channel.__send__(name)
+            __send__("assert_channel20_#{name}", value, target)
+          end
+        end
+      end
+    end
+
+    def assert_channel20_skipDays(contents, skipDays)
+      assert_channel09_skipDays(contents, skipDays)
+    end
+    
+    def assert_channel20_skipHours(contents, skipHours)
+      assert_channel09_skipHours(contents, skipHours)
+    end
+    
+    def assert_channel20_cloud(attrs, cloud)
+      _wrap_assertion do
+        names = %w(domain path registerProcedure protocol)
+        names << ["port", :integer]
+        assert_attributes(attrs, names, cloud)
+      end
+    end
+    
+    def assert_channel20_categories(attrs, categories)
+      _wrap_assertion do
+        names = %w(domain content)
+        categories.each_with_index do |category, i|
+          assert_attributes(attrs[i], names, category)
+        end
+      end
+    end
+    
+    def assert_image20(attrs, image)
+      _wrap_assertion do
+        names = %w(url link title description)
+        names << ["width", :integer]
+        names << ["height", :integer]
+        assert_attributes(attrs, names, image)
+      end
+    end
+
+    def assert_items20(attrs, items)
+      _wrap_assertion do
+        names = %w(about title link description)
+        items.each_with_index do |item, i|
+          assert_attributes(attrs[i], names, item)
+
+          n_attrs = normalized_attrs(attrs[i])
+
+          %w(source enclosure categories guid).each do |name|
+            value = n_attrs[name]
+            if value
+              target = item.__send__(name)
+              __send__("assert_items20_#{name}", value, target)
+            end
+          end
+        end
+      end
+    end
+
+    def assert_items20_source(attrs, source)
+      _wrap_assertion do
+        assert_attributes(attrs, %w(url content), source)
+      end
+    end
+    
+    def assert_items20_enclosure(attrs, enclosure)
+      _wrap_assertion do
+        names = ["url", ["length", :integer], "type"]
+        assert_attributes(attrs, names, enclosure)
+      end
+    end
+    
+    def assert_items20_categories(attrs, categories)
+      _wrap_assertion do
+        assert_channel20_categories(attrs, categories)
+      end
+    end
+    
+    def assert_items20_guid(attrs, guid)
+      _wrap_assertion do
+        names = [["isPermaLink", :boolean], ["content"]]
+        assert_attributes(attrs, names, guid)
+      end
+    end
+
+    def assert_textinput20(attrs, textinput)
+      _wrap_assertion do
+        names = %w(title description name link)
+        assert_attributes(attrs, names, textinput)
+      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 normalized_attrs(attrs)
+      n_attrs = {}
+      attrs.each do |name, value|
+        n_attrs[name.to_s] = value
+      end
+      n_attrs
+    end
+    
+  end
+end

Added: trunk/test/rss/rss-testcase.rb
===================================================================
--- trunk/test/rss/rss-testcase.rb	2006-02-15 08:51:05 UTC (rev 421)
+++ trunk/test/rss/rss-testcase.rb	2006-02-15 10:51:10 UTC (rev 422)
@@ -0,0 +1,271 @@
+require "erb"
+
+require "test/unit"
+require 'rss-assertions'
+
+module RSS
+  class TestCase < Test::Unit::TestCase
+    include ERB::Util
+
+    include RSS
+    include Assertions
+
+    XMLDECL_VERSION = "1.0"
+    XMLDECL_ENCODING = "UTF-8"
+    XMLDECL_STANDALONE = "no"
+
+    RDF_ABOUT = "http://www.xml.com/xml/news.rss"
+    RDF_RESOURCE = "http://xml.com/universal/images/xml_tiny.gif"
+    TITLE_VALUE = "XML.com"
+    LINK_VALUE = "http://xml.com/pub"
+    URL_VALUE = "http://xml.com/universal/images/xml_tiny.gif"
+    NAME_VALUE = "hogehoge"
+    LANGUAGE_VALUE = "ja"
+    DESCRIPTION_VALUE = "
+    XML.com features a rich mix of information and services 
+    for the XML community.
+    "
+    RESOURCES = [
+      "http://xml.com/pub/2000/08/09/xslt/xslt.html",
+      "http://xml.com/pub/2000/08/09/rdfdb/index.html",
+    ]
+
+    CLOUD_DOMAIN = "data.ourfavoritesongs.com"
+    CLOUD_PORT = "80"
+    CLOUD_PATH = "/RPC2"
+    CLOUD_REGISTER_PROCEDURE = "ourFavoriteSongs.rssPleaseNotify"
+    CLOUD_PROTOCOL = "xml-rpc"
+    
+    ENCLOSURE_URL = "http://www.scripting.com/mp3s/weatherReportSuite.mp3"
+    ENCLOSURE_LENGTH = "12216320"
+    ENCLOSURE_TYPE = "audio/mpeg"
+    
+    CATEGORY_DOMAIN = "http://www.superopendirectory.com/"
+
+    def default_test
+      # This class isn't tested
+    end
+
+    private
+    def make_xmldecl(v=XMLDECL_VERSION, e=XMLDECL_ENCODING, s=XMLDECL_STANDALONE)
+      rv = "<?xml version='#{v}'"
+      rv << " encoding='#{e}'" if e
+      rv << " standalone='#{s}'" if s
+      rv << "?>"
+      rv
+    end
+
+    def make_RDF(content=nil, xmlns=[])
+      <<-EORSS
+#{make_xmldecl}
+<rdf:RDF xmlns="#{URI}" xmlns:rdf="#{RDF::URI}"
+#{xmlns.collect {|pre, uri| "xmlns:#{pre}='#{uri}'"}.join(' ')}>
+#{block_given? ? yield : content}
+</rdf:RDF>
+EORSS
+    end
+
+    def make_channel(content=nil)
+      <<-EOC
+<channel rdf:about="#{RDF_ABOUT}">
+  <title>#{TITLE_VALUE}</title>
+  <link>#{LINK_VALUE}</link>
+  <description>#{DESCRIPTION_VALUE}</description>
+
+  <image rdf:resource="#{RDF_RESOURCE}" />
+
+  <items>
+    <rdf:Seq>
+#{RESOURCES.collect do |res| '<rdf:li resource="' + res + '" />' end.join("\n")}
+    </rdf:Seq>
+  </items>
+
+  <textinput rdf:resource="#{RDF_RESOURCE}" />
+
+#{block_given? ? yield : content}
+</channel>
+EOC
+    end
+
+    def make_image(content=nil)
+      <<-EOI
+<image rdf:about="#{RDF_ABOUT}">
+  <title>#{TITLE_VALUE}</title>
+  <url>#{URL_VALUE}</url>
+  <link>#{LINK_VALUE}</link>
+#{block_given? ? yield : content}
+</image>
+EOI
+    end
+
+    def make_item(content=nil)
+      <<-EOI
+<item rdf:about="#{RDF_ABOUT}">
+  <title>#{TITLE_VALUE}</title>
+  <link>#{LINK_VALUE}</link>
+  <description>#{DESCRIPTION_VALUE}</description>
+#{block_given? ? yield : content}
+</item>
+EOI
+    end
+
+    def make_textinput(content=nil)
+      <<-EOT
+<textinput rdf:about="#{RDF_ABOUT}">
+  <title>#{TITLE_VALUE}</title>
+  <description>#{DESCRIPTION_VALUE}</description>
+  <name>#{NAME_VALUE}</name>
+  <link>#{LINK_VALUE}</link>
+#{block_given? ? yield : content}
+</textinput>
+EOT
+    end
+
+    def make_sample_RDF
+      make_RDF(<<-EOR)
+#{make_channel}
+#{make_image}
+#{make_item}
+#{make_textinput}
+EOR
+    end
+
+    def make_rss20(content=nil, xmlns=[])
+      <<-EORSS
+#{make_xmldecl}
+<rss version="2.0"
+#{xmlns.collect {|pre, uri| "xmlns:#{pre}='#{uri}'"}.join(' ')}>
+#{block_given? ? yield : content}
+</rss>
+EORSS
+    end
+
+    def make_channel20(content=nil)
+      <<-EOC
+<channel>
+  <title>#{TITLE_VALUE}</title>
+  <link>#{LINK_VALUE}</link>
+  <description>#{DESCRIPTION_VALUE}</description>
+  <language>#{LANGUAGE_VALUE}</language>
+
+  <image>
+    <url>#{RDF_RESOURCE}</url>
+    <title>#{TITLE_VALUE}</title>
+    <link>#{LINK_VALUE}</link>
+  </image>
+
+#{RESOURCES.collect do |res| '<item><link>' + res + '</link></item>' end.join("\n")}
+
+  <textInput>
+    <title>#{TITLE_VALUE}</title>
+    <description>#{DESCRIPTION_VALUE}</description>
+    <name>#{NAME_VALUE}</name>
+    <link>#{RDF_RESOURCE}</link>
+  </textInput>
+
+#{block_given? ? yield : content}
+</channel>
+EOC
+    end
+
+    def make_item20(content=nil)
+      <<-EOI
+<item>
+  <title>#{TITLE_VALUE}</title>
+  <link>#{LINK_VALUE}</link>
+  <description>#{DESCRIPTION_VALUE}</description>
+#{block_given? ? yield : content}
+</item>
+EOI
+    end
+
+    def make_cloud20
+      <<-EOC
+<cloud
+  domain="#{CLOUD_DOMAIN}"
+  port="#{CLOUD_PORT}"
+  path="#{CLOUD_PATH}"
+  registerProcedure="#{CLOUD_REGISTER_PROCEDURE}"
+  protocol="#{CLOUD_PROTOCOL}" />
+EOC
+    end
+
+    def make_element(elem_name, attrs, contents)
+      attrs_str = attrs.collect do |name, value|
+        "#{h name}='#{h value}'"
+      end.join(" ")
+      contents_str = contents.collect do |name, value|
+        "#{Element::INDENT}<#{h name}>#{h value}</#{h name}>"
+      end.join("\n")
+
+      "<#{h elem_name} #{attrs_str}>\n#{contents_str}\n</#{h elem_name}>"
+    end
+    
+    private
+    def setup_dummy_channel(maker)
+      about = "http://hoge.com"
+      title = "fugafuga"
+      link = "http://hoge.com"
+      description = "fugafugafugafuga"
+      language = "ja"
+
+      maker.channel.about = about
+      maker.channel.title = title
+      maker.channel.link = link
+      maker.channel.description = description
+      maker.channel.language = language
+    end
+
+    def setup_dummy_image(maker)
+      title = "fugafuga"
+      link = "http://hoge.com"
+      url = "http://hoge.com/hoge.png"
+
+      maker.channel.link = link if maker.channel.link.nil?
+      
+      maker.image.title = title
+      maker.image.url = url
+    end
+
+    def setup_dummy_textinput(maker)
+      title = "fugafuga"
+      description = "text hoge fuga"
+      name = "hoge"
+      link = "http://hoge.com/search.cgi"
+
+      maker.textinput.title = title
+      maker.textinput.description = description
+      maker.textinput.name = name
+      maker.textinput.link = link
+    end
+
+    def setup_dummy_item(maker)
+      title = "TITLE"
+      link = "http://hoge.com/"
+
+      item = maker.items.new_item
+      item.title = title
+      item.link = link
+    end
+    
+    def setup_taxo_topic(target, topics)
+      topics.each do |topic|
+        taxo_topic = target.taxo_topics.new_taxo_topic
+        topic.each do |name, value|
+          case name
+          when :link
+            taxo_topic.taxo_link = value
+          when :topics
+            value.each do |t|
+              taxo_topic.taxo_topics << t
+            end
+          else
+            dc_elems = taxo_topic.__send__("dc_#{name}s")
+            dc_elem = dc_elems.__send__("new_#{name}")
+            dc_elem.value = value
+          end
+        end
+      end
+    end
+  end
+end

Added: trunk/test/rss/test_1.0.rb
===================================================================
--- trunk/test/rss/test_1.0.rb	2006-02-15 08:51:05 UTC (rev 421)
+++ trunk/test/rss/test_1.0.rb	2006-02-15 10:51:10 UTC (rev 422)
@@ -0,0 +1,247 @@
+require "rexml/document"
+
+require "rss-testcase"
+
+require "rss/1.0"
+
+module RSS
+  class TestRSS10Core < TestCase
+    
+    def setup
+      @rdf_prefix = "rdf"
+      @rdf_uri = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+      @uri = "http://purl.org/rss/1.0/"
+    end
+    
+    def test_RDF
+      version = "1.0"
+      encoding = "UTF-8"
+      standalone = false
+      
+      rdf = RDF.new(version, encoding, standalone)
+      
+      doc = REXML::Document.new(rdf.to_s(false))
+      
+      xmldecl = doc.xml_decl
+      
+      %w(version encoding).each do |x|
+        assert_equal(instance_eval(x), xmldecl.__send__(x))
+      end
+      assert_equal(standalone, !xmldecl.standalone.nil?)
+      
+      assert_equal(@rdf_uri, doc.root.namespace)
+    end
+    
+    def test_not_displayed_xml_stylesheets
+      rdf = RDF.new()
+      plain_rdf = rdf.to_s
+      3.times do
+        rdf.xml_stylesheets.push(XMLStyleSheet.new)
+        assert_equal(plain_rdf, rdf.to_s)
+      end
+    end
+    
+    def test_xml_stylesheets
+      [
+        [{:href => "a.xsl", :type => "text/xsl"}],
+        [
+          {:href => "a.xsl", :type => "text/xsl"},
+          {:href => "a.css", :type => "text/css"},
+        ],
+      ].each do |attrs_ary|
+        assert_xml_stylesheet_pis(attrs_ary)
+      end
+    end
+    
+    def test_channel
+      about = "http://hoge.com"
+      title = "fugafuga"
+      link = "http://hoge.com"
+      description = "fugafugafugafuga"
+      resource = "http://hoge.com/hoge.png"
+      image = RDF::Channel::Image.new(resource)
+      items = RDF::Channel::Items.new
+      textinput = RDF::Channel::Textinput.new(resource)
+      
+      channel = RDF::Channel.new(about)
+      %w(title link description image items textinput).each do |x|
+        channel.__send__("#{x}=", instance_eval(x))
+      end
+      
+      doc = REXML::Document.new(make_RDF(channel.to_s))
+      c = doc.root.elements[1]
+      
+      assert_equal(about, c.attributes["about"])
+      %w(title link description image textinput).each do |x|
+        elem = c.elements[x]
+        assert_equal(x, elem.name)
+        assert_equal(@uri, elem.namespace)
+        if x == "image" or x == "textinput"
+          excepted = resource
+          res = elem.attributes.get_attribute("resource")
+          assert_equal(@rdf_uri, res.namespace)
+          value = res.value
+        else
+          excepted = instance_eval(x)
+          value = elem.text
+        end
+        assert_equal(excepted, value)
+      end
+      assert_equal(@uri, c.elements["items"].namespace)
+      assert_equal("items", c.elements["items"].name)
+    end
+    
+    def test_channel_image
+      resource = "http://hoge.com/hoge.png"
+      image = RDF::Channel::Image.new(resource)
+      
+      doc = REXML::Document.new(make_RDF(image.to_s))
+      i = doc.root.elements[1]
+      
+      assert_equal("image", i.name)
+      assert_equal(@uri, i.namespace)
+      
+      res = i.attributes.get_attribute("resource")
+      
+      assert_equal(@rdf_uri, res.namespace)
+      assert_equal(resource, res.value)
+    end
+    
+    def test_channel_textinput
+      resource = "http://hoge.com/hoge.png"
+      textinput = RDF::Channel::Textinput.new(resource)
+      
+      doc = REXML::Document.new(make_RDF(textinput.to_s))
+      t = doc.root.elements[1]
+      
+      assert_equal("textinput", t.name)
+      assert_equal(@uri, t.namespace)
+      
+      res = t.attributes.get_attribute("resource")
+      
+      assert_equal(@rdf_uri, res.namespace)
+      assert_equal(resource, res.value)
+    end
+    
+    def test_items
+      items = RDF::Channel::Items.new
+      
+      doc = REXML::Document.new(make_RDF(items.to_s))
+      i = doc.root.elements[1]
+      
+      assert_equal("items", i.name)
+      assert_equal(@uri, i.namespace)
+      
+      assert_equal(1, i.elements.size)
+      assert_equal("Seq", i.elements[1].name)
+      assert_equal(@rdf_uri, i.elements[1].namespace)
+    end
+    
+    def test_seq
+      seq = RDF::Seq.new
+      
+      doc = REXML::Document.new(make_RDF(seq.to_s))
+      s = doc.root.elements[1]
+      
+      assert_equal("Seq", s.name)
+      assert_equal(@rdf_uri, s.namespace)
+    end
+    
+    def test_li
+      resource = "http://hoge.com/"
+      li = RDF::Li.new(resource)
+      
+      doc = REXML::Document.new(make_RDF(li.to_s))
+      l = doc.root.elements[1]
+      
+      assert_equal("li", l.name)
+      assert_equal(@rdf_uri, l.namespace(l.prefix))
+      
+      res = l.attributes.get_attribute("resource")
+      
+      assert_equal('', res.instance_eval("@prefix"))
+      assert_equal(resource, res.value)
+    end
+    
+    def test_image
+      about = "http://hoge.com"
+      title = "fugafuga"
+      url = "http://hoge.com/hoge"
+      link = "http://hoge.com/fuga"
+      
+      image = RDF::Image.new(about)
+      %w(title url link).each do |x|
+        image.__send__("#{x}=", instance_eval(x))
+      end
+      
+      doc = REXML::Document.new(make_RDF(image.to_s))
+      i = doc.root.elements[1]
+      
+      assert_equal(about, i.attributes["about"])
+      %w(title url link).each do |x|
+        elem = i.elements[x]
+        assert_equal(x, elem.name)
+        assert_equal(@uri, elem.namespace)
+        assert_equal(instance_eval(x), elem.text)
+      end
+    end
+    
+    def test_item
+      about = "http://hoge.com"
+      title = "fugafuga"
+      link = "http://hoge.com/fuga"
+      description = "hogehogehoge"
+      
+      item = RDF::Item.new(about)
+      %w(title link description).each do |x|
+        item.__send__("#{x}=", instance_eval(x))
+      end
+      
+      doc = REXML::Document.new(make_RDF(item.to_s))
+      i = doc.root.elements[1]
+      
+      assert_equal(about, i.attributes["about"])
+      %w(title link description).each do |x|
+        elem = i.elements[x]
+        assert_equal(x, elem.name)
+        assert_equal(@uri, elem.namespace)
+        assert_equal(instance_eval(x), elem.text)
+      end
+    end
+    
+    def test_textinput
+      about = "http://hoge.com"
+      title = "fugafuga"
+      link = "http://hoge.com/fuga"
+      name = "foo"
+      description = "hogehogehoge"
+      
+      textinput = RDF::Textinput.new(about)
+      %w(title link name description).each do |x|
+        textinput.__send__("#{x}=", instance_eval(x))
+      end
+      
+      doc = REXML::Document.new(make_RDF(textinput.to_s))
+      t = doc.root.elements[1]
+      
+      assert_equal(about, t.attributes["about"])
+      %w(title link name description).each do |x|
+        elem = t.elements[x]
+        assert_equal(x, elem.name)
+        assert_equal(@uri, elem.namespace)
+        assert_equal(instance_eval(x), elem.text)
+      end
+    end
+
+    def test_indent_size
+      assert_equal(0, RDF.indent_size)
+      assert_equal(1, RDF::Channel.indent_size)
+      assert_equal(2, RDF::Channel::Image.indent_size)
+      assert_equal(2, RDF::Channel::Textinput.indent_size)
+      assert_equal(2, RDF::Channel::Items.indent_size)
+      assert_equal(1, RDF::Image.indent_size)
+      assert_equal(1, RDF::Item.indent_size)
+      assert_equal(1, RDF::Textinput.indent_size)
+    end
+  end
+end

Added: trunk/test/rss/test_2.0.rb
===================================================================
--- trunk/test/rss/test_2.0.rb	2006-02-15 08:51:05 UTC (rev 421)
+++ trunk/test/rss/test_2.0.rb	2006-02-15 10:51:10 UTC (rev 422)
@@ -0,0 +1,394 @@
+require "rexml/document"
+
+require "rss-testcase"
+
+require "rss/2.0"
+
+module RSS
+  class TestRSS20Core < TestCase
+
+    def setup
+      @rss_version = "2.0"
+    end
+    
+    def test_Rss
+      version = "1.0"
+      encoding = "UTF-8"
+      standalone = false
+      
+      rss = Rss.new(@rss_version, version, encoding, standalone)
+      
+      doc = REXML::Document.new(rss.to_s(false))
+      
+      xmldecl = doc.xml_decl
+      
+      %w(version encoding).each do |x|
+        assert_equal(instance_eval(x), xmldecl.__send__(x))
+      end
+      assert_equal(standalone, !xmldecl.standalone.nil?)
+      
+      assert_equal("", doc.root.namespace)
+      assert_equal(@rss_version, doc.root.attributes["version"])
+    end
+    
+    def test_not_displayed_xml_stylesheets
+      rss = Rss.new(@rss_version)
+      plain_rss = rss.to_s
+      3.times do
+        rss.xml_stylesheets.push(XMLStyleSheet.new)
+        assert_equal(plain_rss, rss.to_s)
+      end
+    end
+    
+    def test_xml_stylesheets
+      [
+        [{:href => "a.xsl", :type => "text/xsl"}],
+        [
+          {:href => "a.xsl", :type => "text/xsl"},
+          {:href => "a.css", :type => "text/css"},
+        ],
+      ].each do |attrs_ary|
+        assert_xml_stylesheet_pis(attrs_ary, Rss.new(@rss_version))
+      end
+    end
+
+    def test_channel
+      title = "fugafuga"
+      link = "http://hoge.com"
+      description = "fugafugafugafuga"
+      
+      language = "en-us"
+      copyright = "Copyright 2002, Spartanburg Herald-Journal"
+      managingEditor = "geo herald.com (George Matesky)"
+      webMaster = "betty herald.com (Betty Guernsey)"
+      pubDate = Time.parse("Sat, 07 Sep 2002 00:00:01 GMT")
+      lastBuildDate = Time.parse("Sat, 07 Sep 2002 09:42:31 GMT")
+      categories = [
+        {
+          :content => "Newspapers",
+        },
+        {
+          :domain => "Syndic8",
+          :content => "1765",
+        }
+      ]
+      generator = "MightyInHouse Content System v2.3"
+      docs = "http://blogs.law.harvard.edu/tech/rss"
+
+      ttl = "60"
+
+      rating = '(PICS-1.1 "http://www.rsac.org/ratingsv01.html" l gen true comment "RSACi North America Server" for "http://www.rsac.org" on "1996.04.16T08:15-0500" r (n 0 s 0 v 0 l 0))'
+
+      channel = Rss::Channel.new
+      
+      elems = %w(title link description language copyright
+                 managingEditor webMaster pubDate lastBuildDate
+                 generator docs ttl rating)
+      elems.each do |x|
+        value = instance_eval(x)
+        value = value.rfc822 if %w(pubDate lastBuildDate).include?(x)
+        channel.__send__("#{x}=", value)
+      end
+      categories.each do |cat|
+        channel.categories << Rss::Channel::Category.new(cat[:domain],
+                                                         cat[:content])
+      end
+      
+      doc = REXML::Document.new(make_rss20(channel.to_s))
+      c = doc.root.elements[1]
+      
+      elems.each do |x|
+        elem = c.elements[x]
+        assert_equal(x, elem.name)
+        assert_equal("", elem.namespace)
+        expected = instance_eval(x)
+        case x
+        when "pubDate", "lastBuildDate"
+          assert_equal(expected, Time.parse(elem.text))
+        when "ttl"
+          expected = channel.__send__(x)
+          assert_equal(expected, elem.text.to_i)
+        else
+          assert_equal(expected, elem.text)
+        end
+      end
+      categories.each_with_index do |cat, i|
+        cat = cat.dup
+        cat[:domain] ||= nil
+        category = c.elements["category[#{i+1}]"]
+        actual = {
+          :domain => category.attributes["domain"],
+          :content => category.text,
+        }
+        assert_equal(cat, actual)
+      end
+    end
+
+    def test_channel_cloud
+      cloud_params = {
+        :domain => "rpc.sys.com",
+        :port => "80",
+        :path => "/RPC2",
+        :registerProcedure => "myCloud.rssPleaseNotify",
+        :protocol => "xml-rpc",
+      }
+      cloud = Rss::Channel::Cloud.new(cloud_params[:domain],
+                                      cloud_params[:port],
+                                      cloud_params[:path],
+                                      cloud_params[:registerProcedure],
+                                      cloud_params[:protocol])
+      cloud_params[:port] = cloud.port
+      
+      doc = REXML::Document.new(cloud.to_s)
+      cloud_elem = doc.root
+      
+      actual = {}
+      cloud_elem.attributes.each do |name, value|
+        value = value.to_i if name == "port"
+        actual[name.intern] = value
+      end
+      assert_equal(cloud_params, actual)
+    end
+
+    def test_channel_image
+      image_params = {
+        :url => "http://hoge.com/hoge.png",
+        :title => "fugafuga",
+        :link => "http://hoge.com",
+        :width => "144",
+        :height => "400",
+        :description => "an image",
+      }
+      image = Rss::Channel::Image.new(image_params[:url],
+                                      image_params[:title],
+                                      image_params[:link],
+                                      image_params[:width],
+                                      image_params[:height],
+                                      image_params[:description])
+
+      doc = REXML::Document.new(image.to_s)
+      image_elem = doc.root
+      
+      image_params.each do |name, value|
+        value = image.__send__(name)
+        actual = image_elem.elements[name.to_s].text
+        actual = actual.to_i if [:width, :height].include?(name)
+        assert_equal(value, actual)
+      end
+    end
+    
+    def test_channel_textInput
+      textInput_params = {
+        :title => "fugafuga",
+        :description => "text hoge fuga",
+        :name => "hoge",
+        :link => "http://hoge.com",
+      }
+      textInput = Rss::Channel::TextInput.new(textInput_params[:title],
+                                              textInput_params[:description],
+                                              textInput_params[:name],
+                                              textInput_params[:link])
+
+      doc = REXML::Document.new(textInput.to_s)
+      input_elem = doc.root
+      
+      textInput_params.each do |name, value|
+        actual = input_elem.elements[name.to_s].text
+        assert_equal(value, actual)
+      end
+    end
+    
+    def test_channel_skip_days
+      skipDays_values = [
+        "Sunday",
+        "Monday",
+      ]
+      skipDays = Rss::Channel::SkipDays.new
+      skipDays_values.each do |value|
+        skipDays.days << Rss::Channel::SkipDays::Day.new(value)
+      end
+      
+      doc = REXML::Document.new(skipDays.to_s)
+      days_elem = doc.root
+      
+      skipDays_values.each_with_index do |value, i|
+        assert_equal(value, days_elem.elements[i + 1].text)
+      end
+    end
+    
+    def test_channel_skip_hours
+      skipHours_values = [
+        "0",
+        "13",
+      ]
+      skipHours = Rss::Channel::SkipHours.new
+      skipHours_values.each do |value|
+        skipHours.hours << Rss::Channel::SkipHours::Hour.new(value)
+      end
+
+      doc = REXML::Document.new(skipHours.to_s)
+      hours_elem = doc.root
+      
+      skipHours_values.each_with_index do |value, i|
+        expected = skipHours.hours[i].content
+        assert_equal(expected, hours_elem.elements[i + 1].text.to_i)
+      end
+    end
+
+    def test_item
+      title = "fugafuga"
+      link = "http://hoge.com/"
+      description = "text hoge fuga"
+      author = "oprah oxygen.net"
+      categories = [
+        {
+          :content => "Newspapers",
+        },
+        {
+          :domain => "Syndic8",
+          :content => "1765",
+        }
+      ]
+      comments = "http://www.myblog.org/cgi-local/mt/mt-comments.cgi?entry_id=290"
+      pubDate = Time.parse("Sat, 07 Sep 2002 00:00:01 GMT")
+
+      channel = Rss::Channel.new
+      item = Rss::Channel::Item.new
+      channel.items << item
+      
+      elems = %w(title link description author comments pubDate)
+      elems.each do |x|
+        value = instance_eval(x)
+        value = value.rfc822 if x == "pubDate"
+        item.__send__("#{x}=", value)
+      end
+      categories.each do |cat|
+        item.categories << Rss::Channel::Category.new(cat[:domain],
+                                                      cat[:content])
+      end
+      
+      doc = REXML::Document.new(channel.to_s)
+      channel_elem = doc.root
+
+      item_elem = channel_elem.elements["item[1]"]
+      elems.each do |x|
+        elem = item_elem.elements[x]
+        assert_equal(x, elem.name)
+        assert_equal("", elem.namespace)
+        expected = instance_eval(x)
+        case x
+        when "pubDate"
+          assert_equal(expected, Time.parse(elem.text))
+        else
+          assert_equal(expected, elem.text)
+        end
+      end
+      categories.each_with_index do |cat, i|
+        cat = cat.dup
+        cat[:domain] ||= nil
+        category = item_elem.elements["category[#{i+1}]"]
+        actual = {
+          :domain => category.attributes["domain"],
+          :content => category.text,
+        }
+        assert_equal(cat, actual)
+      end
+    end
+
+    def test_item_enclosure
+      enclosure_params = {
+        :url => "http://www.scripting.com/mp3s/weatherReportSuite.mp3",
+        :length => "12216320",
+        :type => "audio/mpeg",
+      }
+
+      enclosure = Rss::Channel::Item::Enclosure.new(enclosure_params[:url],
+                                                    enclosure_params[:length],
+                                                    enclosure_params[:type])
+      enclosure_params[:length] = enclosure.length
+      
+      doc = REXML::Document.new(enclosure.to_s)
+      enclosure_elem = doc.root
+
+      actual = {}
+      enclosure_elem.attributes.each do |name, value|
+        value = value.to_i if name == "length"
+        actual[name.intern] = value
+      end
+      assert_equal(enclosure_params, actual)
+    end
+    
+    def test_item_guid
+      test_params = [
+        {
+          :content => "http://some.server.com/weblogItem3207",
+        },
+        {
+          :isPermaLink => "true",
+          :content => "http://inessential.com/2002/09/01.php#a2",
+        },
+      ]
+
+      test_params.each do |guid_params|
+        guid = Rss::Channel::Item::Guid.new(guid_params[:isPermaLink],
+                                            guid_params[:content])
+        if guid_params.has_key?(:isPermaLink)
+          guid_params[:isPermaLink] = guid.isPermaLink
+        end
+        if guid.isPermaLink.nil?
+          assert_equal(true, guid.PermaLink?)
+        else
+          assert_equal(guid.isPermaLink, guid.PermaLink?)
+        end
+        
+        doc = REXML::Document.new(guid.to_s)
+        guid_elem = doc.root
+      
+        actual = {}
+        actual[:content] = guid_elem.text if guid_elem.text
+        guid_elem.attributes.each do |name, value|
+          value = value == "true" if name == "isPermaLink"
+          actual[name.intern] = value
+        end
+        assert_equal(guid_params, actual)
+      end
+    end
+    
+    def test_item_source
+      source_params = {
+        :url => "http://www.tomalak.org/links2.xml",
+        :content => "Tomalak's Realm",
+      }
+
+      source = Rss::Channel::Item::Source.new(source_params[:url],
+                                              source_params[:content])
+
+      doc = REXML::Document.new(source.to_s)
+      source_elem = doc.root
+      
+      actual = {}
+      actual[:content] = source_elem.text
+      source_elem.attributes.each do |name, value|
+        actual[name.intern] = value
+      end
+      assert_equal(source_params, actual)
+    end
+    
+    def test_indent_size
+      assert_equal(0, Rss.indent_size)
+      assert_equal(1, Rss::Channel.indent_size)
+      assert_equal(2, Rss::Channel::SkipDays.indent_size)
+      assert_equal(3, Rss::Channel::SkipDays::Day.indent_size)
+      assert_equal(2, Rss::Channel::SkipHours.indent_size)
+      assert_equal(3, Rss::Channel::SkipHours::Hour.indent_size)
+      assert_equal(2, Rss::Channel::Image.indent_size)
+      assert_equal(2, Rss::Channel::Cloud.indent_size)
+      assert_equal(2, Rss::Channel::Item.indent_size)
+      assert_equal(3, Rss::Channel::Item::Source.indent_size)
+      assert_equal(3, Rss::Channel::Item::Enclosure.indent_size)
+      assert_equal(3, Rss::Channel::Item::Category.indent_size)
+      assert_equal(3, Rss::Channel::Item::Guid.indent_size)
+      assert_equal(2, Rss::Channel::TextInput.indent_size)
+    end
+  end
+end

Added: trunk/test/rss/test_accessor.rb
===================================================================
--- trunk/test/rss/test_accessor.rb	2006-02-15 08:51:05 UTC (rev 421)
+++ trunk/test/rss/test_accessor.rb	2006-02-15 10:51:10 UTC (rev 422)
@@ -0,0 +1,103 @@
+require "rss-testcase"
+
+require "rss/1.0"
+require "rss/2.0"
+require "rss/syndication"
+require "rss/image"
+
+module RSS
+  class TestAccessor < TestCase
+    def test_date
+      channel = Rss::Channel.new
+      channel.pubDate = nil
+      assert_nil(channel.pubDate)
+      
+      time = Time.now
+      channel.pubDate = time
+      assert_equal(time, channel.pubDate)
+      
+      time = Time.parse(Time.now.rfc822)
+      channel.pubDate = time.rfc822
+      assert_equal(time, channel.pubDate)
+
+      time = Time.parse(Time.now.iso8601)
+      value = time.iso8601
+      assert_not_available_value("pubDate", value) do
+        channel.pubDate = value
+      end
+      
+      channel.do_validate = false
+      time = Time.parse(Time.now.iso8601)
+      value = time.iso8601
+      channel.pubDate = value
+      assert_equal(time, channel.pubDate)
+      
+      channel.pubDate = nil
+      assert_nil(channel.pubDate)
+    end
+    
+    def test_integer
+      image_item = RDF::Item::ImageItem.new
+
+      image_item.width = nil
+      assert_nil(image_item.width)
+      
+      width = 10
+      image_item.width = width
+      assert_equal(width, image_item.width)
+      
+      width = 10.0
+      image_item.width = width
+      assert_equal(width, image_item.width)
+      
+      width = "10"
+      image_item.width = width
+      assert_equal(width.to_i, image_item.width)
+      
+      width = "10.0"
+      assert_not_available_value("image:width", width) do
+        image_item.width = width
+      end
+
+      image_item.do_validate = false
+      width = "10.0"
+      image_item.width = width
+      assert_equal(width.to_i, image_item.width)
+      
+      image_item.width = nil
+      assert_nil(image_item.width)
+    end
+    
+    def test_positive_integer
+      channel = RDF::Channel.new
+
+      channel.sy_updateFrequency = nil
+      assert_nil(channel.sy_updateFrequency)
+      
+      freq = 10
+      channel.sy_updateFrequency = freq
+      assert_equal(freq, channel.sy_updateFrequency)
+      
+      freq = 10.0
+      channel.sy_updateFrequency = freq
+      assert_equal(freq, channel.sy_updateFrequency)
+      
+      freq = "10"
+      channel.sy_updateFrequency = freq
+      assert_equal(freq.to_i, channel.sy_updateFrequency)
+      
+      freq = "10.0"
+      assert_not_available_value("sy:updateFrequency", freq) do
+        channel.sy_updateFrequency = freq
+      end
+
+      channel.do_validate = false
+      freq = "10.0"
+      channel.sy_updateFrequency = freq
+      assert_equal(freq.to_i, channel.sy_updateFrequency)
+      
+      channel.sy_updateFrequency = nil
+      assert_nil(channel.sy_updateFrequency)
+    end
+  end
+end

Added: trunk/test/rss/test_content.rb
===================================================================
--- trunk/test/rss/test_content.rb	2006-02-15 08:51:05 UTC (rev 421)
+++ trunk/test/rss/test_content.rb	2006-02-15 10:51:10 UTC (rev 422)
@@ -0,0 +1,94 @@
+require "cgi"
+require "rexml/document"
+
+require "rss-testcase"
+
+require "rss/1.0"
+require "rss/content"
+
+module RSS
+  class TestContent < TestCase
+    
+    def setup
+      @prefix = "content"
+      @uri = "http://purl.org/rss/1.0/modules/content/"
+      
+      @parents = %w(item)
+      
+      @elems = {
+        :encoded => "<em>ATTENTION</em>",
+      }
+      
+      @content_nodes = @elems.collect do |name, value|
+        "<#{ prefix}:#{name}>#{CGI.escapeHTML(value.to_s)}</#{@prefix}:#{name}>"
+      end.join("\n")
+      
+      @rss_source = make_RDF(<<-EOR, {@prefix =>  @uri})
+#{make_channel()}
+#{make_image()}
+#{make_item(@content_nodes)}
+#{make_textinput()}
+EOR
+
+      @rss = Parser.parse(@rss_source)
+    end
+  
+    def test_parser
+
+      assert_nothing_raised do
+        Parser.parse(@rss_source)
+      end
+    
+      @elems.each do |tag, value|
+        assert_too_much_tag(tag.to_s, "item") do
+          Parser.parse(make_RDF(<<-EOR, {@prefix => @uri}))
+#{make_channel()}
+#{make_item(("<" + @prefix + ":" + tag.to_s + ">" +
+  CGI.escapeHTML(value.to_s) +
+  "</" + @prefix + ":" + tag.to_s + ">") * 2)}
+EOR
+        end
+      end
+
+    end
+  
+    def test_accessor
+    
+      new_value = {
+        :encoded => "<![CDATA[<it>hoge</it>]]>",
+      }
+
+      @elems.each do |name, value|
+        @parents.each do |parent|
+          meth = "#{RSS::CONTENT_PREFIX}_#{name}"
+          assert_equal(value, @rss.__send__(parent).__send__(meth))
+          @rss.__send__(parent).__send__("#{meth}=", new_value[name].to_s)
+          assert_equal(new_value[name], @rss.__send__(parent).__send__(meth))
+        end
+      end
+
+    end
+    
+    def test_to_s
+      @elems.each do |name, value|
+        excepted = "<#{ prefix}:#{name}>#{CGI.escapeHTML(value)}</#{ prefix}:#{name}>"
+        @parents.each do |parent|
+          meth = "#{RSS::CONTENT_PREFIX}_#{name}_element"
+          assert_equal(excepted, @rss.__send__(parent).funcall(meth))
+        end
+      end
+
+      REXML::Document.new( rss_source).root.each_element do |parent|
+        if @parents.include?(parent.name)
+          parent.each_element do |elem|
+            if elem.namespace == @uri
+              assert_equal(elem.text, @elems[elem.name.intern].to_s)
+            end
+          end
+        end
+      end
+      
+    end
+  
+  end
+end

Added: trunk/test/rss/test_dublincore.rb
===================================================================
--- trunk/test/rss/test_dublincore.rb	2006-02-15 08:51:05 UTC (rev 421)
+++ trunk/test/rss/test_dublincore.rb	2006-02-15 10:51:10 UTC (rev 422)
@@ -0,0 +1,189 @@
+require "cgi"
+require "rexml/document"
+
+require "rss-testcase"
+
+require "rss/1.0"
+require "rss/dublincore"
+
+module RSS
+  class TestDublinCore < TestCase
+
+    def setup
+      @prefix = "dc"
+      @uri = "http://purl.org/dc/elements/1.1/"
+      
+      @parents = %w(channel image item textinput)
+      
+      t = Time.iso8601("2000-01-01T12:00:05+00:00")
+      class << t
+        alias_method(:to_s, :iso8601)
+      end
+      
+      @elems = {
+        :title => "hoge",
+        :description =>
+          " XML is placing increasingly heavy loads on
+          the existing technical infrastructure of the Internet.",
+        :creator => "Rael Dornfest (mailto:rael oreilly.com)",
+        :subject => "XML",
+        :publisher => "The O'Reilly Network",
+        :contributor => "hogehoge",
+        :type => "fugafuga",
+        :format => "hohoho",
+        :identifier => "fufufu",
+        :source => "barbar",
+        :language => "ja",
+        :relation => "cococo",
+        :rights => "Copyright (c) 2000 O'Reilly &amp; Associates, Inc.",
+        :date => t,
+      }
+
+      @dc_nodes = @elems.collect do |name, value|
+        "<#{@prefix}:#{name}>#{value}</#{@prefix}:#{name}>"
+      end.join("\n")
+
+      @rss_source = make_RDF(<<-EOR, {@prefix =>  @uri})
+#{make_channel(@dc_nodes)}
+#{make_image(@dc_nodes)}
+#{make_item(@dc_nodes)}
+#{make_textinput(@dc_nodes)}
+EOR
+
+      @rss = Parser.parse(@rss_source)
+    end
+  
+    def test_parser
+      assert_nothing_raised do
+        Parser.parse(@rss_source)
+      end
+    
+      @elems.each do |tag, value|
+        rss = nil
+        assert_nothing_raised do
+          rss = Parser.parse(make_RDF(<<-EOR, {@prefix => @uri}))
+#{make_channel(("<" + @prefix + ":" + tag.to_s + ">" +
+  value.to_s +
+  "</" + @prefix + ":" + tag.to_s + ">") * 2)}
+#{make_item}
+EOR
+        end
+        plural_reader = "dc_#{tag}" + (tag == :rights ? "es" : "s")
+        values = rss.channel.__send__(plural_reader).collect do |x|
+          val = x.value
+          if val.kind_of?(String)
+            CGI.escapeHTML(val)
+          else
+            val
+          end
+        end
+        assert_equal([value, value], values)
+      end
+
+    end
+
+    def test_singular_accessor
+      new_value = "hoge"
+
+      @elems.each do |name, value|
+        @parents.each do |parent|
+          parsed_value = @rss.__send__(parent).__send__("dc_#{name}")
+          if parsed_value.kind_of?(String)
+            parsed_value = CGI.escapeHTML(parsed_value)
+          end
+          assert_equal(value, parsed_value)
+          if name == :date
+            t = Time.iso8601("2003-01-01T02:30:23+09:00")
+            class << t
+              alias_method(:to_s, :iso8601)
+            end
+            @rss.__send__(parent).__send__("dc_#{name}=", t.iso8601)
+            assert_equal(t, @rss.__send__(parent).__send__("dc_#{name}"))
+            assert_equal(t, @rss.__send__(parent).date)
+            
+            @rss.__send__(parent).date = value
+            assert_equal(value, @rss.__send__(parent).date)
+            assert_equal(value, @rss.__send__(parent).__send__("dc_#{name}"))
+          else
+            @rss.__send__(parent).__send__("dc_#{name}=", new_value)
+            assert_equal(new_value,
+                         @rss.__send__(parent).__send__("dc_#{name}"))
+          end
+        end
+      end
+    end
+
+    def test_plural_accessor
+      new_value = "hoge"
+      
+      @elems.each do |name, value|
+        @parents.each do |parent|
+          parsed_value = @rss.__send__(parent).__send__("dc_#{name}")
+          if parsed_value.kind_of?(String)
+            parsed_value = CGI.escapeHTML(parsed_value)
+          end
+          assert_equal(value, parsed_value)
+
+          plural_reader = "dc_#{name}" + (name == :rights ? "es" : "s")
+          klass_name = "DublinCore#{Utils.to_class_name(name.to_s)}"
+          klass = DublinCoreModel.const_get(klass_name)
+          if name == :date
+            t = Time.iso8601("2003-01-01T02:30:23+09:00")
+            class << t
+              alias_method(:to_s, :iso8601)
+            end
+            elems = @rss.__send__(parent).__send__(plural_reader)
+            elems << klass.new(t.iso8601)
+            new_elems = @rss.__send__(parent).__send__(plural_reader)
+            values = new_elems.collect{|x| x.value}
+            assert_equal([ rss.__send__(parent).__send__("dc_#{name}"), t],
+                         values)
+          else
+            elems = @rss.__send__(parent).__send__(plural_reader)
+            elems << klass.new(new_value)
+            new_elems = @rss.__send__(parent).__send__(plural_reader)
+            values = new_elems.collect{|x| x.value}
+            assert_equal([
+                          @rss.__send__(parent).__send__("dc_#{name}"),
+                          new_value
+                         ],
+                         values)
+          end
+        end
+      end
+    end
+
+    def test_to_s
+      @elems.each do |name, value|
+        excepted = "<#{@prefix}:#{name}>#{value}</#{@prefix}:#{name}>"
+        @parents.each do |parent|
+          assert_equal(excepted,
+                       @rss.__send__(parent).funcall("dc_#{name}_elements"))
+        end
+        
+        excepted = Array.new(2, excepted).join("\n")
+        @parents.each do |parent|
+          reader = "dc_#{name}" + (name == :rights ? "es" : "s")
+          elems = @rss.__send__(parent).__send__(reader)
+          klass_name = "DublinCore#{Utils.to_class_name(name.to_s)}"
+          klass = DublinCoreModel.const_get(klass_name)
+          elems << klass.new( rss.__send__(parent).__send__("dc_#{name}"))
+          assert_equal(excepted,
+                       @rss.__send__(parent).funcall("dc_#{name}_elements"))
+        end
+      end
+      
+      REXML::Document.new( rss_source).root.each_element do |parent|
+        if @parents.include?(parent.name)
+          parent.each_element do |elem|
+            if elem.namespace == @uri
+              assert_equal(CGI.escapeHTML(elem.text),
+                           @elems[elem.name.intern].to_s)
+            end
+          end
+        end
+      end
+    end
+
+  end
+end

Added: trunk/test/rss/test_image.rb
===================================================================
--- trunk/test/rss/test_image.rb	2006-02-15 08:51:05 UTC (rev 421)
+++ trunk/test/rss/test_image.rb	2006-02-15 10:51:10 UTC (rev 422)
@@ -0,0 +1,191 @@
+require "cgi"
+require "rexml/document"
+
+require "rss-testcase"
+
+require "rss/1.0"
+require "rss/image"
+
+module RSS
+  class TestImage < TestCase
+
+    def setup
+      @prefix = "image"
+      @uri = "http://web.resource.org/rss/1.0/modules/image/"
+
+      @favicon_attrs = {
+        "rdf:about" => "http://www.kuro5hin.org/favicon.ico",
+        "#{@prefix}:size" => "small",
+      }
+      @favicon_contents = {"dc:title" => "Kuro5hin",}
+      @items = [
+        [
+          {
+            "rdf:about" => "http://www.example.org/item.png",
+            "rdf:resource" => "http://www.example.org/item",
+          },
+          {
+            "dc:title" => "Example Image",
+            "#{@prefix}:width" => "100",
+            "#{@prefix}:height" => "65",
+          },
+        ],
+        [
+          {
+            "rdf:about" => "http://www.kuro5hin.org/images/topics/culture.jpg",
+          },
+          {
+            "dc:title" => "Culture",
+            "#{@prefix}:width" => "80",
+            "#{@prefix}:height" => "50",
+          },
+        ]
+      ]
+
+
+      @channel_nodes = make_element("#{@prefix}:favicon",
+                                    @favicon_attrs,
+                                    @favicon_contents)
+      items = ""
+      @items.each do |attrs, contents|
+        image_item = make_element("#{@prefix}:item", attrs, contents)
+        items << make_item(image_item)
+      end
+
+      ns = {
+        @prefix => @uri,
+        DC_PREFIX => DC_URI,
+      }
+      @rss_source = make_RDF(<<-EOR, ns)
+#{make_channel(@channel_nodes)}
+#{make_image}
+#{items}
+#{make_textinput}
+EOR
+
+      @rss = Parser.parse(@rss_source)
+    end
+  
+    def test_parser
+      assert_nothing_raised do
+        Parser.parse(@rss_source)
+      end
+    
+      assert_too_much_tag("favicon", "channel") do
+        Parser.parse(make_RDF(<<-EOR, {@prefix => @uri}))
+#{make_channel(@channel_nodes * 2)}
+#{make_item}
+EOR
+      end
+    end
+  
+    def test_favicon_accessor
+      favicon = @rss.channel.image_favicon
+      [
+        %w(about rdf:about http://example.com/favicon.ico),
+        %w(size image:size large),
+        %w(image_size image:size medium),
+      ].each do |name, full_name, new_value|
+        assert_equal(@favicon_attrs[full_name], favicon.__send__(name))
+        favicon.__send__("#{name}=", new_value)
+        assert_equal(new_value, favicon.__send__(name))
+        favicon.__send__("#{name}=", @favicon_attrs[full_name])
+        assert_equal(@favicon_attrs[full_name], favicon.__send__(name))
+      end
+
+      %w(small medium large).each do |value|
+        assert_nothing_raised do
+          favicon.size = value
+          favicon.image_size = value
+        end
+      end
+
+      %w(aaa AAA SMALL MEDIUM LARGE).each do |value|
+        args = ["#{@prefix}:favicon", value, "#{@prefix}:size"]
+        assert_not_available_value(*args) do
+          favicon.size = value
+        end
+        assert_not_available_value(*args) do
+          favicon.image_size = value
+        end
+      end
+
+      [
+        %w(dc_title dc:title sample-favicon),
+      ].each do |name, full_name, new_value|
+        assert_equal(@favicon_contents[full_name], favicon.__send__(name))
+        favicon.__send__("#{name}=", new_value)
+        assert_equal(new_value, favicon.__send__(name))
+        favicon.__send__("#{name}=", @favicon_contents[full_name])
+        assert_equal(@favicon_contents[full_name], favicon.__send__(name))
+      end
+    end
+
+    def test_item_accessor
+      @rss.items.each_with_index do |item, i|
+        image_item = item.image_item
+        attrs, contents = @items[i]
+        [
+          %w(about rdf:about http://example.com/image.png),
+          %w(resource rdf:resource http://example.com/),
+        ].each do |name, full_name, new_value|
+          assert_equal(attrs[full_name], image_item.__send__(name))
+          image_item.__send__("#{name}=", new_value)
+          assert_equal(new_value, image_item.__send__(name))
+          image_item.__send__("#{name}=", attrs[full_name])
+          assert_equal(attrs[full_name], image_item.__send__(name))
+        end
+        
+        [
+          ["width", "image:width", "111"],
+          ["image_width", "image:width", "44"],
+          ["height", "image:height", "222"],
+          ["image_height", "image:height", "88"],
+        ].each do |name, full_name, new_value|
+          assert_equal(contents[full_name].to_i, image_item.__send__(name))
+          image_item.__send__("#{name}=", new_value)
+          assert_equal(new_value.to_i, image_item.__send__(name))
+          image_item.__send__("#{name}=", contents[full_name])
+          assert_equal(contents[full_name].to_i, image_item.__send__(name))
+        end
+
+        [
+          ["dc_title", "dc:title", "sample-image"],
+        ].each do |name, full_name, new_value|
+          assert_equal(contents[full_name], image_item.__send__(name))
+          image_item.__send__("#{name}=", new_value)
+          assert_equal(new_value, image_item.__send__(name))
+          image_item.__send__("#{name}=", contents[full_name])
+          assert_equal(contents[full_name], image_item.__send__(name))
+        end
+      end
+    end
+
+    def test_favicon_to_s
+      favicon = @rss.channel.image_favicon
+      expected = REXML::Document.new(make_element("#{@prefix}:favicon",
+                                                  @favicon_attrs,
+                                                  @favicon_contents))
+      actual = REXML::Document.new(favicon.to_s(false, ""))
+      assert_equal(expected.to_s, actual.to_s)
+    end
+
+    def test_item_to_s
+      @rss.items.each_with_index do |item, i|
+        attrs, contents = @items[i]
+        expected_s = make_element("#{@prefix}:item", attrs, contents)
+        expected = REXML::Document.new(expected_s)
+        actual = REXML::Document.new(item.image_item.to_s(false, ""))
+
+        assert_equal(expected[0].attributes, actual[0].attributes)
+        
+        %w(image:height image:width dc:title).each do |name|
+          actual_target = actual.elements["//#{name}"]
+          expected_target = expected.elements["//#{name}"]
+          assert_equal(expected_target.to_s, actual_target.to_s)
+        end
+      end
+    end
+
+  end
+end

Added: trunk/test/rss/test_inherit.rb
===================================================================
--- trunk/test/rss/test_inherit.rb	2006-02-15 08:51:05 UTC (rev 421)
+++ trunk/test/rss/test_inherit.rb	2006-02-15 10:51:10 UTC (rev 422)
@@ -0,0 +1,41 @@
+require "rss-testcase"
+
+require "rss/1.0"
+
+module RSS
+  class TestInherit < TestCase
+
+    class InheritedImage < RSS::RDF::Image
+      def self.indent_size; 1; end
+      def self.tag_name; 'image'; end
+    end
+    
+    def setup
+      @rss = make_RDF(<<-EOR)
+#{make_channel}
+#{make_image}
+#{make_item}
+#{make_textinput}
+EOR
+    end
+    
+    def test_inherit
+      rss = RSS::Parser.parse(@rss)
+      orig_image = rss.image
+      prefix = "[INHERIT]"
+      image = InheritedImage.new("#{prefix} #{orig_image.about}")
+      image.title = "#{prefix} #{orig_image.title}"
+      image.url = "#{prefix} #{orig_image.url}"
+      image.link = "#{prefix} #{orig_image.link}"
+      rss.image = image
+
+      new_rss = RSS::Parser.parse(rss.to_s)
+      new_image = new_rss.image
+      assert_equal("#{prefix} #{orig_image.about}", new_image.about)
+      assert_equal("#{prefix} #{orig_image.title}", new_image.title)
+      assert_equal("#{prefix} #{orig_image.url}", new_image.url)
+      assert_equal("#{prefix} #{orig_image.link}", new_image.link)
+    end
+    
+  end
+end

Added: trunk/test/rss/test_maker_0.9.rb
===================================================================
--- trunk/test/rss/test_maker_0.9.rb	2006-02-15 08:51:05 UTC (rev 421)
+++ trunk/test/rss/test_maker_0.9.rb	2006-02-15 10:51:10 UTC (rev 422)
@@ -0,0 +1,394 @@
+require "rss-testcase"
+
+require "rss/maker"
+
+module RSS
+  class TestMaker09 < TestCase
+
+    def test_rss
+      rss = RSS::Maker.make("0.91")
+      assert_nil(rss)
+      
+      rss = RSS::Maker.make("0.9") do |maker|
+        setup_dummy_channel(maker)
+      end
+      assert_equal("0.91", rss.rss_version)
+      
+      rss = RSS::Maker.make("0.91") do |maker|
+        setup_dummy_channel(maker)
+      end
+      assert_equal("0.91", rss.rss_version)
+
+      
+      rss = RSS::Maker.make("0.91") do |maker|
+        setup_dummy_channel(maker)
+        
+        maker.encoding = "EUC-JP"
+      end
+      assert_equal("0.91", rss.rss_version)
+      assert_equal("EUC-JP", rss.encoding)
+
+      rss = RSS::Maker.make("0.91") do |maker|
+        setup_dummy_channel(maker)
+        
+        maker.standalone = "yes"
+      end
+      assert_equal("0.91", rss.rss_version)
+      assert_equal("yes", rss.standalone)
+
+      rss = RSS::Maker.make("0.91") do |maker|
+        setup_dummy_channel(maker)
+        
+        maker.encoding = "EUC-JP"
+        maker.standalone = "yes"
+      end
+      assert_equal("0.91", rss.rss_version)
+      assert_equal("EUC-JP", rss.encoding)
+      assert_equal("yes", rss.standalone)
+    end
+
+    def test_channel
+      title = "fugafuga"
+      link = "http://hoge.com"
+      description = "fugafugafugafuga"
+      language = "ja"
+      copyright = "foo"
+      managingEditor = "bar"
+      webMaster = "web master"
+      rating = '(PICS-1.1 "http://www.rsac.org/ratingsv01.html" l gen true comment "RSACi North America Server" for "http://www.rsac.org" on "1996.04.16T08:15-0500" r (n 0 s 0 v 0 l 0))'
+      docs = "http://foo.com/doc"
+      skipDays = [
+        "Sunday",
+        "Monday",
+      ]
+      skipHours = [
+        "0",
+        "13",
+      ]
+      pubDate = Time.now
+      lastBuildDate = Time.now
+      
+      rss = RSS::Maker.make("0.91") do |maker|
+        maker.channel.title = title
+        maker.channel.link = link
+        maker.channel.description = description
+        maker.channel.language = language
+        maker.channel.copyright = copyright
+        maker.channel.managingEditor = managingEditor
+        maker.channel.webMaster = webMaster
+        maker.channel.rating = rating
+        maker.channel.docs = docs
+        maker.channel.pubDate = pubDate
+        maker.channel.lastBuildDate = lastBuildDate
+
+        skipDays.each do |day|
+          new_day = maker.channel.skipDays.new_day
+          new_day.content = day
+        end
+        skipHours.each do |hour|
+          new_hour = maker.channel.skipHours.new_hour
+          new_hour.content = hour
+        end
+      end
+      channel = rss.channel
+      
+      assert_equal(title, channel.title)
+      assert_equal(link, channel.link)
+      assert_equal(description, channel.description)
+      assert_equal(language, channel.language)
+      assert_equal(copyright, channel.copyright)
+      assert_equal(managingEditor, channel.managingEditor)
+      assert_equal(webMaster, channel.webMaster)
+      assert_equal(rating, channel.rating)
+      assert_equal(docs, channel.docs)
+      assert_equal(pubDate, channel.pubDate)
+      assert_equal(pubDate, channel.date)
+      assert_equal(lastBuildDate, channel.lastBuildDate)
+
+      skipDays.each_with_index do |day, i|
+        assert_equal(day, channel.skipDays.days[i].content)
+      end
+      skipHours.each_with_index do |hour, i|
+        assert_equal(hour.to_i, channel.skipHours.hours[i].content)
+      end
+      
+      assert(channel.items.empty?)
+      assert_nil(channel.image)
+      assert_nil(channel.textInput)
+    end
+
+    def test_not_valid_channel
+      title = "fugafuga"
+      link = "http://hoge.com"
+      description = "fugafugafugafuga"
+      language = "ja"
+
+      assert_not_set_error("maker.channel", %w(title)) do
+        RSS::Maker.make("0.91") do |maker|
+          # maker.channel.title = title
+          maker.channel.link = link
+          maker.channel.description = description
+          maker.channel.language = language
+        end
+      end
+
+      assert_not_set_error("maker.channel", %w(link)) do
+        RSS::Maker.make("0.91") do |maker|
+          maker.channel.title = title
+          # maker.channel.link = link
+          maker.channel.link = nil
+          maker.channel.description = description
+          maker.channel.language = language
+        end
+      end
+
+      assert_not_set_error("maker.channel", %w(description)) do
+        RSS::Maker.make("0.91") do |maker|
+          maker.channel.title = title
+          maker.channel.link = link
+          # maker.channel.description = description
+          maker.channel.language = language
+        end
+      end
+
+      assert_not_set_error("maker.channel", %w(language)) do
+        RSS::Maker.make("0.91") do |maker|
+          maker.channel.title = title
+          maker.channel.link = link
+          maker.channel.description = description
+          # maker.channel.language = language
+        end
+      end
+    end
+    
+    def test_image
+      title = "fugafuga"
+      link = "http://hoge.com"
+      url = "http://hoge.com/hoge.png"
+      width = "144"
+      height = "400"
+      description = "an image"
+
+      rss = RSS::Maker.make("0.91") do |maker|
+        setup_dummy_channel(maker)
+        maker.channel.link = link
+        
+        maker.image.title = title
+        maker.image.url = url
+        maker.image.width = width
+        maker.image.height = height
+        maker.image.description = description
+      end
+      image = rss.image
+      assert_equal(title, image.title)
+      assert_equal(link, image.link)
+      assert_equal(url, image.url)
+      assert_equal(width.to_i, image.width)
+      assert_equal(height.to_i, image.height)
+      assert_equal(description, image.description)
+
+      assert_not_set_error("maker.channel", %w(description title language)) do
+        RSS::Maker.make("0.91") do |maker|
+          # setup_dummy_channel(maker)
+          maker.channel.link = link
+        
+          maker.image.title = title
+          maker.image.url = url
+          maker.image.width = width
+          maker.image.height = height
+          maker.image.description = description
+        end
+      end
+    end
+
+    def test_not_valid_image
+      title = "fugafuga"
+      link = "http://hoge.com"
+      url = "http://hoge.com/hoge.png"
+      width = "144"
+      height = "400"
+      description = "an image"
+
+      rss = RSS::Maker.make("0.91") do |maker|
+        setup_dummy_channel(maker)
+        maker.channel.link = link
+        
+        # maker.image.title = title
+        maker.image.url = url
+        maker.image.width = width
+        maker.image.height = height
+        maker.image.description = description
+      end
+      assert_nil(rss.channel.image)
+
+      assert_not_set_error("maker.channel", %w(link)) do
+        RSS::Maker.make("0.91") do |maker|
+          setup_dummy_channel(maker)
+          # maker.channel.link = link
+          maker.channel.link = nil
+        
+          maker.image.title = title
+          maker.image.url = url
+          maker.image.width = width
+          maker.image.height = height
+          maker.image.description = description
+        end
+      end
+
+      rss = RSS::Maker.make("0.91") do |maker|
+        setup_dummy_channel(maker)
+        maker.channel.link = link
+        
+        maker.image.title = title
+        # maker.image.url = url
+        maker.image.width = width
+        maker.image.height = height
+        maker.image.description = description
+      end
+      assert_nil(rss.channel.image)
+    end
+    
+    def test_items
+      title = "TITLE"
+      link = "http://hoge.com/"
+      description = "text hoge fuga"
+
+      rss = RSS::Maker.make("0.91") do |maker|
+        setup_dummy_channel(maker)
+      end
+      assert(rss.channel.items.empty?)
+
+      rss = RSS::Maker.make("0.91") do |maker|
+        setup_dummy_channel(maker)
+        
+        item = maker.items.new_item
+        item.title = title
+        item.link = link
+        # item.description = description
+      end
+      assert_equal(1, rss.channel.items.size)
+      item = rss.channel.items.first
+      assert_equal(title, item.title)
+      assert_equal(link, item.link)
+      assert_nil(item.description)
+
+
+      item_size = 5
+      rss = RSS::Maker.make("0.91") do |maker|
+        setup_dummy_channel(maker)
+        
+        item_size.times do |i|
+          item = maker.items.new_item
+          item.title = "#{title}#{i}"
+          item.link = "#{link}#{i}"
+          item.description = "#{description}#{i}"
+        end
+        maker.items.do_sort = true
+      end
+      assert_equal(item_size, rss.items.size)
+      rss.channel.items.each_with_index do |item, i|
+        assert_equal("#{title}#{i}", item.title)
+        assert_equal("#{link}#{i}", item.link)
+        assert_equal("#{description}#{i}", item.description)
+      end
+
+      rss = RSS::Maker.make("0.91") do |maker|
+        setup_dummy_channel(maker)
+        
+        item_size.times do |i|
+          item = maker.items.new_item
+          item.title = "#{title}#{i}"
+          item.link = "#{link}#{i}"
+          item.description = "#{description}#{i}"
+        end
+        maker.items.do_sort = Proc.new do |x, y|
+          y.title[-1] <=> x.title[-1]
+        end
+      end
+      assert_equal(item_size, rss.items.size)
+      rss.channel.items.reverse.each_with_index do |item, i|
+        assert_equal("#{title}#{i}", item.title)
+        assert_equal("#{link}#{i}", item.link)
+        assert_equal("#{description}#{i}", item.description)
+      end
+    end
+
+    def test_textInput
+      title = "fugafuga"
+      description = "text hoge fuga"
+      name = "hoge"
+      link = "http://hoge.com"
+
+      rss = RSS::Maker.make("0.91") do |maker|
+        setup_dummy_channel(maker)
+
+        maker.textinput.title = title
+        maker.textinput.description = description
+        maker.textinput.name = name
+        maker.textinput.link = link
+      end
+      textInput = rss.channel.textInput
+      assert_equal(title, textInput.title)
+      assert_equal(description, textInput.description)
+      assert_equal(name, textInput.name)
+      assert_equal(link, textInput.link)
+
+      rss = RSS::Maker.make("0.91") do |maker|
+        # setup_dummy_channel(maker)
+
+        maker.textinput.title = title
+        maker.textinput.description = description
+        maker.textinput.name = name
+        maker.textinput.link = link
+      end
+      assert_nil(rss)
+    end
+    
+    def test_not_valid_textInput
+      title = "fugafuga"
+      description = "text hoge fuga"
+      name = "hoge"
+      link = "http://hoge.com"
+
+      rss = RSS::Maker.make("0.91") do |maker|
+        setup_dummy_channel(maker)
+
+        # maker.textinput.title = title
+        maker.textinput.description = description
+        maker.textinput.name = name
+        maker.textinput.link = link
+      end
+      assert_nil(rss.channel.textInput)
+
+      rss = RSS::Maker.make("0.91") do |maker|
+        setup_dummy_channel(maker)
+        
+        maker.textinput.title = title
+        # maker.textinput.description = description
+        maker.textinput.name = name
+        maker.textinput.link = link
+      end
+      assert_nil(rss.channel.textInput)
+
+      rss = RSS::Maker.make("0.91") do |maker|
+        setup_dummy_channel(maker)
+        
+        maker.textinput.title = title
+        maker.textinput.description = description
+        # maker.textinput.name = name
+        maker.textinput.link = link
+      end
+      assert_nil(rss.channel.textInput)
+
+      rss = RSS::Maker.make("0.91") do |maker|
+        setup_dummy_channel(maker)
+        
+        maker.textinput.title = title
+        maker.textinput.description = description
+        maker.textinput.name = name
+        # maker.textinput.link = link
+      end
+      assert_nil(rss.channel.textInput)
+    end
+  end
+end

Added: trunk/test/rss/test_maker_1.0.rb
===================================================================
--- trunk/test/rss/test_maker_1.0.rb	2006-02-15 08:51:05 UTC (rev 421)
+++ trunk/test/rss/test_maker_1.0.rb	2006-02-15 10:51:10 UTC (rev 422)
@@ -0,0 +1,423 @@
+require "rss-testcase"
+
+require "rss/maker"
+
+module RSS
+  class TestMaker10 < TestCase
+
+    def test_rdf
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+      end
+      assert_equal("1.0", rss.rss_version)
+      
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        maker.encoding = "EUC-JP"
+      end
+      assert_equal("1.0", rss.rss_version)
+      assert_equal("EUC-JP", rss.encoding)
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        maker.standalone = "yes"
+      end
+      assert_equal("1.0", rss.rss_version)
+      assert_equal("yes", rss.standalone)
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        maker.encoding = "EUC-JP"
+        maker.standalone = "yes"
+      end
+      assert_equal("1.0", rss.rss_version)
+      assert_equal("EUC-JP", rss.encoding)
+      assert_equal("yes", rss.standalone)
+    end
+
+    def test_channel
+      about = "http://hoge.com"
+      title = "fugafuga"
+      link = "http://hoge.com"
+      description = "fugafugafugafuga"
+
+      rss = RSS::Maker.make("1.0")
+      assert_nil(rss)
+      
+      rss = RSS::Maker.make("1.0") do |maker|
+        maker.channel.about = about
+        maker.channel.title = title
+        maker.channel.link = link
+        maker.channel.description = description
+      end
+      channel = rss.channel
+      assert_equal(about, channel.about)
+      assert_equal(title, channel.title)
+      assert_equal(link, channel.link)
+      assert_equal(description, channel.description)
+      assert(channel.items.Seq.lis.empty?)
+      assert_nil(channel.image)
+      assert_nil(channel.textinput)
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        maker.channel.about = about
+        maker.channel.title = title
+        maker.channel.link = link
+        maker.channel.description = description
+
+        setup_dummy_image(maker)
+
+        setup_dummy_textinput(maker)
+      end
+      channel = rss.channel
+      assert_equal(about, channel.about)
+      assert_equal(title, channel.title)
+      assert_equal(link, channel.link)
+      assert_equal(description, channel.description)
+      assert(channel.items.Seq.lis.empty?)
+      assert_equal(rss.image.about, channel.image.resource)
+      assert_equal(rss.textinput.about, channel.textinput.resource)
+    end
+
+    def test_not_valid_channel
+      about = "http://hoge.com"
+      title = "fugafuga"
+      link = "http://hoge.com"
+      description = "fugafugafugafuga"
+
+      assert_not_set_error("maker.channel", %w(about)) do
+        RSS::Maker.make("1.0") do |maker|
+          # maker.channel.about = about
+          maker.channel.title = title
+          maker.channel.link = link
+          maker.channel.description = description
+        end
+      end
+
+      assert_not_set_error("maker.channel", %w(title)) do
+        RSS::Maker.make("1.0") do |maker|
+          maker.channel.about = about
+          # maker.channel.title = title
+          maker.channel.link = link
+          maker.channel.description = description
+        end
+      end
+
+      assert_not_set_error("maker.channel", %w(link)) do
+        RSS::Maker.make("1.0") do |maker|
+          maker.channel.about = about
+          maker.channel.title = title
+          # maker.channel.link = link
+          maker.channel.description = description
+        end
+      end
+
+      assert_not_set_error("maker.channel", %w(description)) do
+        RSS::Maker.make("1.0") do |maker|
+          maker.channel.about = about
+          maker.channel.title = title
+          maker.channel.link = link
+          # maker.channel.description = description
+        end
+      end
+    end
+    
+    
+    def test_image
+      title = "fugafuga"
+      link = "http://hoge.com"
+      url = "http://hoge.com/hoge.png"
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        maker.channel.link = link
+        
+        maker.image.title = title
+        maker.image.url = url
+      end
+      image = rss.image
+      assert_equal(url, image.about)
+      assert_equal(url, rss.channel.image.resource)
+      assert_equal(title, image.title)
+      assert_equal(link, image.link)
+      assert_equal(url, image.url)
+
+      assert_not_set_error("maker.channel", %w(about title description)) do
+        RSS::Maker.make("1.0") do |maker|
+          # setup_dummy_channel(maker)
+          maker.channel.link = link
+          
+          maker.image.title = title
+          maker.image.url = url
+        end
+      end
+    end
+
+    def test_not_valid_image
+      title = "fugafuga"
+      link = "http://hoge.com"
+      url = "http://hoge.com/hoge.png"
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        maker.channel.link = link
+        
+        # maker.image.url = url
+        maker.image.title = title
+      end
+      assert_nil(rss.channel.image)
+      assert_nil(rss.image)
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        maker.channel.link = link
+        
+        maker.image.url = url
+        # maker.image.title = title
+      end
+      assert_nil(rss.channel.image)
+      assert_nil(rss.image)
+
+      assert_not_set_error("maker.channel", %w(link)) do
+        RSS::Maker.make("1.0") do |maker|
+          setup_dummy_channel(maker)
+          # maker.channel.link = link
+          maker.channel.link = nil
+          
+          maker.image.url = url
+          maker.image.title = title
+        end
+      end
+    end
+    
+    def test_items
+      title = "TITLE"
+      link = "http://hoge.com/"
+      description = "text hoge fuga"
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+      end
+      assert(rss.items.empty?)
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        item = maker.items.new_item
+        item.title = title
+        item.link = link
+        # item.description = description
+      end
+      assert_equal(1, rss.items.size)
+      item = rss.items.first
+      assert_equal(link, item.about)
+      assert_equal(title, item.title)
+      assert_equal(link, item.link)
+      assert_nil(item.description)
+
+      
+      item_size = 5
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        item_size.times do |i|
+          item = maker.items.new_item
+          item.title = "#{title}#{i}"
+          item.link = "#{link}#{i}"
+          item.description = "#{description}#{i}"
+        end
+        maker.items.do_sort = true
+      end
+      assert_equal(item_size, rss.items.size)
+      rss.items.each_with_index do |item, i|
+        assert_equal("#{link}#{i}", item.about)
+        assert_equal("#{title}#{i}", item.title)
+        assert_equal("#{link}#{i}", item.link)
+        assert_equal("#{description}#{i}", item.description)
+      end
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        item_size.times do |i|
+          item = maker.items.new_item
+          item.title = "#{title}#{i}"
+          item.link = "#{link}#{i}"
+          item.description = "#{description}#{i}"
+        end
+        maker.items.do_sort = Proc.new do |x, y|
+          y.title[-1] <=> x.title[-1]
+        end
+      end
+      assert_equal(item_size, rss.items.size)
+      rss.items.reverse.each_with_index do |item, i|
+        assert_equal("#{link}#{i}", item.about)
+        assert_equal("#{title}#{i}", item.title)
+        assert_equal("#{link}#{i}", item.link)
+        assert_equal("#{description}#{i}", item.description)
+      end
+
+      max_size = item_size / 2
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        item_size.times do |i|
+          item = maker.items.new_item
+          item.title = "#{title}#{i}"
+          item.link = "#{link}#{i}"
+          item.description = "#{description}#{i}"
+        end
+        maker.items.max_size = max_size
+      end
+      assert_equal(max_size, rss.items.size)
+      rss.items.each_with_index do |item, i|
+        assert_equal("#{link}#{i}", item.about)
+        assert_equal("#{title}#{i}", item.title)
+        assert_equal("#{link}#{i}", item.link)
+        assert_equal("#{description}#{i}", item.description)
+      end
+
+      max_size = 0
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        item_size.times do |i|
+          item = maker.items.new_item
+          item.title = "#{title}#{i}"
+          item.link = "#{link}#{i}"
+          item.description = "#{description}#{i}"
+        end
+        maker.items.max_size = max_size
+      end
+      assert_equal(max_size, rss.items.size)
+
+      max_size = -2
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        item_size.times do |i|
+          item = maker.items.new_item
+          item.title = "#{title}#{i}"
+          item.link = "#{link}#{i}"
+          item.description = "#{description}#{i}"
+        end
+        maker.items.max_size = max_size
+      end
+      assert_equal(item_size + max_size + 1, rss.items.size)
+      rss.items.each_with_index do |item, i|
+        assert_equal("#{link}#{i}", item.about)
+        assert_equal("#{title}#{i}", item.title)
+        assert_equal("#{link}#{i}", item.link)
+        assert_equal("#{description}#{i}", item.description)
+      end
+    end
+
+    def test_not_valid_items
+      title = "TITLE"
+      link = "http://hoge.com/"
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        item = maker.items.new_item
+        # item.title = title
+        item.link = link
+      end
+      assert(rss.items.empty?)
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        item = maker.items.new_item
+        item.title = title
+        # item.link = link
+      end
+      assert(rss.items.empty?)
+    end
+    
+    def test_textinput
+      title = "fugafuga"
+      description = "text hoge fuga"
+      name = "hoge"
+      link = "http://hoge.com"
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        maker.textinput.link = link
+        maker.textinput.title = title
+        maker.textinput.description = description
+        maker.textinput.name = name
+      end
+      textinput = rss.textinput
+      assert_equal(link, textinput.about)
+      assert_equal(link, rss.channel.textinput.resource)
+      assert_equal(title, textinput.title)
+      assert_equal(name, textinput.name)
+      assert_equal(description, textinput.description)
+      assert_equal(link, textinput.link)
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        # setup_dummy_channel(maker)
+
+        maker.textinput.link = link
+        maker.textinput.title = title
+        maker.textinput.description = description
+        maker.textinput.name = name
+      end
+      assert_nil(rss)
+    end
+    
+    def test_not_valid_textinput
+      title = "fugafuga"
+      description = "text hoge fuga"
+      name = "hoge"
+      link = "http://hoge.com"
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+
+        # maker.textinput.link = link
+        maker.textinput.title = title
+        maker.textinput.description = description
+        maker.textinput.name = name
+      end
+      assert_nil(rss.channel.textinput)
+      assert_nil(rss.textinput)
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        maker.textinput.link = link
+        # maker.textinput.title = title
+        maker.textinput.description = description
+        maker.textinput.name = name
+      end
+      assert_nil(rss.channel.textinput)
+      assert_nil(rss.textinput)
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        maker.textinput.link = link
+        maker.textinput.title = title
+        # maker.textinput.description = description
+        maker.textinput.name = name
+      end
+      assert_nil(rss.channel.textinput)
+      assert_nil(rss.textinput)
+
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        maker.textinput.link = link
+        maker.textinput.title = title
+        maker.textinput.description = description
+        # maker.textinput.name = name
+      end
+      assert_nil(rss.channel.textinput)
+      assert_nil(rss.textinput)
+    end
+
+  end
+end

Added: trunk/test/rss/test_maker_2.0.rb
===================================================================
--- trunk/test/rss/test_maker_2.0.rb	2006-02-15 08:51:05 UTC (rev 421)
+++ trunk/test/rss/test_maker_2.0.rb	2006-02-15 10:51:10 UTC (rev 422)
@@ -0,0 +1,660 @@
+require "rss-testcase"
+
+require "rss/maker"
+
+module RSS
+  class TestMaker20 < TestCase
+
+    def test_rss
+      rss = RSS::Maker.make("2.0")
+      assert_nil(rss)
+      
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+      end
+      assert_equal("2.0", rss.rss_version)
+      
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        maker.encoding = "EUC-JP"
+      end
+      assert_equal("2.0", rss.rss_version)
+      assert_equal("EUC-JP", rss.encoding)
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        maker.standalone = "yes"
+      end
+      assert_equal("2.0", rss.rss_version)
+      assert_equal("yes", rss.standalone)
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        maker.encoding = "EUC-JP"
+        maker.standalone = "yes"
+      end
+      assert_equal("2.0", rss.rss_version)
+      assert_equal("EUC-JP", rss.encoding)
+      assert_equal("yes", rss.standalone)
+    end
+
+    def test_channel
+      title = "fugafuga"
+      link = "http://hoge.com"
+      description = "fugafugafugafuga"
+      language = "ja"
+      copyright = "foo"
+      managingEditor = "bar"
+      webMaster = "web master"
+      rating = '(PICS-1.1 "http://www.rsac.org/ratingsv01.html" l gen true comment "RSACi North America Server" for "http://www.rsac.org" on "1996.04.16T08:15-0500" r (n 0 s 0 v 0 l 0))'
+      docs = "http://foo.com/doc"
+      skipDays = [
+        "Sunday",
+        "Monday",
+      ]
+      skipHours = [
+        "0",
+        "13",
+      ]
+      pubDate = Time.now
+      lastBuildDate = Time.now
+      categories = [
+        "Nespapers",
+        "misc",
+      ]
+      generator = "RSS Maker"
+      ttl = "60"
+      
+      rss = RSS::Maker.make("2.0") do |maker|
+        maker.channel.title = title
+        maker.channel.link = link
+        maker.channel.description = description
+        maker.channel.language = language
+        maker.channel.copyright = copyright
+        maker.channel.managingEditor = managingEditor
+        maker.channel.webMaster = webMaster
+        maker.channel.rating = rating
+        maker.channel.docs = docs
+        maker.channel.pubDate = pubDate
+        maker.channel.lastBuildDate = lastBuildDate
+
+        skipDays.each do |day|
+          new_day = maker.channel.skipDays.new_day
+          new_day.content = day
+        end
+        skipHours.each do |hour|
+          new_hour = maker.channel.skipHours.new_hour
+          new_hour.content = hour
+        end
+        
+        categories.each do |category|
+          new_category = maker.channel.categories.new_category
+          new_category.content = category
+        end
+        
+        maker.channel.generator = generator
+        maker.channel.ttl = ttl
+      end
+      channel = rss.channel
+      
+      assert_equal(title, channel.title)
+      assert_equal(link, channel.link)
+      assert_equal(description, channel.description)
+      assert_equal(language, channel.language)
+      assert_equal(copyright, channel.copyright)
+      assert_equal(managingEditor, channel.managingEditor)
+      assert_equal(webMaster, channel.webMaster)
+      assert_equal(rating, channel.rating)
+      assert_equal(docs, channel.docs)
+      assert_equal(pubDate, channel.pubDate)
+      assert_equal(pubDate, channel.date)
+      assert_equal(lastBuildDate, channel.lastBuildDate)
+
+      skipDays.each_with_index do |day, i|
+        assert_equal(day, channel.skipDays.days[i].content)
+      end
+      skipHours.each_with_index do |hour, i|
+        assert_equal(hour.to_i, channel.skipHours.hours[i].content)
+      end
+      
+      channel.categories.each_with_index do |category, i|
+        assert_equal(categories[i], category.content)
+      end
+      
+      assert_equal(generator, channel.generator)
+      assert_equal(ttl.to_i, channel.ttl)
+
+      assert(channel.items.empty?)
+      assert_nil(channel.image)
+      assert_nil(channel.textInput)
+    end
+
+    def test_not_valid_channel
+      title = "fugafuga"
+      link = "http://hoge.com"
+      description = "fugafugafugafuga"
+      language = "ja"
+      
+      assert_not_set_error("maker.channel", %w(title)) do
+        RSS::Maker.make("2.0") do |maker|
+          # maker.channel.title = title
+          maker.channel.link = link
+          maker.channel.description = description
+          maker.channel.language = language
+        end
+      end
+
+      assert_not_set_error("maker.channel", %w(link)) do
+        RSS::Maker.make("2.0") do |maker|
+          maker.channel.title = title
+          # maker.channel.link = link
+          maker.channel.description = description
+          maker.channel.language = language
+        end
+      end
+
+      assert_not_set_error("maker.channel", %w(description)) do
+        RSS::Maker.make("2.0") do |maker|
+          maker.channel.title = title
+          maker.channel.link = link
+          # maker.channel.description = description
+          maker.channel.language = language
+        end
+      end
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        maker.channel.title = title
+        maker.channel.link = link
+        maker.channel.description = description
+        # maker.channel.language = language
+      end
+      assert_not_nil(rss)
+    end
+
+    
+    def test_cloud
+      domain = "rpc.sys.com"
+      port = "80"
+      path = "/RPC2"
+      registerProcedure = "myCloud.rssPleaseNotify"
+      protocol = "xml-rpc"
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+
+        maker.channel.cloud.domain = domain
+        maker.channel.cloud.port = port
+        maker.channel.cloud.path = path
+        maker.channel.cloud.registerProcedure = registerProcedure
+        maker.channel.cloud.protocol = protocol
+      end
+      cloud = rss.channel.cloud
+      assert_equal(domain, cloud.domain)
+      assert_equal(port.to_i, cloud.port)
+      assert_equal(path, cloud.path)
+      assert_equal(registerProcedure, cloud.registerProcedure)
+      assert_equal(protocol, cloud.protocol)
+    end
+    
+    def test_not_valid_cloud
+      domain = "rpc.sys.com"
+      port = "80"
+      path = "/RPC2"
+      registerProcedure = "myCloud.rssPleaseNotify"
+      protocol = "xml-rpc"
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+
+        # maker.channel.cloud.domain = domain
+        maker.channel.cloud.port = port
+        maker.channel.cloud.path = path
+        maker.channel.cloud.registerProcedure = registerProcedure
+        maker.channel.cloud.protocol = protocol
+      end
+      assert_nil(rss.channel.cloud)
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+
+        maker.channel.cloud.domain = domain
+        # maker.channel.cloud.port = port
+        maker.channel.cloud.path = path
+        maker.channel.cloud.registerProcedure = registerProcedure
+        maker.channel.cloud.protocol = protocol
+      end
+      assert_nil(rss.channel.cloud)
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+
+        maker.channel.cloud.domain = domain
+        maker.channel.cloud.port = port
+        # maker.channel.cloud.path = path
+        maker.channel.cloud.registerProcedure = registerProcedure
+        maker.channel.cloud.protocol = protocol
+      end
+      assert_nil(rss.channel.cloud)
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+
+        maker.channel.cloud.domain = domain
+        maker.channel.cloud.port = port
+        maker.channel.cloud.path = path
+        # maker.channel.cloud.registerProcedure = registerProcedure
+        maker.channel.cloud.protocol = protocol
+      end
+      assert_nil(rss.channel.cloud)
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+
+        maker.channel.cloud.domain = domain
+        maker.channel.cloud.port = port
+        maker.channel.cloud.path = path
+        maker.channel.cloud.registerProcedure = registerProcedure
+        # maker.channel.cloud.protocol = protocol
+      end
+      assert_nil(rss.channel.cloud)
+    end
+    
+
+    def test_image
+      title = "fugafuga"
+      link = "http://hoge.com"
+      url = "http://hoge.com/hoge.png"
+      width = "144"
+      height = "400"
+      description = "an image"
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        maker.channel.link = link
+        
+        maker.image.title = title
+        maker.image.url = url
+        maker.image.width = width
+        maker.image.height = height
+        maker.image.description = description
+      end
+      image = rss.image
+      assert_equal(title, image.title)
+      assert_equal(link, image.link)
+      assert_equal(url, image.url)
+      assert_equal(width.to_i, image.width)
+      assert_equal(height.to_i, image.height)
+      assert_equal(description, image.description)
+
+      assert_not_set_error("maker.channel", %w(title description)) do
+        RSS::Maker.make("2.0") do |maker|
+          # setup_dummy_channel(maker)
+          maker.channel.link = link
+        
+          maker.image.title = title
+          maker.image.url = url
+          maker.image.width = width
+          maker.image.height = height
+          maker.image.description = description
+        end
+      end
+    end
+
+    def test_not_valid_image
+      title = "fugafuga"
+      link = "http://hoge.com"
+      url = "http://hoge.com/hoge.png"
+      width = "144"
+      height = "400"
+      description = "an image"
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        maker.channel.link = link
+        
+        # maker.image.title = title
+        maker.image.url = url
+        maker.image.width = width
+        maker.image.height = height
+        maker.image.description = description
+      end
+      assert_nil(rss.image)
+
+      assert_not_set_error("maker.channel", %w(link)) do
+        RSS::Maker.make("2.0") do |maker|
+          setup_dummy_channel(maker)
+          # maker.channel.link = link
+          maker.channel.link = nil
+        
+          maker.image.title = title
+          maker.image.url = url
+          maker.image.width = width
+          maker.image.height = height
+          maker.image.description = description
+        end
+      end
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        maker.channel.link = link
+        
+        maker.image.title = title
+        # maker.image.url = url
+        maker.image.width = width
+        maker.image.height = height
+        maker.image.description = description
+      end
+      assert_nil(rss.image)
+    end
+    
+    def test_items
+      title = "TITLE"
+      link = "http://hoge.com/"
+      description = "text hoge fuga"
+      author = "oprah oxygen.net"
+      comments = "http://www.myblog.org/cgi-local/mt/mt-comments.cgi?entry_id=290"
+      pubDate = Time.now
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+      end
+      assert(rss.channel.items.empty?)
+
+      item_size = 5
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        item_size.times do |i|
+          item = maker.items.new_item
+          item.title = "#{title}#{i}"
+          item.link = "#{link}#{i}"
+          item.description = "#{description}#{i}"
+          item.author = "#{author}#{i}"
+          item.comments = "#{comments}#{i}"
+          item.date = pubDate
+        end
+        maker.items.do_sort = true
+      end
+      assert_equal(item_size, rss.items.size)
+      rss.channel.items.each_with_index do |item, i|
+        assert_equal("#{title}#{i}", item.title)
+        assert_equal("#{link}#{i}", item.link)
+        assert_equal("#{description}#{i}", item.description)
+        assert_equal("#{author}#{i}", item.author)
+        assert_equal("#{comments}#{i}", item.comments)
+        assert_equal(pubDate, item.pubDate)
+        assert_equal(pubDate, item.date)
+      end
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        item_size.times do |i|
+          item = maker.items.new_item
+          item.title = "#{title}#{i}"
+          item.link = "#{link}#{i}"
+          item.description = "#{description}#{i}"
+          item.author = "#{author}#{i}"
+          item.comments = "#{comments}#{i}"
+          item.date = pubDate
+        end
+        maker.items.do_sort = Proc.new do |x, y|
+          y.title[-1] <=> x.title[-1]
+        end
+      end
+      assert_equal(item_size, rss.items.size)
+      rss.channel.items.reverse.each_with_index do |item, i|
+        assert_equal("#{title}#{i}", item.title)
+        assert_equal("#{link}#{i}", item.link)
+        assert_equal("#{description}#{i}", item.description)
+        assert_equal("#{author}#{i}", item.author)
+        assert_equal("#{comments}#{i}", item.comments)
+        assert_equal(pubDate, item.pubDate)
+        assert_equal(pubDate, item.date)
+      end
+    end
+
+    def test_guid
+      isPermaLink = "true"
+      content = "http://inessential.com/2002/09/01.php#a2"
+      
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        setup_dummy_item(maker)
+
+        guid = maker.items.last.guid
+        guid.isPermaLink = isPermaLink
+        guid.content = content
+      end
+      guid = rss.channel.items.last.guid
+      assert_equal(isPermaLink == "true", guid.isPermaLink)
+      assert_equal(content, guid.content)
+    end
+
+    def test_not_valid_guid
+      content = "http://inessential.com/2002/09/01.php#a2"
+      
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        setup_dummy_item(maker)
+
+        guid = maker.items.last.guid
+        # guid.content = content
+      end
+      assert_nil(rss.channel.items.last.guid)
+    end
+    
+    def test_enclosure
+      url = "http://www.scripting.com/mp3s/weatherReportSuite.mp3"
+      length = "12216320"
+      type = "audio/mpeg"
+      
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        setup_dummy_item(maker)
+
+        enclosure = maker.items.last.enclosure
+        enclosure.url = url
+        enclosure.length = length
+        enclosure.type = type
+      end
+      enclosure = rss.channel.items.last.enclosure
+      assert_equal(url, enclosure.url)
+      assert_equal(length.to_i, enclosure.length)
+      assert_equal(type, enclosure.type)
+    end
+
+    def test_not_valid_enclosure
+      url = "http://www.scripting.com/mp3s/weatherReportSuite.mp3"
+      length = "12216320"
+      type = "audio/mpeg"
+      
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        setup_dummy_item(maker)
+
+        enclosure = maker.items.last.enclosure
+        # enclosure.url = url
+        enclosure.length = length
+        enclosure.type = type
+      end
+      assert_nil(rss.channel.items.last.enclosure)
+      
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        setup_dummy_item(maker)
+
+        enclosure = maker.items.last.enclosure
+        enclosure.url = url
+        # enclosure.length = length
+        enclosure.type = type
+      end
+      assert_nil(rss.channel.items.last.enclosure)
+      
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        setup_dummy_item(maker)
+
+        enclosure = maker.items.last.enclosure
+        enclosure.url = url
+        enclosure.length = length
+        # enclosure.type = type
+      end
+      assert_nil(rss.channel.items.last.enclosure)
+    end
+
+
+    def test_source
+      url = "http://static.userland.com/tomalak/links2.xml"
+      content = "Tomalak's Realm"
+      
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        setup_dummy_item(maker)
+
+        source = maker.items.last.source
+        source.url = url
+        source.content = content
+      end
+      source = rss.channel.items.last.source
+      assert_equal(url, source.url)
+      assert_equal(content, source.content)
+    end
+
+    def test_not_valid_source
+      url = "http://static.userland.com/tomalak/links2.xml"
+      content = "Tomalak's Realm"
+      
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        setup_dummy_item(maker)
+
+        source = maker.items.last.source
+        # source.url = url
+        source.content = content
+      end
+      assert_nil(rss.channel.items.last.source)
+      
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        setup_dummy_item(maker)
+
+        source = maker.items.last.source
+        source.url = url
+        # source.content = content
+      end
+      assert_nil(rss.channel.items.last.source)
+    end
+    
+    def test_category
+      domain = "http://www.fool.com/cusips"
+      content = "MSFT"
+      
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        setup_dummy_item(maker)
+
+        category = maker.items.last.categories.new_category
+        category.domain = domain
+        category.content = content
+      end
+      category = rss.channel.items.last.categories.last
+      assert_equal(domain, category.domain)
+      assert_equal(content, category.content)
+    end
+
+    def test_not_valid_category
+      content = "Grateful Dead"
+      
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        setup_dummy_item(maker)
+
+        category = maker.items.last.categories.new_category
+        # category.content = content
+      end
+      assert(rss.channel.items.last.categories.empty?)
+    end
+    
+    def test_textInput
+      title = "fugafuga"
+      description = "text hoge fuga"
+      name = "hoge"
+      link = "http://hoge.com"
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+
+        maker.textinput.title = title
+        maker.textinput.description = description
+        maker.textinput.name = name
+        maker.textinput.link = link
+      end
+      textInput = rss.channel.textInput
+      assert_equal(title, textInput.title)
+      assert_equal(description, textInput.description)
+      assert_equal(name, textInput.name)
+      assert_equal(link, textInput.link)
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        # setup_dummy_channel(maker)
+
+        maker.textinput.title = title
+        maker.textinput.description = description
+        maker.textinput.name = name
+        maker.textinput.link = link
+      end
+      assert_nil(rss)
+    end
+    
+    def test_not_valid_textInput
+      title = "fugafuga"
+      description = "text hoge fuga"
+      name = "hoge"
+      link = "http://hoge.com"
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+
+        # maker.textinput.title = title
+        maker.textinput.description = description
+        maker.textinput.name = name
+        maker.textinput.link = link
+      end
+      assert_nil(rss.channel.textInput)
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        maker.textinput.title = title
+        # maker.textinput.description = description
+        maker.textinput.name = name
+        maker.textinput.link = link
+      end
+      assert_nil(rss.channel.textInput)
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        maker.textinput.title = title
+        maker.textinput.description = description
+        # maker.textinput.name = name
+        maker.textinput.link = link
+      end
+      assert_nil(rss.channel.textInput)
+
+      rss = RSS::Maker.make("2.0") do |maker|
+        setup_dummy_channel(maker)
+        
+        maker.textinput.title = title
+        maker.textinput.description = description
+        maker.textinput.name = name
+        # maker.textinput.link = link
+      end
+      assert_nil(rss.channel.textInput)
+    end
+  end
+end

Added: trunk/test/rss/test_maker_content.rb
===================================================================
--- trunk/test/rss/test_maker_content.rb	2006-02-15 08:51:05 UTC (rev 421)
+++ trunk/test/rss/test_maker_content.rb	2006-02-15 10:51:10 UTC (rev 422)
@@ -0,0 +1,34 @@
+require "rss-testcase"
+
+require "rss/maker"
+
+module RSS
+  class TestMakerContent < TestCase
+
+    def setup
+      @uri = "http://purl.org/rss/1.0/modules/content/"
+      
+      @elements = {
+        :encoded => "<em>ATTENTION</em>",
+      }
+    end
+
+    def test_rss10
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+
+        setup_dummy_item(maker)
+        item = maker.items.last
+        @elements.each do |name, value|
+          item.__send__("#{accessor_name(name)}=", value)
+        end
+      end
+      assert_content(@elements, rss.items.last)
+    end
+
+    private
+    def accessor_name(name)
+      "content_#{name}"
+    end
+  end
+end

Added: trunk/test/rss/test_maker_dc.rb
===================================================================
--- trunk/test/rss/test_maker_dc.rb	2006-02-15 08:51:05 UTC (rev 421)
+++ trunk/test/rss/test_maker_dc.rb	2006-02-15 10:51:10 UTC (rev 422)
@@ -0,0 +1,141 @@
+require "rss-testcase"
+
+require "rss/maker"
+
+module RSS
+  class TestMakerDublinCore < TestCase
+
+    def setup
+      @uri = "http://purl.org/dc/elements/1.1/"
+      
+      t = Time.iso8601("2000-01-01T12:00:05+00:00")
+      class << t
+        alias_method(:to_s, :iso8601)
+      end
+      
+      @elements = {
+        :title => "hoge",
+        :description =>
+          " XML is placing increasingly heavy loads on
+          the existing technical infrastructure of the Internet.",
+        :creator => "Rael Dornfest (mailto:rael oreilly.com)",
+        :subject => "XML",
+        :publisher => "The O'Reilly Network",
+        :contributor => "hogehoge",
+        :type => "fugafuga",
+        :format => "hohoho",
+        :identifier => "fufufu",
+        :source => "barbar",
+        :language => "ja",
+        :relation => "cococo",
+        :rights => "Copyright (c) 2000 O'Reilly &amp; Associates, Inc.",
+        :date => t,
+      }
+    end
+
+    def test_rss10
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        set_elements(maker.channel)
+
+        setup_dummy_image(maker)
+        set_elements(maker.image)
+
+        setup_dummy_item(maker)
+        item = maker.items.last
+        @elements.each do |name, value|
+          item.__send__("#{accessor_name(name)}=", value)
+        end
+
+        setup_dummy_textinput(maker)
+        set_elements(maker.textinput)
+      end
+      assert_dublin_core(@elements, rss.channel)
+      assert_dublin_core(@elements, rss.image)
+      assert_dublin_core(@elements, rss.items.last)
+      assert_dublin_core(@elements, rss.textinput)
+    end
+
+    def test_rss10_multiple
+      elems = []
+      @elements.each do |name, value|
+        plural = name.to_s + (name == :rights ? "es" : "s")
+        values = [value]
+        if name == :date
+          values << value + 60
+        else
+          values << value * 2
+        end
+        elems << [name, values, plural]
+      end
+      
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        set_multiple_elements(maker.channel, elems)
+
+        setup_dummy_image(maker)
+        set_multiple_elements(maker.image, elems)
+
+        setup_dummy_item(maker)
+        item = maker.items.last
+        elems.each do |name, values, plural|
+          dc_elems = item.__send__("dc_#{plural}")
+          values.each do |value|
+            elem = dc_elems.__send__("new_#{name}")
+            elem.value = value
+          end
+        end
+
+        setup_dummy_textinput(maker)
+        set_multiple_elements(maker.textinput, elems)
+      end
+      assert_multiple_dublin_core(elems, rss.channel)
+      assert_multiple_dublin_core(elems, rss.image)
+      assert_multiple_dublin_core(elems, rss.items.last)
+      assert_multiple_dublin_core(elems, rss.textinput)
+    end
+
+    def test_date
+      t1 = Time.iso8601("2000-01-01T12:00:05+00:00")
+      t2 = Time.iso8601("2005-01-01T12:00:05+00:00")
+      
+      rss = RSS::Maker.make("1.0") do |maker|
+        setup_dummy_channel(maker)
+        maker.channel.date = t1
+        date = maker.channel.dc_dates.new_date
+        date.value = t2
+
+        setup_dummy_item(maker)
+        item = maker.items.last
+        item.date = t2
+        date = item.dc_dates.new_date
+        date.value = t1
+      end
+      assert_equal([t1, t2], rss.channel.dc_dates.collect{|x| x.value})
+      assert_equal([t2, t1], rss.items.last.dc_dates.collect{|x| x.value})
+    end
+    
+    private
+    def accessor_name(name)
+      "dc_#{name}"
+    end
+
+    def set_elements(target, elems=@elements)
+      elems.each do |name, value|
+        target.__send__("#{accessor_name(name)}=", value)
+      end
+    end
+
+    def set_multiple_elements(target, elems)
+      elems.each do |name, values, plural|
+        plural ||= "#{name}s"
+        dc_elems = target.__send__("dc_#{plural}")
+        values.each do |value|
+          new_dc_elem = dc_elems.__send__("new_#{name}")
+          new_dc_elem.value = value
+        end
+      end
+    end
+
+  end
+end

Added: trunk/test/rss/test_maker_image.rb
===================================================================
--- trunk/test/rss/test_maker_image.rb	2006-02-15 08:51:05 UTC (rev 421)
+++ trunk/test/rss/test_maker_image.rb	2006-02-15 10:51:10 UTC (rev 422)
@@ -0,0 +1,62 @@
+require "rss-testcase"
+
+require "rss/maker"
+
+module RSS
+  class TestMakerImage < TestCase
+
+    def setup
+      @uri = "http://web.resource.org/rss/1.0/modules/image/"
+
+      @favicon_infos = {
+        "about" => "http://www.kuro5hin.org/favicon.ico",
+        "image_size" => "small",
+        "dc_title" => "example",
+      }
+