PageRenderTime 36ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 1ms

/projects/jruby-1.7.3/test/externals/ruby1.9/rexml/test_validation_rng.rb

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Ruby | 790 lines | 693 code | 93 blank | 4 comment | 0 complexity | 0566a75db36989ce3abd3c521168e0fb MD5 | raw file
  1. require "test/unit/testcase"
  2. require "rexml/document"
  3. require "rexml/validation/relaxng"
  4. class RNGValidation < Test::Unit::TestCase
  5. include REXML
  6. def test_validate
  7. rng = %q{
  8. <?xml version="1.0" encoding="UTF-8"?>
  9. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  10. <element name="B">
  11. <element name="C">
  12. <attribute name="X"/>
  13. <zeroOrMore>
  14. <element name="E">
  15. <empty/>
  16. </element>
  17. </zeroOrMore>
  18. </element>
  19. <element name="D">
  20. <empty/>
  21. </element>
  22. </element>
  23. </element>
  24. }
  25. validator = REXML::Validation::RelaxNG.new( rng )
  26. no_error( validator, %q{<A><B><C X="x"><E/><E/></C><D/></B></A>} )
  27. error( validator, %q{<A><B><D/><C X="x"/></B></A>} )
  28. end
  29. def test_sequence
  30. rng = %q{
  31. <?xml version="1.0" encoding="UTF-8"?>
  32. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  33. <element name="B">
  34. <element name="C">
  35. <empty/>
  36. </element>
  37. <element name="D">
  38. <empty/>
  39. </element>
  40. </element>
  41. </element>
  42. }
  43. validator = REXML::Validation::RelaxNG.new( rng )
  44. error( validator, %q{<A><B><C/><C/><D/></B></A>} )
  45. error( validator, %q{<A><B><D/><C/></B></A>} )
  46. error( validator, %q{<A><C/><D/></A>} )
  47. no_error( validator, %q{<A><B><C/><D/></B></A>} )
  48. end
  49. def test_choice
  50. rng = %q{
  51. <?xml version="1.0" encoding="UTF-8"?>
  52. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  53. <element name="B">
  54. <choice>
  55. <element name="C">
  56. <empty/>
  57. </element>
  58. <element name="D">
  59. <empty/>
  60. </element>
  61. </choice>
  62. </element>
  63. </element>
  64. }
  65. validator = REXML::Validation::RelaxNG.new( rng )
  66. error( validator, %q{<A><B><C/><D/></B></A>} )
  67. no_error( validator, %q{<A><B><D/></B></A>} )
  68. no_error( validator, %q{<A><B><C/></B></A>} )
  69. end
  70. def test_optional
  71. rng = %q{
  72. <?xml version="1.0" encoding="UTF-8"?>
  73. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  74. <element name="B">
  75. <optional>
  76. <element name="C">
  77. <empty/>
  78. </element>
  79. </optional>
  80. </element>
  81. </element>
  82. }
  83. validator = REXML::Validation::RelaxNG.new( rng )
  84. no_error( validator, %q{<A><B/></A>} )
  85. no_error( validator, %q{<A><B><C/></B></A>} )
  86. error( validator, %q{<A><B><D/></B></A>} )
  87. error( validator, %q{<A><B><C/><C/></B></A>} )
  88. end
  89. def test_zero_or_more
  90. rng = %q{
  91. <?xml version="1.0" encoding="UTF-8"?>
  92. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  93. <element name="B">
  94. <zeroOrMore>
  95. <element name="C">
  96. <empty/>
  97. </element>
  98. </zeroOrMore>
  99. </element>
  100. </element>
  101. }
  102. validator = REXML::Validation::RelaxNG.new( rng )
  103. no_error( validator, %q{<A><B/></A>} )
  104. no_error( validator, %q{<A><B><C/></B></A>} )
  105. no_error( validator, %q{<A><B><C/><C/><C/></B></A>} )
  106. error( validator, %q{<A><B><D/></B></A>} )
  107. error( validator, %q{<A></A>} )
  108. rng = %q{
  109. <?xml version="1.0" encoding="UTF-8"?>
  110. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  111. <element name="B">
  112. <zeroOrMore>
  113. <element name="C">
  114. <empty/>
  115. </element>
  116. <element name="D">
  117. <empty/>
  118. </element>
  119. </zeroOrMore>
  120. </element>
  121. </element>
  122. }
  123. validator = REXML::Validation::RelaxNG.new( rng )
  124. no_error( validator, %q{<A><B/></A>} )
  125. no_error( validator, %q{<A><B><C/><D/></B></A>} )
  126. no_error( validator, %q{<A><B><C/><D/><C/><D/></B></A>} )
  127. error( validator, %q{<A><B><D/></B></A>} )
  128. end
  129. def test_one_or_more
  130. rng = %q{
  131. <?xml version="1.0" encoding="UTF-8"?>
  132. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  133. <element name="B">
  134. <oneOrMore>
  135. <element name="C">
  136. <empty/>
  137. </element>
  138. </oneOrMore>
  139. </element>
  140. </element>
  141. }
  142. validator = REXML::Validation::RelaxNG.new( rng )
  143. error( validator, %q{<A><B/></A>} )
  144. no_error( validator, %q{<A><B><C/></B></A>} )
  145. no_error( validator, %q{<A><B><C/><C/><C/></B></A>} )
  146. error( validator, %q{<A><B><D/></B></A>} )
  147. error( validator, %q{<A></A>} )
  148. end
  149. def test_attribute
  150. rng = %q{
  151. <?xml version="1.0" encoding="UTF-8"?>
  152. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  153. <attribute name="X"/>
  154. <attribute name="Y"/>
  155. </element>
  156. }
  157. validator = REXML::Validation::RelaxNG.new( rng )
  158. error( validator, %q{<A><B/></A>} )
  159. error( validator, %q{<A/>} )
  160. error( validator, %q{<A X=""/>} )
  161. no_error( validator, %q{<A X="1" Y="1"/>} )
  162. end
  163. def test_choice_attributes
  164. rng = %q{
  165. <?xml version="1.0" encoding="UTF-8"?>
  166. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  167. <choice>
  168. <attribute name="X"/>
  169. <attribute name="Y"/>
  170. </choice>
  171. </element>
  172. }
  173. validator = REXML::Validation::RelaxNG.new( rng )
  174. error( validator, %q{<A X="1" Y="1"/>} )
  175. error( validator, %q{<A/>} )
  176. no_error( validator, %q{<A X="1"/>})
  177. no_error( validator, %q{<A Y="1"/>} )
  178. end
  179. def test_choice_attribute_element
  180. rng = %q{
  181. <?xml version="1.0" encoding="UTF-8"?>
  182. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  183. <choice>
  184. <attribute name="X"/>
  185. <element name="B"/>
  186. </choice>
  187. </element>
  188. }
  189. validator = REXML::Validation::RelaxNG.new( rng )
  190. error( validator, %q{<A X="1"><B/></A>} )
  191. error( validator, %q{<A/>} )
  192. no_error( validator, %q{<A X="1"/>})
  193. no_error( validator, %q{<A><B/></A>} )
  194. end
  195. def test_empty
  196. rng = %q{
  197. <?xml version="1.0" encoding="UTF-8"?>
  198. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  199. <empty/>
  200. </element>
  201. }
  202. validator = REXML::Validation::RelaxNG.new( rng )
  203. error( validator, %q{<A><B/></A>} )
  204. error( validator, %q{<A>Text</A>} )
  205. no_error( validator, %q{<A/>})
  206. end
  207. def test_text_val
  208. rng = %q{
  209. <?xml version="1.0" encoding="UTF-8"?>
  210. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  211. <text/>
  212. </element>
  213. }
  214. validator = REXML::Validation::RelaxNG.new( rng )
  215. error( validator, %q{<A><B/></A>} )
  216. no_error( validator, %q{<A>Text</A>} )
  217. error( validator, %q{<A/>})
  218. end
  219. def test_choice_text
  220. rng = %q{
  221. <?xml version="1.0" encoding="UTF-8"?>
  222. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  223. <choice>
  224. <element name="B"/>
  225. <text/>
  226. </choice>
  227. </element>
  228. }
  229. validator = REXML::Validation::RelaxNG.new( rng )
  230. error( validator, %q{<A><B/>Text</A>} )
  231. error( validator, %q{<A>Text<B/></A>} )
  232. no_error( validator, %q{<A>Text</A>} )
  233. no_error( validator, %q{<A><B/></A>} )
  234. end
  235. def test_group
  236. rng = %q{
  237. <?xml version="1.0" encoding="UTF-8"?>
  238. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  239. <choice>
  240. <element name="B"/>
  241. <group>
  242. <element name="C"/>
  243. <element name="D"/>
  244. </group>
  245. </choice>
  246. </element>
  247. }
  248. validator = REXML::Validation::RelaxNG.new( rng )
  249. error( validator, %q{<A><B/><C/></A>} )
  250. error( validator, %q{<A><C/></A>} )
  251. no_error( validator, %q{<A><B/></A>} )
  252. no_error( validator, %q{<A><C/><D/></A>} )
  253. rng = %q{
  254. <?xml version="1.0" encoding="UTF-8"?>
  255. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  256. <element name="B"/>
  257. <group>
  258. <element name="C"/>
  259. <element name="D"/>
  260. </group>
  261. </element>
  262. }
  263. validator = REXML::Validation::RelaxNG.new( rng )
  264. error( validator, %q{<A><B/><C/></A>} )
  265. error( validator, %q{<A><B/><D/></A>} )
  266. error( validator, %q{<A><B/></A>} )
  267. no_error( validator, %q{<A><B/><C/><D/></A>} )
  268. end
  269. def test_value
  270. # Values as text nodes
  271. rng = %q{
  272. <?xml version="1.0" encoding="UTF-8"?>
  273. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  274. <element name="B">
  275. <value>VaLuE</value>
  276. </element>
  277. </element>
  278. }
  279. validator = REXML::Validation::RelaxNG.new( rng )
  280. error( validator, %q{<A><B>X</B></A>} )
  281. error( validator, %q{<A><B/></A>} )
  282. no_error( validator, %q{<A><B>VaLuE</B></A>} )
  283. # Values as text nodes, via choice
  284. rng = %q{
  285. <?xml version="1.0" encoding="UTF-8"?>
  286. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  287. <element name="B">
  288. <choice>
  289. <value>Option 1</value>
  290. <value>Option 2</value>
  291. </choice>
  292. </element>
  293. </element>
  294. }
  295. validator = REXML::Validation::RelaxNG.new( rng )
  296. error( validator, %q{<A><B/></A>} )
  297. error( validator, %q{<A><B>XYZ</B></A>} )
  298. no_error( validator, %q{<A><B>Option 1</B></A>} )
  299. no_error( validator, %q{<A><B>Option 2</B></A>} )
  300. # Attribute values
  301. rng = %q{
  302. <?xml version="1.0" encoding="UTF-8"?>
  303. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  304. <attribute name="B">
  305. <value>VaLuE</value>
  306. </attribute>
  307. </element>
  308. }
  309. validator = REXML::Validation::RelaxNG.new( rng )
  310. error( validator, %q{<A/>} )
  311. error( validator, %q{<A B=""/>} )
  312. error( validator, %q{<A B="Lala"/>} )
  313. no_error( validator, %q{<A B="VaLuE"/>} )
  314. # Attribute values via choice
  315. rng = %q{
  316. <?xml version="1.0" encoding="UTF-8"?>
  317. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  318. <attribute name="B">
  319. <choice>
  320. <value>Option 1</value>
  321. <value>Option 2</value>
  322. </choice>
  323. </attribute>
  324. </element>
  325. }
  326. validator = REXML::Validation::RelaxNG.new( rng )
  327. error( validator, %q{<A B=""/>} )
  328. error( validator, %q{<A B="Value"/>} )
  329. no_error( validator, %q{<A B="Option 1"></A>} )
  330. no_error( validator, %q{<A B="Option 2"/>} )
  331. end
  332. def test_interleave
  333. rng = %q{
  334. <?xml version="1.0" encoding="UTF-8"?>
  335. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  336. <element name="B">
  337. <interleave>
  338. <element name="C"/>
  339. <element name="D"/>
  340. <element name="E"/>
  341. </interleave>
  342. </element>
  343. </element>
  344. }
  345. validator = REXML::Validation::RelaxNG.new( rng )
  346. error( validator, %q{<A><B><C/></B></A>} )
  347. error( validator, %q{<A><B><C/><D/><C/></B></A>} )
  348. no_error( validator, %q{<A><B><C/><D/><E/></B></A>} )
  349. no_error( validator, %q{<A><B><E/><D/><C/></B></A>} )
  350. no_error( validator, %q{<A><B><D/><C/><E/></B></A>} )
  351. no_error( validator, %q{<A><B><E/><C/><D/></B></A>} )
  352. error( validator, %q{<A><B><E/><C/><D/><C/></B></A>} )
  353. end
  354. def test_mixed
  355. rng = %q{
  356. <?xml version="1.0" encoding="UTF-8"?>
  357. <element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
  358. <element name="B">
  359. <mixed>
  360. <element name="D"/>
  361. </mixed>
  362. </element>
  363. </element>
  364. }
  365. validator = REXML::Validation::RelaxNG.new( rng )
  366. no_error( validator, %q{<A><B>Text<D/></B></A>} )
  367. no_error( validator, %q{<A><B><D/>Text</B></A>} )
  368. end
  369. def test_ref_sequence
  370. rng = %q{
  371. <?xml version="1.0" encoding="UTF-8"?>
  372. <grammar xmlns="http://relaxng.org/ns/structure/1.0">
  373. <start>
  374. <element name="A">
  375. <ref name="B"/>
  376. <ref name="B"/>
  377. </element>
  378. </start>
  379. <define name="B">
  380. <element name="B">
  381. <attribute name="X"/>
  382. </element>
  383. </define>
  384. </grammar>
  385. }
  386. validator = REXML::Validation::RelaxNG.new( rng )
  387. no_error( validator, %q{<A><B X=''/><B X=''/></A>} )
  388. error( validator, %q{<A><B X=''/></A>} )
  389. end
  390. def test_ref_choice
  391. rng = %q{
  392. <?xml version="1.0" encoding="UTF-8"?>
  393. <grammar xmlns="http://relaxng.org/ns/structure/1.0">
  394. <start>
  395. <element name="A">
  396. <choice>
  397. <ref name="B"/>
  398. </choice>
  399. </element>
  400. </start>
  401. <define name="B">
  402. <element name="B"/>
  403. <element name="C"/>
  404. </define>
  405. </grammar>
  406. }
  407. validator = REXML::Validation::RelaxNG.new( rng )
  408. error( validator, %q{<A><D/></A>} )
  409. error( validator, %q{<A><B/><C/></A>} )
  410. no_error( validator, %q{<A><B/></A>} )
  411. no_error( validator, %q{<A><C/></A>} )
  412. rng = %q{
  413. <?xml version="1.0" encoding="UTF-8"?>
  414. <grammar xmlns="http://relaxng.org/ns/structure/1.0">
  415. <start>
  416. <element name="A">
  417. <ref name="B"/>
  418. </element>
  419. </start>
  420. <define name="B">
  421. <choice>
  422. <element name="B"/>
  423. <element name="C"/>
  424. </choice>
  425. </define>
  426. </grammar>
  427. }
  428. validator = REXML::Validation::RelaxNG.new( rng )
  429. error( validator, %q{<A><D/></A>} )
  430. error( validator, %q{<A><B/><C/></A>} )
  431. no_error( validator, %q{<A><B/></A>} )
  432. no_error( validator, %q{<A><C/></A>} )
  433. rng = %q{
  434. <?xml version="1.0" encoding="UTF-8"?>
  435. <grammar xmlns="http://relaxng.org/ns/structure/1.0">
  436. <start>
  437. <element name="A">
  438. <choice>
  439. <ref name="B"/>
  440. <element name="D"/>
  441. </choice>
  442. </element>
  443. </start>
  444. <define name="B">
  445. <element name="B"/>
  446. <element name="C"/>
  447. </define>
  448. </grammar>
  449. }
  450. validator = REXML::Validation::RelaxNG.new( rng )
  451. error( validator, %q{<A><B/><C/></A>} )
  452. no_error( validator, %q{<A><B/></A>} )
  453. no_error( validator, %q{<A><C/></A>} )
  454. no_error( validator, %q{<A><D/></A>} )
  455. end
  456. def test_ref_zero_plus
  457. rng = %q{
  458. <?xml version="1.0" encoding="UTF-8"?>
  459. <grammar xmlns="http://relaxng.org/ns/structure/1.0">
  460. <start>
  461. <element name="A">
  462. <zeroOrMore>
  463. <ref name="B"/>
  464. </zeroOrMore>
  465. </element>
  466. </start>
  467. <define name="B">
  468. <element name="B">
  469. <attribute name="X"/>
  470. </element>
  471. </define>
  472. </grammar>
  473. }
  474. validator = REXML::Validation::RelaxNG.new( rng )
  475. error( validator, %q{<A><B/></A>} )
  476. no_error( validator, %q{<A/>} )
  477. no_error( validator, %q{<A><B X=''/></A>} )
  478. no_error( validator, %q{<A><B X=''/><B X=''/><B X=''/></A>} )
  479. rng = %q{
  480. <?xml version="1.0" encoding="UTF-8"?>
  481. <grammar xmlns="http://relaxng.org/ns/structure/1.0">
  482. <start>
  483. <element name="A">
  484. <ref name="B"/>
  485. </element>
  486. </start>
  487. <define name="B">
  488. <zeroOrMore>
  489. <element name="B">
  490. <attribute name="X"/>
  491. </element>
  492. </zeroOrMore>
  493. </define>
  494. </grammar>
  495. }
  496. validator = REXML::Validation::RelaxNG.new( rng )
  497. error( validator, %q{<A><B/></A>} )
  498. no_error( validator, %q{<A/>} )
  499. no_error( validator, %q{<A><B X=''/></A>} )
  500. no_error( validator, %q{<A><B X=''/><B X=''/><B X=''/></A>} )
  501. end
  502. def test_ref_one_plus
  503. rng = %q{
  504. <?xml version="1.0" encoding="UTF-8"?>
  505. <grammar xmlns="http://relaxng.org/ns/structure/1.0">
  506. <start>
  507. <element name="A">
  508. <oneOrMore>
  509. <ref name="B"/>
  510. </oneOrMore>
  511. </element>
  512. </start>
  513. <define name="B">
  514. <element name="B">
  515. <attribute name="X"/>
  516. </element>
  517. </define>
  518. </grammar>
  519. }
  520. validator = REXML::Validation::RelaxNG.new( rng )
  521. error( validator, %q{<A><B/></A>} )
  522. error( validator, %q{<A/>} )
  523. no_error( validator, %q{<A><B X=''/></A>} )
  524. no_error( validator, %q{<A><B X=''/><B X=''/><B X=''/></A>} )
  525. rng = %q{
  526. <?xml version="1.0" encoding="UTF-8"?>
  527. <grammar xmlns="http://relaxng.org/ns/structure/1.0">
  528. <start>
  529. <element name="A">
  530. <ref name="B"/>
  531. </element>
  532. </start>
  533. <define name="B">
  534. <oneOrMore>
  535. <element name="B">
  536. <attribute name="X"/>
  537. </element>
  538. </oneOrMore>
  539. </define>
  540. </grammar>
  541. }
  542. validator = REXML::Validation::RelaxNG.new( rng )
  543. error( validator, %q{<A><B/></A>} )
  544. error( validator, %q{<A/>} )
  545. no_error( validator, %q{<A><B X=''/></A>} )
  546. no_error( validator, %q{<A><B X=''/><B X=''/><B X=''/></A>} )
  547. end
  548. def test_ref_interleave
  549. rng = %q{
  550. <?xml version="1.0" encoding="UTF-8"?>
  551. <grammar xmlns="http://relaxng.org/ns/structure/1.0">
  552. <start>
  553. <element name="A">
  554. <interleave>
  555. <ref name="B"/>
  556. </interleave>
  557. </element>
  558. </start>
  559. <define name="B">
  560. <element name="B"/>
  561. <element name="C"/>
  562. </define>
  563. </grammar>
  564. }
  565. validator = REXML::Validation::RelaxNG.new( rng )
  566. error( validator, %q{<A><B/></A>} )
  567. error( validator, %q{<A><C/></A>} )
  568. error( validator, %q{<A><C/><C/></A>} )
  569. no_error( validator, %q{<A><B/><C/></A>} )
  570. no_error( validator, %q{<A><C/><B/></A>} )
  571. rng = %q{
  572. <?xml version="1.0" encoding="UTF-8"?>
  573. <grammar xmlns="http://relaxng.org/ns/structure/1.0">
  574. <start>
  575. <element name="A">
  576. <ref name="B"/>
  577. </element>
  578. </start>
  579. <define name="B">
  580. <interleave>
  581. <element name="B"/>
  582. <element name="C"/>
  583. </interleave>
  584. </define>
  585. </grammar>
  586. }
  587. validator = REXML::Validation::RelaxNG.new( rng )
  588. error( validator, %q{<A><B/></A>} )
  589. error( validator, %q{<A><C/></A>} )
  590. error( validator, %q{<A><C/><C/></A>} )
  591. no_error( validator, %q{<A><B/><C/></A>} )
  592. no_error( validator, %q{<A><C/><B/></A>} )
  593. rng = %q{
  594. <?xml version="1.0" encoding="UTF-8"?>
  595. <grammar xmlns="http://relaxng.org/ns/structure/1.0">
  596. <start>
  597. <element name="A">
  598. <interleave>
  599. <ref name="B"/>
  600. <ref name="C"/>
  601. </interleave>
  602. </element>
  603. </start>
  604. <define name="B">
  605. <element name="B"/>
  606. </define>
  607. <define name="C">
  608. <element name="C"/>
  609. </define>
  610. </grammar>
  611. }
  612. validator = REXML::Validation::RelaxNG.new( rng )
  613. error( validator, %q{<A><B/></A>} )
  614. error( validator, %q{<A><C/></A>} )
  615. error( validator, %q{<A><C/><C/></A>} )
  616. no_error( validator, %q{<A><B/><C/></A>} )
  617. no_error( validator, %q{<A><C/><B/></A>} )
  618. end
  619. def test_ref_recurse
  620. rng = %q{
  621. <?xml version="1.0" encoding="UTF-8"?>
  622. <grammar xmlns="http://relaxng.org/ns/structure/1.0">
  623. <start>
  624. <element name="A">
  625. <ref name="B"/>
  626. </element>
  627. </start>
  628. <define name="B">
  629. <element name="B">
  630. <optional>
  631. <ref name="B"/>
  632. </optional>
  633. </element>
  634. </define>
  635. </grammar>
  636. }
  637. validator = REXML::Validation::RelaxNG.new( rng )
  638. error( validator, %q{<A></A>} )
  639. no_error( validator, %q{<A><B/></A>} )
  640. no_error( validator, %q{<A><B><B/></B></A>} )
  641. end
  642. def test_ref_optional
  643. rng = %q{
  644. <?xml version="1.0" encoding="UTF-8"?>
  645. <grammar xmlns="http://relaxng.org/ns/structure/1.0">
  646. <start>
  647. <element name="A">
  648. <optional>
  649. <ref name="B"/>
  650. </optional>
  651. </element>
  652. </start>
  653. <define name="B">
  654. <element name="B">
  655. </element>
  656. </define>
  657. </grammar>
  658. }
  659. validator = REXML::Validation::RelaxNG.new( rng )
  660. no_error( validator, %q{<A></A>} )
  661. no_error( validator, %q{<A><B/></A>} )
  662. error( validator, %q{<A><B/><B/></A>} )
  663. error( validator, %q{<A><C/></A>} )
  664. rng = %q{
  665. <?xml version="1.0" encoding="UTF-8"?>
  666. <grammar xmlns="http://relaxng.org/ns/structure/1.0">
  667. <start>
  668. <element name="A">
  669. <ref name="B"/>
  670. </element>
  671. </start>
  672. <define name="B">
  673. <optional>
  674. <element name="B">
  675. </element>
  676. </optional>
  677. </define>
  678. </grammar>
  679. }
  680. validator = REXML::Validation::RelaxNG.new( rng )
  681. no_error( validator, %q{<A></A>} )
  682. no_error( validator, %q{<A><B/></A>} )
  683. error( validator, %q{<A><B/><B/></A>} )
  684. error( validator, %q{<A><C/></A>} )
  685. end
  686. def error( validator, source )
  687. parser = REXML::Parsers::TreeParser.new( source )
  688. parser.add_listener( validator.reset )
  689. assert_raise( REXML::Validation::ValidationException,
  690. "Expected a validation error" ) { parser.parse }
  691. end
  692. def no_error( validator, source )
  693. parser = REXML::Parsers::TreeParser.new( source )
  694. parser.add_listener( validator.reset )
  695. assert_nothing_raised { parser.parse }
  696. end
  697. end