XmlWriterSettingsTests.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. //
  2. // System.Xml.XmlWriterSettingsTests.cs
  3. //
  4. // Authors:
  5. // Atsushi Enomoto <[email protected]>
  6. //
  7. // (C)2004 Novell Inc.
  8. //
  9. #if NET_2_0
  10. using System;
  11. using System.IO;
  12. using System.Text;
  13. using System.Xml;
  14. using System.Xml.Schema;
  15. using NUnit.Framework;
  16. namespace MonoTests.System.Xml
  17. {
  18. [TestFixture]
  19. public class XmlWriterSettingsTests
  20. {
  21. [Test]
  22. public void DefaultValue ()
  23. {
  24. XmlWriterSettings s = new XmlWriterSettings ();
  25. DefaultValue (s);
  26. s.Reset ();
  27. DefaultValue (s);
  28. }
  29. private void DefaultValue (XmlWriterSettings s)
  30. {
  31. Assert.AreEqual (true, s.CheckCharacters);
  32. Assert.AreEqual (false, s.CloseOutput);
  33. Assert.AreEqual (ConformanceLevel.Document, s.ConformanceLevel);
  34. Assert.AreEqual (Encoding.UTF8, s.Encoding);
  35. Assert.AreEqual (false, s.Indent);
  36. Assert.AreEqual (" ", s.IndentChars);
  37. Assert.AreEqual ("\r\n", s.NewLineChars);
  38. Assert.AreEqual (false, s.NewLineOnAttributes);
  39. Assert.AreEqual (false, s.OmitXmlDeclaration);
  40. Assert.AreEqual (NewLineHandling.Replace, s.NewLineHandling);
  41. #if NET_4_5
  42. Assert.IsFalse (s.Async);
  43. #endif
  44. }
  45. [Test]
  46. [Category ("MobileNotWorking")]
  47. public void EncodingTest ()
  48. {
  49. // For Stream it makes sense
  50. XmlWriterSettings s = new XmlWriterSettings ();
  51. s.Encoding = Encoding.GetEncoding ("shift_jis");
  52. MemoryStream ms = new MemoryStream ();
  53. XmlWriter w = XmlWriter.Create (ms, s);
  54. w.WriteStartElement ("root");
  55. w.WriteEndElement ();
  56. w.Close ();
  57. byte [] data = ms.ToArray ();
  58. Assert.IsTrue (data.Length != 0);
  59. string str = s.Encoding.GetString (data);
  60. Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"shift_jis\"?><root />", str);
  61. // For TextWriter it does not make sense
  62. StringWriter sw = new StringWriter ();
  63. w = XmlWriter.Create (sw, s);
  64. w.WriteStartElement ("root");
  65. w.WriteEndElement ();
  66. w.Close ();
  67. Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?><root />", sw.ToString ());
  68. }
  69. [Test]
  70. [ExpectedException (typeof (ArgumentException))]
  71. public void CheckCharactersTest ()
  72. {
  73. XmlWriterSettings s = new XmlWriterSettings ();
  74. StringWriter sw = new StringWriter ();
  75. XmlWriter w = XmlWriter.Create (sw, s);
  76. w.WriteStartElement ("root");
  77. w.WriteString ("\0"); // invalid
  78. w.WriteEndElement ();
  79. w.Close ();
  80. }
  81. [Test]
  82. public void CheckCharactersFalseTest ()
  83. {
  84. XmlWriterSettings s = new XmlWriterSettings ();
  85. s.CheckCharacters = false;
  86. StringWriter sw = new StringWriter ();
  87. XmlWriter w = XmlWriter.Create (sw, s);
  88. w.WriteStartElement ("root");
  89. w.WriteString ("\0"); // invalid
  90. w.WriteEndElement ();
  91. }
  92. [Test]
  93. [ExpectedException (typeof (ObjectDisposedException))]
  94. public void CloseOutputTest ()
  95. {
  96. XmlWriterSettings s = new XmlWriterSettings ();
  97. s.CloseOutput = true;
  98. StringWriter sw = new StringWriter ();
  99. XmlWriter w = XmlWriter.Create (sw, s);
  100. w.WriteStartElement ("root");
  101. w.WriteEndElement ();
  102. w.Close ();
  103. sw.Write ("more"); // not allowed
  104. }
  105. [Test]
  106. [ExpectedException (typeof (InvalidOperationException))]
  107. public void ConformanceLevelFragmentAndWriteStartDocument ()
  108. {
  109. XmlWriterSettings s = new XmlWriterSettings ();
  110. s.ConformanceLevel = ConformanceLevel.Fragment;
  111. s.OmitXmlDeclaration = true;
  112. XmlWriter w = XmlWriter.Create (Console.Out, s);
  113. w.WriteStartDocument ();
  114. }
  115. [Test]
  116. public void ConformanceLevelAuto ()
  117. {
  118. XmlWriterSettings s = new XmlWriterSettings ();
  119. s.ConformanceLevel = ConformanceLevel.Auto;
  120. StringWriter sw = new StringWriter ();
  121. XmlWriter w = XmlWriter.Create (sw, s);
  122. w.WriteElementString ("foo", "");
  123. w.Close ();
  124. Assert.AreEqual ("<foo />", sw.ToString ());
  125. }
  126. [Test]
  127. public void ConformanceLevelAuto_WriteStartDocument ()
  128. {
  129. XmlWriterSettings s = new XmlWriterSettings ();
  130. s.ConformanceLevel = ConformanceLevel.Auto;
  131. StringWriter sw = new StringWriter ();
  132. XmlWriter w = XmlWriter.Create (sw, s);
  133. w.WriteStartDocument ();
  134. w.WriteElementString ("foo", "");
  135. w.Close ();
  136. Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?><foo />", sw.ToString ());
  137. }
  138. [Test]
  139. public void ConformanceLevelAuto_OmitXmlDecl_WriteStartDocument ()
  140. {
  141. XmlWriterSettings s = new XmlWriterSettings ();
  142. s.ConformanceLevel = ConformanceLevel.Auto;
  143. s.OmitXmlDeclaration = true;
  144. StringWriter sw = new StringWriter ();
  145. XmlWriter w = XmlWriter.Create (sw, s);
  146. w.WriteStartDocument ();
  147. w.WriteElementString ("foo", "");
  148. w.Close ();
  149. Assert.AreEqual ("<foo />", sw.ToString ());
  150. }
  151. [Test]
  152. public void ConformanceLevelDocument_OmitXmlDeclDeclaration ()
  153. {
  154. XmlWriterSettings s = new XmlWriterSettings ();
  155. s.ConformanceLevel = ConformanceLevel.Document;
  156. // LAMESPEC:
  157. // On MSDN, XmlWriterSettings.OmitXmlDeclaration is documented as:
  158. // "The XML declaration is always written if
  159. // ConformanceLevel is set to Document, even
  160. // if OmitXmlDeclaration is set to true. "
  161. // but it is incorrect. It does consider
  162. // OmitXmlDeclaration property.
  163. s.OmitXmlDeclaration = true;
  164. StringWriter sw = new StringWriter ();
  165. XmlWriter w = XmlWriter.Create (sw, s);
  166. w.WriteElementString ("foo", "");
  167. w.Close ();
  168. Assert.AreEqual ("<foo />", sw.ToString ());
  169. }
  170. [Test]
  171. public void IndentationAndFormatting ()
  172. {
  173. // Test for Indent, IndentChars, NewLineOnAttributes,
  174. // NewLineChars and OmitXmlDeclaration.
  175. string output = "<root\n attr=\"value\"\n attr2=\"value\">\n <child>test</child>\n</root>";
  176. XmlWriterSettings s = new XmlWriterSettings ();
  177. s.OmitXmlDeclaration = true;
  178. s.Indent = true;
  179. s.IndentChars = " ";
  180. s.NewLineChars = "\n";
  181. s.NewLineOnAttributes = true;
  182. StringWriter sw = new StringWriter ();
  183. XmlWriter w = XmlWriter.Create (sw, s);
  184. w.WriteStartElement ("root");
  185. w.WriteAttributeString ("attr", "value");
  186. w.WriteAttributeString ("attr2", "value");
  187. w.WriteStartElement ("child");
  188. w.WriteString ("test");
  189. w.WriteEndElement ();
  190. w.WriteEndElement ();
  191. w.Close ();
  192. Assert.AreEqual (output, sw.ToString ());
  193. }
  194. [Test]
  195. public void SetEncodingNull ()
  196. {
  197. // null is allowed.
  198. new XmlWriterSettings ().Encoding = null;
  199. }
  200. [Test]
  201. [ExpectedException (typeof (ArgumentNullException))]
  202. public void NewLineCharsNull ()
  203. {
  204. new XmlWriterSettings ().NewLineChars = null;
  205. }
  206. [Test]
  207. public void CreateOmitXmlDeclaration ()
  208. {
  209. StringBuilder sb = new StringBuilder ();
  210. // Even if XmlWriter is allowed to write fragment,
  211. // DataContractSerializer never allows it to write
  212. // content in contentOnly mode.
  213. XmlWriterSettings settings = new XmlWriterSettings ();
  214. settings.OmitXmlDeclaration = true;
  215. //settings.ConformanceLevel = ConformanceLevel.Fragment;
  216. XmlWriter w = XmlWriter.Create (sb, settings);
  217. w.WriteStartElement ("root");
  218. w.WriteEndElement ();
  219. w.Flush ();
  220. Assert.AreEqual ("<root />", sb.ToString ());
  221. }
  222. [Test]
  223. public void NewLineOnAttributesMixedContent ()
  224. {
  225. StringWriter sw = new StringWriter ();
  226. XmlWriterSettings s = new XmlWriterSettings ();
  227. s.NewLineOnAttributes = true;
  228. s.OmitXmlDeclaration = true;
  229. XmlWriter w = XmlWriter.Create (sw, s);
  230. w.WriteStartElement ("root");
  231. w.WriteAttributeString ("a", "v");
  232. w.WriteAttributeString ("b", "x");
  233. w.WriteString ("some string");
  234. w.WriteEndElement ();
  235. w.Close ();
  236. Assert.AreEqual ("<root a=\"v\" b=\"x\">some string</root>", sw.ToString (), "#1");
  237. // mixed content: bug #81770
  238. string expected = "<root>some string<mixed\n a=\"v\"\n b=\"x\">some string</mixed></root>";
  239. s.Indent = true;
  240. sw = new StringWriter ();
  241. w = XmlWriter.Create (sw, s);
  242. w.WriteStartElement ("root");
  243. w.WriteString ("some string");
  244. w.WriteStartElement ("mixed");
  245. w.WriteAttributeString ("a", "v");
  246. w.WriteAttributeString ("b", "x");
  247. w.WriteString ("some string");
  248. w.WriteEndElement ();
  249. w.WriteEndElement ();
  250. w.Close ();
  251. Assert.AreEqual (expected, sw.ToString ().Replace ("\r\n", "\n"), "#2");
  252. }
  253. [Test]
  254. public void OmitXmlDeclarationAndNewLine ()
  255. {
  256. XmlDocument doc = new XmlDocument ();
  257. doc.LoadXml ("<root/>");
  258. XmlWriterSettings settings = new XmlWriterSettings ();
  259. settings.OmitXmlDeclaration = true;
  260. settings.NewLineChars = "\r\n";
  261. settings.NewLineHandling = NewLineHandling.Replace;
  262. settings.Encoding = Encoding.UTF8;
  263. settings.Indent = true;
  264. StringWriter sw = new StringWriter ();
  265. using (XmlWriter xw = XmlWriter.Create (sw, settings)) {
  266. doc.Save (xw);
  267. }
  268. // no heading newline.
  269. Assert.AreEqual ("<root />", sw.ToString ());
  270. }
  271. [Test] // surprisingly niche behavior yet caused bug #3231.
  272. public void IndentAndTopLevelWhitespaces ()
  273. {
  274. var sw = new StringWriter ();
  275. var xw = XmlWriter.Create (sw, new XmlWriterSettings () { Indent = true });
  276. xw.WriteProcessingInstruction ("xml", "version='1.0'");
  277. xw.WriteWhitespace ("\n");
  278. xw.WriteComment ("AAA");
  279. xw.WriteWhitespace ("\n");
  280. xw.WriteWhitespace ("\n");
  281. xw.WriteStartElement ("root");
  282. xw.Close ();
  283. string xml = @"<?xml version='1.0'?>
  284. <!--AAA-->
  285. <root />";
  286. Assert.AreEqual (xml, sw.ToString ().Replace ("\r\n", "\n"), "#1");
  287. }
  288. [Test]
  289. public void NewlineHandlingNone ()
  290. {
  291. var sw = new StringWriter ();
  292. var xw = XmlWriter.Create (sw, new XmlWriterSettings () { NewLineHandling = NewLineHandling.None });
  293. xw.WriteStartElement("root");
  294. xw.WriteElementString("element", "lf\ncr\rcrlf\r\nht\t");
  295. xw.WriteStartElement("element");
  296. xw.WriteAttributeString("attr", "lf\ncr\rcrlf\r\nht\t");
  297. xw.WriteEndElement();
  298. xw.WriteEndElement();
  299. xw.Close();
  300. string xml = "<?xml version=\"1.0\" encoding=\"utf-16\"?><root><element>lf\ncr\rcrlf\r\nht\t</element><element attr=\"lf\ncr\rcrlf\r\nht\t\" /></root>";
  301. Assert.AreEqual (xml, sw.ToString ());
  302. }
  303. [Test]
  304. public void NewlineHandlingReplace ()
  305. {
  306. var sw = new StringWriter ();
  307. var xw = XmlWriter.Create (sw, new XmlWriterSettings () {
  308. NewLineHandling = NewLineHandling.Replace,
  309. NewLineChars = "\n"
  310. });
  311. xw.WriteStartElement("root");
  312. xw.WriteElementString("element", "lf\ncr\rcrlf\r\nht\t");
  313. xw.WriteStartElement("element");
  314. xw.WriteAttributeString("attr", "lf\ncr\rcrlf\r\nht\t");
  315. xw.WriteEndElement();
  316. xw.WriteEndElement();
  317. xw.Close();
  318. string xml = "<?xml version=\"1.0\" encoding=\"utf-16\"?><root><element>lf\ncr\ncrlf\nht\t</element><element attr=\"lf&#xA;cr&#xD;crlf&#xD;&#xA;ht&#x9;\" /></root>";
  319. Assert.AreEqual (xml, sw.ToString ());
  320. }
  321. [Test]
  322. public void NewlineHandlingReplaceCRLF ()
  323. {
  324. var sw = new StringWriter ();
  325. var xw = XmlWriter.Create (sw, new XmlWriterSettings () {
  326. NewLineHandling = NewLineHandling.Replace,
  327. NewLineChars = "\r\n"
  328. });
  329. xw.WriteStartElement("root");
  330. xw.WriteElementString("element", "lf\ncr\rcrlf\r\nht\t");
  331. xw.WriteStartElement("element");
  332. xw.WriteAttributeString("attr", "lf\ncr\rcrlf\r\nht\t");
  333. xw.WriteEndElement();
  334. xw.WriteEndElement();
  335. xw.Close();
  336. string xml = "<?xml version=\"1.0\" encoding=\"utf-16\"?><root><element>lf\r\ncr\r\ncrlf\r\nht\t</element><element attr=\"lf&#xA;cr&#xD;crlf&#xD;&#xA;ht&#x9;\" /></root>";
  337. Assert.AreEqual (xml, sw.ToString ());
  338. }
  339. [Test]
  340. public void NewlineHandlingEntitize ()
  341. {
  342. var sw = new StringWriter ();
  343. var xw = XmlWriter.Create (sw, new XmlWriterSettings () {
  344. NewLineHandling = NewLineHandling.Entitize,
  345. NewLineChars = "\n"
  346. });
  347. xw.WriteStartElement("root");
  348. xw.WriteElementString("element", "lf\ncr\rcrlf\r\nht\t");
  349. xw.WriteStartElement("element");
  350. xw.WriteAttributeString("attr", "lf\ncr\rcrlf\r\nht\t");
  351. xw.WriteEndElement();
  352. xw.WriteEndElement();
  353. xw.Close();
  354. string xml = "<?xml version=\"1.0\" encoding=\"utf-16\"?><root><element>lf\ncr&#xD;crlf&#xD;\nht\t</element><element attr=\"lf&#xA;cr&#xD;crlf&#xD;&#xA;ht&#x9;\" /></root>";
  355. Assert.AreEqual (xml, sw.ToString ());
  356. }
  357. #if NET_4_5
  358. [Test]
  359. [ExpectedException (typeof (InvalidOperationException))]
  360. public void ReadonlyAsync ()
  361. {
  362. var sw = new StringWriter ();
  363. var s = new XmlWriterSettings ();
  364. var w = XmlWriter.Create (sw, s);
  365. w.Settings.Async = true;
  366. }
  367. [Test]
  368. public void AsyncPropagation ()
  369. {
  370. var sw = new StringWriter ();
  371. var s = new XmlWriterSettings ();
  372. s.Async = true;
  373. var w = XmlWriter.Create (sw, s);
  374. var c = s.Clone ();
  375. Assert.IsTrue (c.Async);
  376. c.Reset ();
  377. Assert.IsFalse (c.Async);
  378. var w2 = XmlWriter.Create (w, c);
  379. Assert.IsTrue (w2.Settings.Async);
  380. }
  381. #endif
  382. }
  383. }
  384. #endif