1require 'test/unit'
2require 'xmlrpc/datetime'
3require "xmlrpc/parser"
4require 'yaml'
5
6module GenericParserTest
7  def datafile(base)
8    File.join(File.dirname(__FILE__), "data", base)
9  end
10
11  def load_data(name)
12    [File.read(datafile(name) + ".xml"), YAML.load(File.read(datafile(name) + ".expected"))]
13  end
14
15  def setup
16    @xml1, @expected1 = load_data('xml1')
17    @xml2, @expected2 = load_data('bug_covert')
18    @xml3, @expected3 = load_data('bug_bool')
19    @xml4, @expected4 = load_data('value')
20
21    @cdata_xml, @cdata_expected = load_data('bug_cdata')
22
23    @datetime_xml = File.read(datafile('datetime_iso8601.xml'))
24    @datetime_expected = XMLRPC::DateTime.new(2004, 11, 5, 1, 15, 23)
25
26    @fault_doc = File.read(datafile('fault.xml'))
27  end
28
29  # test parseMethodResponse --------------------------------------------------
30
31  def test_parseMethodResponse1
32    assert_equal(@expected1, @p.parseMethodResponse(@xml1))
33  end
34
35  def test_parseMethodResponse2
36    assert_equal(@expected2, @p.parseMethodResponse(@xml2))
37  end
38
39  def test_parseMethodResponse3
40    assert_equal(@expected3, @p.parseMethodResponse(@xml3))
41  end
42
43  def test_cdata
44    assert_equal(@cdata_expected, @p.parseMethodResponse(@cdata_xml))
45  end
46
47  def test_dateTime
48    assert_equal(@datetime_expected, @p.parseMethodResponse(@datetime_xml)[1])
49  end
50
51  # test parseMethodCall ------------------------------------------------------
52
53  def test_parseMethodCall
54    assert_equal(@expected4, @p.parseMethodCall(@xml4))
55  end
56
57  # test fault ----------------------------------------------------------------
58
59  def test_fault
60    flag, fault = @p.parseMethodResponse(@fault_doc)
61     assert_equal(flag, false)
62     unless fault.is_a? XMLRPC::FaultException
63       assert(false, "must be an instance of class XMLRPC::FaultException")
64     end
65     assert_equal(fault.faultCode, 4)
66     assert_equal(fault.faultString, "an error message")
67  end
68
69  def test_fault_message
70    fault = XMLRPC::FaultException.new(1234, 'an error message')
71    assert_equal('an error message', fault.to_s)
72    assert_equal('#<XMLRPC::FaultException: an error message>', fault.inspect)
73  end
74end
75
76# create test class for each installed parser
77XMLRPC::XMLParser.each_installed_parser do |parser|
78  klass = parser.class
79  name = klass.to_s.split("::").last
80
81  eval %{
82    class Test_#{name} < Test::Unit::TestCase
83      include GenericParserTest
84
85      def setup
86        super
87        @p = #{klass}.new
88      end
89    end
90  }
91end
92