PageRenderTime 45ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/gems/gems/libxml-ruby-2.0.6-x86-mingw32/test/tc_sax_parser.rb

http://github.com/shouldly/shouldly
Ruby | 320 lines | 293 code | 25 blank | 2 comment | 0 complexity | 02743d9196ed710053546e3d4b4ae965 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause
  1. # encoding: UTF-8
  2. require './test_helper'
  3. require 'stringio'
  4. require 'test/unit'
  5. class DocTypeCallback
  6. include XML::SaxParser::Callbacks
  7. def on_start_element(element, attributes)
  8. end
  9. end
  10. class TestCaseCallbacks
  11. include XML::SaxParser::Callbacks
  12. attr_accessor :result
  13. def initialize
  14. @result = Array.new
  15. end
  16. def on_cdata_block(cdata)
  17. @result << "cdata: #{cdata}"
  18. end
  19. def on_characters(chars)
  20. @result << "characters: #{chars}"
  21. end
  22. def on_comment(text)
  23. @result << "comment: #{text}"
  24. end
  25. def on_end_document
  26. @result << "end_document"
  27. end
  28. def on_end_element(name)
  29. @result << "end_element: #{name}"
  30. end
  31. def on_end_element_ns(name, prefix, uri)
  32. @result << "end_element_ns #{name}, prefix: #{prefix}, uri: #{uri}"
  33. end
  34. # Called for parser errors.
  35. def on_error(error)
  36. @result << "error: #{error}"
  37. end
  38. def on_processing_instruction(target, data)
  39. @result << "pi: #{target} #{data}"
  40. end
  41. def on_start_document
  42. @result << "startdoc"
  43. end
  44. def on_start_element(name, attributes)
  45. attributes ||= Hash.new
  46. @result << "start_element: #{name}, attr: #{attributes.inspect}"
  47. end
  48. def on_start_element_ns(name, attributes, prefix, uri, namespaces)
  49. attributes ||= Hash.new
  50. namespaces ||= Hash.new
  51. @result << "start_element_ns: #{name}, attr: #{attributes.inspect}, prefix: #{prefix}, uri: #{uri}, ns: #{namespaces.inspect}"
  52. end
  53. end
  54. class TestSaxParser < Test::Unit::TestCase
  55. def saxtest_file
  56. File.join(File.dirname(__FILE__), 'model/atom.xml')
  57. end
  58. def verify(parser)
  59. result = parser.callbacks.result
  60. i = -1
  61. assert_equal("startdoc", result[i+=1])
  62. assert_equal("pi: xml-stylesheet type=\"text/xsl\" href=\"my_stylesheet.xsl\"", result[i+=1])
  63. assert_equal("start_element: feed, attr: {}", result[i+=1])
  64. assert_equal("start_element_ns: feed, attr: {}, prefix: , uri: http://www.w3.org/2005/Atom, ns: {nil=>\"http://www.w3.org/2005/Atom\"}", result[i+=1])
  65. assert_equal("characters: \n ", result[i+=1])
  66. assert_equal("comment: Not a valid atom entry ", result[i+=1])
  67. assert_equal("characters: \n ", result[i+=1])
  68. assert_equal("start_element: entry, attr: {}", result[i+=1])
  69. assert_equal("start_element_ns: entry, attr: {}, prefix: , uri: http://www.w3.org/2005/Atom, ns: {}", result[i+=1])
  70. assert_equal("characters: \n ", result[i+=1])
  71. assert_equal("start_element: title, attr: {\"type\"=>\"html\"}", result[i+=1])
  72. assert_equal("start_element_ns: title, attr: {\"type\"=>\"html\"}, prefix: , uri: http://www.w3.org/2005/Atom, ns: {}", result[i+=1])
  73. assert_equal("cdata: <<strong>>", result[i+=1])
  74. assert_equal("end_element: title", result[i+=1])
  75. assert_equal("end_element_ns title, prefix: , uri: http://www.w3.org/2005/Atom", result[i+=1])
  76. assert_equal("characters: \n ", result[i+=1])
  77. assert_equal("start_element: content, attr: {\"type\"=>\"xhtml\"}", result[i+=1])
  78. assert_equal("start_element_ns: content, attr: {\"type\"=>\"xhtml\"}, prefix: , uri: http://www.w3.org/2005/Atom, ns: {}", result[i+=1])
  79. assert_equal("characters: \n ", result[i+=1])
  80. assert_equal("start_element: xhtml:div, attr: {}", result[i+=1])
  81. assert_equal("start_element_ns: div, attr: {}, prefix: xhtml, uri: http://www.w3.org/1999/xhtml, ns: {\"xhtml\"=>\"http://www.w3.org/1999/xhtml\"}", result[i+=1])
  82. assert_equal("characters: \n ", result[i+=1])
  83. assert_equal("start_element: xhtml:p, attr: {}", result[i+=1])
  84. assert_equal("start_element_ns: p, attr: {}, prefix: xhtml, uri: http://www.w3.org/1999/xhtml, ns: {}", result[i+=1])
  85. assert_equal("characters: hi there", result[i+=1])
  86. assert_equal("end_element: xhtml:p", result[i+=1])
  87. assert_equal("end_element_ns p, prefix: xhtml, uri: http://www.w3.org/1999/xhtml", result[i+=1])
  88. assert_equal("characters: \n ", result[i+=1])
  89. assert_equal("end_element: xhtml:div", result[i+=1])
  90. assert_equal("end_element_ns div, prefix: xhtml, uri: http://www.w3.org/1999/xhtml", result[i+=1])
  91. assert_equal("characters: \n ", result[i+=1])
  92. assert_equal("end_element: content", result[i+=1])
  93. assert_equal("end_element_ns content, prefix: , uri: http://www.w3.org/2005/Atom", result[i+=1])
  94. assert_equal("characters: \n ", result[i+=1])
  95. assert_equal("end_element: entry", result[i+=1])
  96. assert_equal("end_element_ns entry, prefix: , uri: http://www.w3.org/2005/Atom", result[i+=1])
  97. assert_equal("characters: \n", result[i+=1])
  98. assert_equal("end_element: feed", result[i+=1])
  99. assert_equal("end_element_ns feed, prefix: , uri: http://www.w3.org/2005/Atom", result[i+=1])
  100. assert_equal("end_document", result[i+=1])
  101. end
  102. def test_file
  103. parser = XML::SaxParser.file(saxtest_file)
  104. parser.callbacks = TestCaseCallbacks.new
  105. parser.parse
  106. verify(parser)
  107. end
  108. def test_file_no_callbacks
  109. parser = XML::SaxParser.file(saxtest_file)
  110. assert_equal true, parser.parse
  111. end
  112. def test_noexistent_file
  113. error = assert_raise(XML::Error) do
  114. XML::SaxParser.file('i_dont_exist.xml')
  115. end
  116. assert_equal('Warning: failed to load external entity "i_dont_exist.xml".', error.to_s)
  117. end
  118. def test_nil_file
  119. error = assert_raise(TypeError) do
  120. XML::SaxParser.file(nil)
  121. end
  122. assert_equal("can't convert nil into String", error.to_s)
  123. end
  124. def test_io
  125. File.open(saxtest_file) do |file|
  126. parser = XML::SaxParser.io(file)
  127. parser.callbacks = TestCaseCallbacks.new
  128. parser.parse
  129. verify(parser)
  130. end
  131. end
  132. def test_nil_io
  133. error = assert_raise(TypeError) do
  134. XML::HTMLParser.io(nil)
  135. end
  136. assert_equal("Must pass in an IO object", error.to_s)
  137. end
  138. def test_string_no_callbacks
  139. xml = File.read(saxtest_file)
  140. parser = XML::SaxParser.string(xml)
  141. assert_equal true, parser.parse
  142. end
  143. def test_string
  144. xml = File.read(saxtest_file)
  145. parser = XML::SaxParser.string(xml)
  146. parser.callbacks = TestCaseCallbacks.new
  147. parser.parse
  148. verify(parser)
  149. end
  150. def test_string_io
  151. xml = File.read(saxtest_file)
  152. io = StringIO.new(xml)
  153. parser = XML::SaxParser.io(io)
  154. parser.callbacks = TestCaseCallbacks.new
  155. parser.parse
  156. verify(parser)
  157. end
  158. def test_nil_string
  159. error = assert_raise(TypeError) do
  160. XML::SaxParser.string(nil)
  161. end
  162. assert_equal("wrong argument type nil (expected String)", error.to_s)
  163. end
  164. def test_doctype
  165. xml = <<-EOS
  166. <?xml version="1.0" encoding="UTF-8"?>
  167. <!DOCTYPE Results SYSTEM "results.dtd">
  168. <Results>
  169. <a>a1</a>
  170. </Results>
  171. EOS
  172. parser = XML::SaxParser.string(xml)
  173. parser.callbacks = DocTypeCallback.new
  174. doc = parser.parse
  175. assert_not_nil(doc)
  176. end
  177. def test_parse_warning
  178. # Two xml PIs is a warning
  179. xml = <<-EOS
  180. <?xml version="1.0" encoding="utf-8"?>
  181. <?xml-invalid?>
  182. <Test/>
  183. EOS
  184. parser = XML::SaxParser.string(xml)
  185. parser.callbacks = TestCaseCallbacks.new
  186. parser.parse
  187. # Check callbacks
  188. result = parser.callbacks.result
  189. i = -1
  190. assert_equal("startdoc", result[i+=1])
  191. assert_equal("error: Warning: xmlParsePITarget: invalid name prefix 'xml' at :2.", result[i+=1])
  192. assert_equal("pi: xml-invalid ", result[i+=1])
  193. assert_equal("start_element: Test, attr: {}", result[i+=1])
  194. assert_equal("start_element_ns: Test, attr: {}, prefix: , uri: , ns: {}", result[i+=1])
  195. assert_equal("end_element: Test", result[i+=1])
  196. assert_equal("end_element_ns Test, prefix: , uri: ", result[i+=1])
  197. assert_equal("end_document", result[i+=1])
  198. end
  199. def test_parse_error
  200. xml = <<-EOS
  201. <Results>
  202. EOS
  203. parser = XML::SaxParser.string(xml)
  204. parser.callbacks = TestCaseCallbacks.new
  205. error = assert_raise(XML::Error) do
  206. doc = parser.parse
  207. end
  208. # Check callbacks
  209. result = parser.callbacks.result
  210. i = -1
  211. assert_equal("startdoc", result[i+=1])
  212. assert_equal("start_element: Results, attr: {}", result[i+=1])
  213. assert_equal("start_element_ns: Results, attr: {}, prefix: , uri: , ns: {}", result[i+=1])
  214. assert_equal("characters: \n", result[i+=1])
  215. assert_equal("error: Fatal error: Premature end of data in tag Results line 1 at :2.", result[i+=1])
  216. assert_equal("end_document", result[i+=1])
  217. assert_not_nil(error)
  218. assert_kind_of(XML::Error, error)
  219. assert_equal("Fatal error: Premature end of data in tag Results line 1 at :2.", error.message)
  220. assert_equal(XML::Error::PARSER, error.domain)
  221. assert_equal(XML::Error::TAG_NOT_FINISHED, error.code)
  222. assert_equal(XML::Error::FATAL, error.level)
  223. assert_nil(error.file)
  224. assert_equal(2, error.line)
  225. assert_equal('Results', error.str1)
  226. assert_nil(error.str2)
  227. assert_nil(error.str3)
  228. assert_equal(1, error.int1)
  229. assert_equal(1, error.int2)
  230. assert_nil(error.node)
  231. end
  232. def test_parse_seg_fail
  233. xml = <<-EOS
  234. <?xml version="1.0" encoding="ISO-8859-1" ?>
  235. <Products>
  236. <Product>
  237. <ProductDescription>
  238. AQUALIA THERMAL Lichte crиme - Versterkende & kalmerende 24 u hydraterende verzorging<br />
  239. Huid wordt continu gehydrateerd, intens versterkt en gekalmeerd.<br />
  240. Hypoallergeen. Geschikt voor de gevoelige huid.<br />
  241. <br />
  242. 01.EFFECTIVITEIT<br />
  243. Intensief gehydrateerd, de huid voelt gekalmeerd. Ze voelt de hele dag soepel en fluweelzacht aan, zonder een trekkerig gevoel. De huid is elastischer, soepeler en stralender. Doeltreffendheid getest onder dermatologisch toezicht. <br />
  244. <br />
  245. 02.GEBRUIK<br />
  246. 's Morgens en/ of 's avonds aanbrengen. <br />
  247. <br />
  248. 03.ACTIEVE INGREDIENTEN<br />
  249. Technologische innovatie: 24 u continue cellulaire vochtnevel. Voor de 1ste keer worden Thermaal Bronwater van Vichy, rijk aan zeldzame mineralen en Actief HyaluronineтДв verwerkt in microcapsules, die deze vervolgens verspreiden in de cellen. <br />
  250. <br />
  251. 04.TEXTUUR<br />
  252. De lichte crиme is verfrissend en trekt makkelijk in. Niet vet en niet kleverig. Zonder 'maskereffect'. <br />
  253. <br />
  254. 05.GEUR<br />
  255. Geparfumeerd <br />
  256. <br />
  257. 06.INHOUD<br />
  258. 40 ml tube <br />
  259. </ProductDescription>
  260. </Product>
  261. </Products>
  262. EOS
  263. parser = XML::SaxParser.string(xml)
  264. parser.callbacks = TestCaseCallbacks.new
  265. error = assert_raise(XML::Error) do
  266. parser.parse
  267. end
  268. assert_equal("Fatal error: xmlParseEntityRef: no name at :5.", error.to_s)
  269. # Check callbacks
  270. result = parser.callbacks.result
  271. end
  272. end