XsdValidatingReaderTests.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653
  1. //
  2. // MonoTests.System.Xml.XsdValidatingReaderTests.cs
  3. //
  4. // Author:
  5. // Atsushi Enomoto <[email protected]>
  6. //
  7. // (C)2003 Atsushi Enomoto
  8. // (C)2005-2007 Novell, Inc.
  9. //
  10. using System;
  11. using System.IO;
  12. using System.Net;
  13. using System.Xml;
  14. using System.Xml.Schema;
  15. using NUnit.Framework;
  16. namespace MonoTests.System.Xml
  17. {
  18. [TestFixture]
  19. public class XsdValidatingReaderTests
  20. {
  21. public XsdValidatingReaderTests ()
  22. {
  23. }
  24. XmlReader xtr;
  25. XmlValidatingReader xvr;
  26. private XmlValidatingReader PrepareXmlReader (string xml)
  27. {
  28. XmlReader reader = new XmlTextReader (xml, XmlNodeType.Document, null);
  29. // XmlDocument doc = new XmlDocument ();
  30. // doc.LoadXml (xml);
  31. // XmlReader reader = new XmlNodeReader (doc);
  32. return new XmlValidatingReader (reader);
  33. }
  34. [Test]
  35. public void TestEmptySchema ()
  36. {
  37. string xml = "<root/>";
  38. xvr = PrepareXmlReader (xml);
  39. xvr.ValidationType = ValidationType.Schema;
  40. xvr.Read (); // Is is missing schema component.
  41. }
  42. [Test]
  43. public void TestSimpleValidation ()
  44. {
  45. string xml = "<root/>";
  46. xvr = PrepareXmlReader (xml);
  47. Assert.AreEqual (ValidationType.Auto, xvr.ValidationType);
  48. XmlSchema schema = new XmlSchema ();
  49. XmlSchemaElement elem = new XmlSchemaElement ();
  50. elem.Name = "root";
  51. schema.Items.Add (elem);
  52. xvr.Schemas.Add (schema);
  53. xvr.Read (); // root
  54. Assert.AreEqual (ValidationType.Auto, xvr.ValidationType);
  55. xvr.Read (); // EOF
  56. xml = "<hoge/>";
  57. xvr = PrepareXmlReader (xml);
  58. xvr.Schemas.Add (schema);
  59. try {
  60. xvr.Read ();
  61. Assert.Fail ("element mismatch is incorrectly allowed");
  62. } catch (XmlSchemaException) {
  63. }
  64. xml = "<hoge xmlns='urn:foo' />";
  65. xvr = PrepareXmlReader (xml);
  66. xvr.Schemas.Add (schema);
  67. try {
  68. xvr.Read ();
  69. Assert.Fail ("Element in different namespace is incorrectly allowed.");
  70. } catch (XmlSchemaException) {
  71. }
  72. }
  73. [Test]
  74. public void TestReadTypedValueSimple ()
  75. {
  76. string xml = "<root>12</root>";
  77. XmlSchema schema = new XmlSchema ();
  78. XmlSchemaElement elem = new XmlSchemaElement ();
  79. elem.Name = "root";
  80. elem.SchemaTypeName = new XmlQualifiedName ("integer", XmlSchema.Namespace);
  81. schema.Items.Add (elem);
  82. // Lap 1:
  83. xvr = PrepareXmlReader (xml);
  84. xvr.Schemas.Add (schema);
  85. // Read directly from root.
  86. object o = xvr.ReadTypedValue ();
  87. Assert.AreEqual (ReadState.Initial, xvr.ReadState);
  88. Assert.IsNull (o);
  89. xvr.Read (); // element root
  90. Assert.AreEqual (XmlNodeType.Element, xvr.NodeType);
  91. Assert.IsNotNull (xvr.SchemaType);
  92. Assert.IsTrue (xvr.SchemaType is XmlSchemaDatatype);
  93. o = xvr.ReadTypedValue (); // read "12"
  94. Assert.AreEqual (XmlNodeType.EndElement, xvr.NodeType);
  95. Assert.IsNotNull (o);
  96. Assert.AreEqual (typeof (decimal), o.GetType ());
  97. decimal n = (decimal) o;
  98. Assert.AreEqual (12, n);
  99. Assert.IsTrue (!xvr.EOF);
  100. Assert.AreEqual ("root", xvr.Name);
  101. Assert.IsNull (xvr.SchemaType); // EndElement's type
  102. // Lap 2:
  103. xvr = PrepareXmlReader (xml);
  104. xvr.Schemas.Add (schema);
  105. xvr.Read (); // root
  106. XmlSchemaDatatype dt = xvr.SchemaType as XmlSchemaDatatype;
  107. Assert.IsNotNull (dt);
  108. Assert.AreEqual (typeof (decimal), dt.ValueType);
  109. Assert.AreEqual (XmlTokenizedType.None, dt.TokenizedType);
  110. xvr.Read (); // text "12"
  111. Assert.IsNull (xvr.SchemaType);
  112. o = xvr.ReadTypedValue ();
  113. // ReadTypedValue is different from ReadString().
  114. Assert.IsNull (o);
  115. }
  116. [Test]
  117. [Ignore ("XML Schema validator should not be available for validating non namespace-aware XmlReader that handled colon as a name character")]
  118. public void TestNamespacesFalse ()
  119. {
  120. // This tests if Namespaces=false is specified, then
  121. // the reader's NamespaceURI should be always string.Empty and
  122. // validation should be done against such schema that has target ns as "".
  123. string xml = "<x:root xmlns:x='urn:foo' />";
  124. xvr = PrepareXmlReader (xml);
  125. xvr.Namespaces = false;
  126. Assert.AreEqual (ValidationType.Auto, xvr.ValidationType);
  127. XmlSchema schema = new XmlSchema ();
  128. schema.TargetNamespace = "urn:foo";
  129. XmlSchemaElement elem = new XmlSchemaElement ();
  130. elem.Name = "root";
  131. schema.Items.Add (elem);
  132. xvr.Schemas.Add (schema);
  133. xvr.Read (); // root
  134. Assert.IsTrue (!xvr.Namespaces);
  135. Assert.AreEqual ("x:root", xvr.Name);
  136. // LocalName may contain colons.
  137. Assert.AreEqual ("x:root", xvr.LocalName);
  138. // NamespaceURI is not supplied.
  139. Assert.AreEqual ("", xvr.NamespaceURI);
  140. }
  141. [Test]
  142. public void TestReadTypedAttributeValue ()
  143. {
  144. string xml = "<root attr='12'></root>";
  145. XmlSchema schema = new XmlSchema ();
  146. XmlSchemaElement elem = new XmlSchemaElement ();
  147. elem.Name = "root";
  148. XmlSchemaComplexType ct = new XmlSchemaComplexType ();
  149. XmlSchemaAttribute attr = new XmlSchemaAttribute ();
  150. attr.Name = "attr";
  151. attr.SchemaTypeName = new XmlQualifiedName ("int", XmlSchema.Namespace);
  152. ct.Attributes.Add (attr);
  153. elem.SchemaType = ct;
  154. schema.Items.Add (elem);
  155. xvr = PrepareXmlReader (xml);
  156. xvr.Schemas.Add (schema);
  157. xvr.Read ();
  158. Assert.AreEqual ("root", xvr.Name);
  159. Assert.IsTrue (xvr.MoveToNextAttribute ()); // attr
  160. Assert.AreEqual ("attr", xvr.Name);
  161. XmlSchemaDatatype dt = xvr.SchemaType as XmlSchemaDatatype;
  162. Assert.IsNotNull (dt);
  163. Assert.AreEqual (typeof (int), dt.ValueType);
  164. Assert.AreEqual (XmlTokenizedType.None, dt.TokenizedType);
  165. object o = xvr.ReadTypedValue ();
  166. Assert.AreEqual (XmlNodeType.Attribute, xvr.NodeType);
  167. Assert.AreEqual (typeof (int), o.GetType ());
  168. int n = (int) o;
  169. Assert.AreEqual (12, n);
  170. Assert.IsTrue (xvr.ReadAttributeValue ()); // can read = seems not proceed.
  171. }
  172. [Test]
  173. public void DuplicateSchemaAssignment ()
  174. {
  175. string xml = @"<data
  176. xmlns='http://www.test.com/schemas/'
  177. xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
  178. xsi:schemaLocation='http://www.test.com/schemas/ /home/user/schema.xsd' />";
  179. string xsd = @"<xs:schema
  180. targetNamespace='http://www.test.com/schemas/'
  181. xmlns:xs='http://www.w3.org/2001/XMLSchema'
  182. xmlns='http://www.test.com/schemas/' >
  183. <xs:element name='data' /></xs:schema>";
  184. string xmlns = "http://www.test.com/schemas/";
  185. XmlValidatingReader xvr = new XmlValidatingReader (
  186. xml, XmlNodeType.Document, null);
  187. XmlSchemaCollection schemas = new XmlSchemaCollection ();
  188. schemas.Add (XmlSchema.Read (new XmlTextReader (
  189. xsd, XmlNodeType.Document, null), null));
  190. xvr.Schemas.Add (schemas);
  191. while (!xvr.EOF)
  192. xvr.Read ();
  193. }
  194. [Test] // bug #76234
  195. public void DTDValidatorNamespaceHandling ()
  196. {
  197. string xml = "<xml xmlns='urn:a'> <foo> <a:bar xmlns='urn:b' xmlns:a='urn:a' /> <bug /> </foo> </xml>";
  198. XmlValidatingReader vr = new XmlValidatingReader (
  199. xml, XmlNodeType.Document, null);
  200. vr.Read ();
  201. vr.Read (); // whitespace
  202. Assert.AreEqual (String.Empty, vr.NamespaceURI, "#1");
  203. vr.Read (); // foo
  204. Assert.AreEqual ("urn:a", vr.NamespaceURI, "#2");
  205. vr.Read (); // whitespace
  206. vr.Read (); // a:bar
  207. Assert.AreEqual ("urn:a", vr.NamespaceURI, "#3");
  208. vr.Read (); // whitespace
  209. vr.Read (); // bug
  210. Assert.AreEqual ("urn:a", vr.NamespaceURI, "#4");
  211. }
  212. [Test]
  213. public void MultipleSchemaInSchemaLocation ()
  214. {
  215. XmlTextReader xtr = new XmlTextReader ("Test/XmlFiles/xsd/multi-schemaLocation.xml");
  216. XmlValidatingReader vr = new XmlValidatingReader (xtr);
  217. while (!vr.EOF)
  218. vr.Read ();
  219. }
  220. [Test]
  221. public void ReadTypedValueSimpleTypeRestriction ()
  222. {
  223. string xml = "<root>xx</root><!-- after -->";
  224. string xsd = @"
  225. <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
  226. <xs:element name='root'>
  227. <xs:simpleType>
  228. <xs:restriction base='xs:string'>
  229. <xs:minLength value='2' />
  230. </xs:restriction>
  231. </xs:simpleType>
  232. </xs:element>
  233. </xs:schema>";
  234. XmlTextReader xir =
  235. new XmlTextReader (xml, XmlNodeType.Document, null);
  236. XmlTextReader xsr =
  237. new XmlTextReader (xsd, XmlNodeType.Document, null);
  238. XmlValidatingReader vr = new XmlValidatingReader (xir);
  239. vr.Schemas.Add (XmlSchema.Read (xsr, null));
  240. vr.Read (); // root
  241. Assert.AreEqual ("xx", vr.ReadTypedValue ());
  242. Assert.AreEqual (XmlNodeType.EndElement, vr.NodeType);
  243. }
  244. // If we normalize string before validating with facets,
  245. // this test will fail. It will also fail if ReadTypedValue()
  246. // ignores whitespace nodes.
  247. [Test]
  248. public void ReadTypedValueWhitespaces ()
  249. {
  250. string xml = "<root> </root><!-- after -->";
  251. string xsd = @"
  252. <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
  253. <xs:element name='root'>
  254. <xs:simpleType>
  255. <xs:restriction base='xs:string'>
  256. <xs:minLength value='2' />
  257. </xs:restriction>
  258. </xs:simpleType>
  259. </xs:element>
  260. </xs:schema>";
  261. XmlTextReader xir =
  262. new XmlTextReader (xml, XmlNodeType.Document, null);
  263. XmlTextReader xsr =
  264. new XmlTextReader (xsd, XmlNodeType.Document, null);
  265. XmlValidatingReader vr = new XmlValidatingReader (xir);
  266. vr.Schemas.Add (XmlSchema.Read (xsr, null));
  267. vr.Read (); // root
  268. Assert.AreEqual (" ", vr.ReadTypedValue ());
  269. Assert.AreEqual (XmlNodeType.EndElement, vr.NodeType);
  270. }
  271. [Test] // bug #77241
  272. public void EmptyContentAllowWhitespace ()
  273. {
  274. string doc = @"
  275. <root>
  276. <!-- some comment -->
  277. <child/>
  278. </root>
  279. ";
  280. string schema = @"
  281. <xsd:schema xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
  282. <xsd:element name=""root"">
  283. <xsd:complexType>
  284. <xsd:sequence>
  285. <xsd:element name=""child"" type=""xsd:string"" />
  286. </xsd:sequence>
  287. </xsd:complexType>
  288. </xsd:element>
  289. </xsd:schema>
  290. ";
  291. XmlValidatingReader reader = new XmlValidatingReader (
  292. new XmlTextReader (new StringReader (doc)));
  293. reader.Schemas.Add (null,
  294. new XmlTextReader (new StringReader (schema)));
  295. while (reader.Read ())
  296. ;
  297. }
  298. [Test] // bug #79650
  299. #if NET_2_0
  300. // annoyance
  301. [ExpectedException (typeof (XmlSchemaValidationException))]
  302. #else
  303. [ExpectedException (typeof (XmlSchemaException))]
  304. #endif
  305. public void EnumerationFacetOnAttribute ()
  306. {
  307. string xml = "<test mode='NOT A ENUMERATION VALUE' />";
  308. XmlSchema schema = XmlSchema.Read (new XmlTextReader ("Test/XmlFiles/xsd/79650.xsd"), null);
  309. XmlValidatingReader xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
  310. xvr.ValidationType = ValidationType.Schema;
  311. xvr.Schemas.Add (schema);
  312. while (!xvr.EOF)
  313. xvr.Read ();
  314. }
  315. class XmlErrorResolver : XmlResolver
  316. {
  317. public override ICredentials Credentials {
  318. set { }
  319. }
  320. public override object GetEntity (Uri uri, string role, Type type)
  321. {
  322. throw new Exception ();
  323. }
  324. }
  325. [Test] // bug #79924
  326. public void ValidationTypeNoneIgnoreSchemaLocations ()
  327. {
  328. string xml = "<project xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='nosuchschema.xsd'/>";
  329. XmlValidatingReader vr = new XmlValidatingReader (
  330. new XmlTextReader (new StringReader (xml)));
  331. vr.ValidationType = ValidationType.None;
  332. vr.XmlResolver = new XmlErrorResolver ();
  333. while (!vr.EOF)
  334. vr.Read ();
  335. }
  336. [Test] // bug #336625
  337. public void ValidationTypeNoneIgnoreLocatedSchemaErrors ()
  338. {
  339. string xml = "<test xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='Test/XmlFiles/xsd/336625.xsd'/>";
  340. XmlValidatingReader vr = new XmlValidatingReader (
  341. new XmlTextReader (new StringReader (xml)));
  342. vr.ValidationType = ValidationType.None;
  343. while (!vr.EOF)
  344. vr.Read ();
  345. }
  346. [Test]
  347. public void Bug81360 ()
  348. {
  349. string schemaFile = "Test/XmlFiles/xsd/81360.xsd";
  350. XmlTextReader treader = new XmlTextReader (schemaFile);
  351. XmlSchema sc = XmlSchema.Read (treader, null);
  352. sc.Compile (null);
  353. string xml = @"<body xmlns='" + sc.TargetNamespace + "'><div></div></body>";
  354. XmlTextReader reader = new XmlTextReader (new StringReader (xml));
  355. XmlValidatingReader validator = new XmlValidatingReader (reader);
  356. validator.Schemas.Add (sc);
  357. validator.ValidationType = ValidationType.Schema;
  358. while (!validator.EOF)
  359. validator.Read ();
  360. }
  361. #if NET_2_0
  362. [Test]
  363. public void Bug81460 ()
  364. {
  365. string xsd = "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'><xs:element name='foo'><xs:complexType><xs:attribute name='a' default='x' /></xs:complexType></xs:element></xs:schema>";
  366. string xml = "<foo/>";
  367. XmlReaderSettings s = new XmlReaderSettings ();
  368. s.ValidationType = ValidationType.Schema;
  369. s.Schemas.Add (XmlSchema.Read (new StringReader (xsd), null));
  370. XmlReader r = XmlReader.Create (new StringReader (xml), s);
  371. r.Read ();
  372. r.MoveToFirstAttribute (); // default attribute
  373. Assert.AreEqual (String.Empty, r.Prefix);
  374. }
  375. #endif
  376. [Test]
  377. #if NET_2_0
  378. // annoyance
  379. [ExpectedException (typeof (XmlSchemaValidationException))]
  380. #else
  381. [ExpectedException (typeof (XmlSchemaException))]
  382. #endif
  383. public void Bug82099 ()
  384. {
  385. string xsd = @"
  386. <xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
  387. <xsd:element name='Customer' type='CustomerType' />
  388. <xsd:complexType name='CustomerType'>
  389. <xsd:attribute name='name' type='xsd:string' />
  390. </xsd:complexType>
  391. </xsd:schema>";
  392. XmlSchema schema = XmlSchema.Read (new StringReader (xsd), null);
  393. string xml = "<Customer name='Bob'> </Customer>";
  394. #if NET_2_0
  395. XmlReaderSettings settings = new XmlReaderSettings ();
  396. settings.Schemas.Add (schema);
  397. settings.ValidationType = ValidationType.Schema;
  398. XmlReader reader = XmlReader.Create (new StringReader (xml), settings);
  399. #else
  400. XmlValidatingReader reader = new XmlValidatingReader (xml, XmlNodeType.Document, null);
  401. reader.Schemas.Add (schema);
  402. reader.ValidationType = ValidationType.Schema;
  403. #endif
  404. reader.Read ();
  405. reader.Read ();
  406. reader.Read ();
  407. }
  408. [Test]
  409. public void Bug82010 ()
  410. {
  411. string xmlfile = "Test/XmlFiles/xsd/82010.xml";
  412. string xsdfile = "Test/XmlFiles/xsd/82010.xsd";
  413. XmlTextReader xr = null, xr2 = null;
  414. try {
  415. xr = new XmlTextReader (xsdfile);
  416. xr2 = new XmlTextReader (xmlfile);
  417. XmlValidatingReader xvr = new XmlValidatingReader (xr2);
  418. xvr.Schemas.Add (XmlSchema.Read (xr, null));
  419. while (!xvr.EOF)
  420. xvr.Read ();
  421. } finally {
  422. if (xr2 != null)
  423. xr2.Close ();
  424. if (xr != null)
  425. xr.Close ();
  426. }
  427. }
  428. [Test]
  429. public void Bug376395 ()
  430. {
  431. string xmlfile = "Test/XmlFiles/xsd/376395.xml";
  432. string xsdfile = "Test/XmlFiles/xsd/376395.xsd";
  433. XmlTextReader xr = null, xr2 = null;
  434. try {
  435. xr = new XmlTextReader (xsdfile);
  436. xr2 = new XmlTextReader (xmlfile);
  437. XmlValidatingReader xvr = new XmlValidatingReader (xr2);
  438. xvr.Schemas.Add (XmlSchema.Read (xr, null));
  439. while (!xvr.EOF)
  440. xvr.Read ();
  441. } finally {
  442. if (xr2 != null)
  443. xr2.Close ();
  444. if (xr != null)
  445. xr.Close ();
  446. }
  447. }
  448. [Test]
  449. public void ValidateMixedInsideXsdAny ()
  450. {
  451. string xml = @"<root xmlns='urn:foo'>
  452. <X><Z>text</Z></X>
  453. <Y><X><Z>text</Z></X></Y>
  454. </root>";
  455. string xsd = @"
  456. <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'
  457. targetNamespace='urn:foo' xmlns='urn:foo'>
  458. <xs:complexType name='root-type'>
  459. <xs:sequence><xs:element ref='X' /><xs:element ref='Y' /></xs:sequence>
  460. </xs:complexType>
  461. <xs:complexType name='X-type'>
  462. <xs:choice minOccurs='1' maxOccurs='unbounded'>
  463. <xs:any processContents='skip'/>
  464. </xs:choice>
  465. </xs:complexType>
  466. <xs:complexType name='Y-type'>
  467. <xs:sequence><xs:element ref='X' /></xs:sequence>
  468. </xs:complexType>
  469. <xs:element name='root' type='root-type' />
  470. <xs:element name='X' type='X-type' />
  471. <xs:element name='Y' type='Y-type' />
  472. </xs:schema>";
  473. XmlTextReader xtr = new XmlTextReader (new StringReader (xml));
  474. XmlValidatingReader xvr = new XmlValidatingReader (xtr);
  475. XmlReader xsr = new XmlTextReader (new StringReader (xsd));
  476. xvr.Schemas.Add (XmlSchema.Read (xsr, null));
  477. while (!xvr.EOF)
  478. xvr.Read ();
  479. #if NET_2_0
  480. xtr = new XmlTextReader (new StringReader (xml));
  481. xsr = new XmlTextReader (new StringReader (xsd));
  482. var s = new XmlReaderSettings ();
  483. s.Schemas.Add (XmlSchema.Read (xsr, null));
  484. s.ValidationType = ValidationType.Schema;
  485. XmlReader xvr2 = XmlReader.Create (xtr, s);
  486. while (!xvr2.EOF)
  487. xvr2.Read ();
  488. #endif
  489. }
  490. #if NET_2_0
  491. [Test]
  492. public void WhitespaceAndElementOnly ()
  493. {
  494. string xsd = @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
  495. <xs:element name='element_list'>
  496. <xs:complexType>
  497. <xs:sequence>
  498. <xs:element name='element' maxOccurs='unbounded' />
  499. </xs:sequence>
  500. </xs:complexType>
  501. </xs:element>
  502. </xs:schema>";
  503. string xml = @"<element_list>
  504. <!-- blah blah blah -->
  505. <element />
  506. <!-- blah blah -->
  507. <element />
  508. </element_list>";
  509. RunValidation (xml, xsd);
  510. }
  511. [Test]
  512. [ExpectedException (typeof (XmlSchemaValidationException))]
  513. public void EnumerationFacet ()
  514. {
  515. // bug #339934
  516. string xsd = @"<xs:schema id='schema' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
  517. <xs:simpleType name='ModeType'>
  518. <xs:restriction base='xs:string'>
  519. <xs:enumeration value='on' />
  520. <xs:enumeration value='off' />
  521. </xs:restriction>
  522. </xs:simpleType>
  523. <xs:element name='test'>
  524. <xs:complexType>
  525. <xs:sequence/>
  526. <xs:attribute name='mode' type='ModeType' use='required' />
  527. </xs:complexType>
  528. </xs:element>
  529. </xs:schema>";
  530. string xml = @"<test mode='out of scope'></test>";
  531. RunValidation (xml, xsd);
  532. }
  533. [Test]
  534. public void Bug501763 ()
  535. {
  536. string xsd1 = @"
  537. <xs:schema id='foo1'
  538. targetNamespace='foo1'
  539. elementFormDefault='qualified'
  540. xmlns='foo1'
  541. xmlns:xs='http://www.w3.org/2001/XMLSchema'
  542. xmlns:f2='foo2'>
  543. <xs:import namespace='foo2' />
  544. <xs:element name='Foo1Element' type='f2:Foo2ExtendedType'/>
  545. </xs:schema>";
  546. string xsd2 = @"
  547. <xs:schema id='foo2'
  548. targetNamespace='foo2'
  549. elementFormDefault='qualified'
  550. xmlns='foo2'
  551. xmlns:xs='http://www.w3.org/2001/XMLSchema' >
  552. <xs:element name='Foo2Element' type='Foo2Type' />
  553. <xs:complexType name='Foo2Type'>
  554. <xs:attribute name='foo2Attr' type='xs:string' use='required'/>
  555. </xs:complexType>
  556. <xs:complexType name='Foo2ExtendedType'>
  557. <xs:complexContent>
  558. <xs:extension base='Foo2Type'>
  559. <xs:attribute name='foo2ExtAttr' type='xs:string' use='required'/>
  560. </xs:extension>
  561. </xs:complexContent>
  562. </xs:complexType>
  563. </xs:schema>";
  564. XmlDocument doc = new XmlDocument ();
  565. XmlSchema schema1 = XmlSchema.Read (XmlReader.Create (new StringReader (xsd1)), null);
  566. XmlSchema schema2 = XmlSchema.Read (XmlReader.Create (new StringReader (xsd2)), null);
  567. doc.LoadXml (@"
  568. <Foo2Element
  569. foo2Attr='dummyvalue1'
  570. xmlns='foo2'
  571. />");
  572. doc.Schemas.Add (schema2);
  573. doc.Validate (null);
  574. doc = new XmlDocument();
  575. doc.LoadXml(@"
  576. <Foo1Element
  577. foo2Attr='dummyvalue1'
  578. foo2ExtAttr='dummyvalue2'
  579. xmlns='foo1'
  580. />");
  581. doc.Schemas.Add (schema2);
  582. doc.Schemas.Add (schema1);
  583. doc.Validate (null);
  584. }
  585. void RunValidation (string xml, string xsd)
  586. {
  587. XmlReaderSettings s = new XmlReaderSettings ();
  588. s.ValidationType = ValidationType.Schema;
  589. s.Schemas.Add (XmlSchema.Read (XmlReader.Create (new StringReader (xsd)), null));
  590. XmlReader r = XmlReader.Create (new StringReader (xml), s);
  591. while (!r.EOF)
  592. r.Read ();
  593. }
  594. #endif
  595. }
  596. }