XmlConvertTests.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800
  1. //
  2. // System.Xml.XmlConvertTests.cs
  3. //
  4. // Authors: Atsushi Enomoto ([email protected]), Jon Kessler ([email protected])
  5. //
  6. // (C) 2003 Atsushi Enomoto, Jon Kessler
  7. //
  8. using System;
  9. using System.Globalization;
  10. using System.Xml;
  11. using NUnit.Framework;
  12. namespace MonoTests.System.Xml
  13. {
  14. [TestFixture]
  15. public class XmlConvertTests
  16. {
  17. private void AssertName (string result, string source)
  18. {
  19. Assert.AreEqual (result,
  20. XmlConvert.EncodeName (source));
  21. }
  22. private void AssertNmToken (string result, string source)
  23. {
  24. Assert.AreEqual (result,
  25. XmlConvert.EncodeNmToken (source));
  26. }
  27. [Test]
  28. public void DecodeName ()
  29. {
  30. Assert.AreEqual (null, XmlConvert.DecodeName (null));
  31. Assert.AreEqual ("", XmlConvert.DecodeName (""));
  32. Assert.AreEqual ("Test", XmlConvert.DecodeName ("Test"));
  33. Assert.AreEqual ("_Test", XmlConvert.DecodeName ("_Test"));
  34. Assert.AreEqual ("_hello_friends", XmlConvert.DecodeName ("_hello_friends"));
  35. Assert.AreEqual ("_hello friends", XmlConvert.DecodeName ("_hello friends"));
  36. Assert.AreEqual (" ", XmlConvert.DecodeName ("_x0020_"));
  37. }
  38. [Test]
  39. public void EncodeLocalName ()
  40. {
  41. Assert.IsNull (XmlConvert.EncodeLocalName (null));
  42. Assert.AreEqual (String.Empty, XmlConvert.EncodeLocalName (String.Empty));
  43. Assert.AreEqual ("Hello_x003A__x0020_", XmlConvert.EncodeLocalName ("Hello: "));
  44. Assert.AreEqual ("Hello", XmlConvert.EncodeLocalName ("Hello"));
  45. }
  46. [Test]
  47. public void EncodeName ()
  48. {
  49. Assert.IsNull (XmlConvert.EncodeName (null));
  50. Assert.AreEqual (String.Empty, XmlConvert.EncodeName (String.Empty));
  51. AssertName ("Test", "Test");
  52. AssertName ("Hello_x0020_my_x0020_friends.", "Hello my friends.");
  53. AssertName ("_x0031_23", "123");
  54. AssertName ("_x005F_x0031_23", "_x0031_23");
  55. }
  56. [Test]
  57. public void EncodeNmToken ()
  58. {
  59. Assert.IsNull (XmlConvert.EncodeNmToken (null));
  60. AssertNmToken ("Test", "Test");
  61. AssertNmToken ("Hello_x0020_my_x0020_friends.", "Hello my friends.");
  62. AssertNmToken ("123", "123");
  63. AssertNmToken ("_x005F_x0031_23", "_x0031_23");
  64. }
  65. [Test]
  66. [ExpectedException (typeof (XmlException))]
  67. public void EncodeNmTokenError ()
  68. {
  69. XmlConvert.EncodeNmToken (String.Empty);
  70. }
  71. [Test]
  72. public void ToBoolean ()
  73. {
  74. Assert.AreEqual (true, XmlConvert.ToBoolean (" 1 "));
  75. Assert.AreEqual (true, XmlConvert.ToBoolean (" true "));
  76. Assert.AreEqual (false, XmlConvert.ToBoolean (" 0 "));
  77. Assert.AreEqual (false, XmlConvert.ToBoolean (" false "));
  78. try
  79. {
  80. Assert.AreEqual (false, XmlConvert.ToBoolean (" invalid "));
  81. }
  82. catch (FormatException)
  83. {
  84. }
  85. }
  86. [Test]
  87. public void ToByte ()
  88. {
  89. Assert.AreEqual (255, XmlConvert.ToByte ("255"));
  90. }
  91. [Test]
  92. public void ToChar ()
  93. {
  94. Assert.AreEqual ('x', XmlConvert.ToChar ("x"));
  95. }
  96. [Test]
  97. public void ToDateTime ()
  98. {
  99. //dateTime
  100. Assert.AreEqual (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00").Ticks);
  101. Assert.AreEqual (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0").Ticks);
  102. Assert.AreEqual (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00").Ticks);
  103. Assert.AreEqual (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000").Ticks);
  104. Assert.AreEqual (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000").Ticks);
  105. Assert.AreEqual (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00000").Ticks);
  106. Assert.AreEqual (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000000").Ticks);
  107. Assert.AreEqual (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000000").Ticks);
  108. /*
  109. // These tests also failed on MS.NET
  110. Assert.AreEqual (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00+13:00").Ticks);
  111. Assert.AreEqual (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0+13:00").Ticks);
  112. Assert.AreEqual (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00+13:00").Ticks);
  113. Assert.AreEqual (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000+13:00").Ticks);
  114. Assert.AreEqual (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000+13:00").Ticks);
  115. Assert.AreEqual (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00000+13:00").Ticks);
  116. Assert.AreEqual (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000000+13:00").Ticks);
  117. Assert.AreEqual (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000000+13:00").Ticks);
  118. Assert.AreEqual (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00Z").Ticks);
  119. Assert.AreEqual (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0Z").Ticks);
  120. Assert.AreEqual (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00Z").Ticks);
  121. Assert.AreEqual (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000Z").Ticks);
  122. Assert.AreEqual (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000Z").Ticks);
  123. Assert.AreEqual (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00000Z").Ticks);
  124. Assert.AreEqual (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000000Z").Ticks);
  125. Assert.AreEqual (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000000Z").Ticks);
  126. */
  127. //time
  128. DateTime t1 = new DateTime (DateTime.Today.Year, 1, 1);
  129. t1 = DateTime.Today + new TimeSpan (12,0,0);
  130. Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00").Ticks);
  131. Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.0").Ticks);
  132. Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.00").Ticks);
  133. Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.000").Ticks);
  134. Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.0000").Ticks);
  135. Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.00000").Ticks);
  136. Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.000000").Ticks);
  137. Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.0000000").Ticks);
  138. //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00+13:00").Ticks);//doesn't work on .NET
  139. //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.f+13:00").Ticks);//doesn't work on .NET
  140. //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ff+13:00").Ticks);//doesn't work on .NET
  141. //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fff+13:00").Ticks);//doesn't work on .NET
  142. //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ffff+13:00").Ticks);//doesn't work on .NET
  143. //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fffff+13:00").Ticks);//doesn't work on .NET
  144. //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ffffff+13:00").Ticks);//doesn't work on .NET
  145. //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fffffff+13:00").Ticks);//doesn't work on .NET
  146. //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00Z").Ticks);//doesn't work on .NET
  147. //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fZ").Ticks);//doesn't work on .NET
  148. //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ffZ").Ticks);//doesn't work on .NET
  149. //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fffZ").Ticks);//doesn't work on .NET
  150. //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ffffZ").Ticks);//doesn't work on .NET
  151. //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fffffZ").Ticks);//doesn't work on .NET
  152. //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ffffffZ").Ticks);//doesn't work on .NET
  153. //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fffffffZ").Ticks);//doesn't work on .NET
  154. //date
  155. Assert.AreEqual (632001312000000000L, XmlConvert.ToDateTime ("2003-09-26").Ticks);
  156. // Assert.AreEqual (632000664000000000L, XmlConvert.ToDateTime ("2003-09-26+13:00").Ticks);
  157. // Assert.AreEqual (632001132000000000L, XmlConvert.ToDateTime ("2003-09-26Z").Ticks);
  158. //gYearMonth
  159. Assert.AreEqual (631979712000000000L, XmlConvert.ToDateTime ("2003-09").Ticks);
  160. // Assert.AreEqual (631979064000000000L, XmlConvert.ToDateTime ("2003-09+13:00").Ticks);
  161. // Assert.AreEqual (631979532000000000L, XmlConvert.ToDateTime ("2003-09Z").Ticks);
  162. //gYear
  163. Assert.AreEqual (631769760000000000L, XmlConvert.ToDateTime ("2003").Ticks);
  164. // Assert.AreEqual (631769076000000000L, XmlConvert.ToDateTime ("2003+13:00").Ticks);
  165. // Assert.AreEqual (631769544000000000L, XmlConvert.ToDateTime ("2003Z").Ticks);
  166. //gMonthDay
  167. // Don't try locale-dependent test
  168. // Assert.AreEqual (632001312000000000L, XmlConvert.ToDateTime ("--09-26").Ticks);//shouldn't have a hardcoded value
  169. // Assert.AreEqual (632000664000000000L, XmlConvert.ToDateTime ("--09-26+13:00").Ticks);//shouldn't have a hardcoded value
  170. // Assert.AreEqual (632001132000000000L, XmlConvert.ToDateTime ("--09-26Z").Ticks);//shouldn't have a hardcoded value
  171. //gDay
  172. // Don't try locale-dependent test
  173. // Assert.AreEqual (631791360000000000L, XmlConvert.ToDateTime ("---26").Ticks);//shouldn't have a hardcoded value
  174. // Assert.AreEqual (631790676000000000L, XmlConvert.ToDateTime ("---26+13:00").Ticks);//shouldn't have a hardcoded value
  175. // Assert.AreEqual (631791144000000000L, XmlConvert.ToDateTime ("---26Z").Ticks);//shouldn't have a hardcoded value
  176. try
  177. {
  178. Assert.AreEqual (45L, XmlConvert.ToDateTime (";ljdfas;kl").Ticks);
  179. }
  180. catch (Exception)
  181. {
  182. }
  183. }
  184. [Test]
  185. public void ToDecimal ()
  186. {
  187. Assert.AreEqual (1.987, XmlConvert.ToDecimal ("1.987"));
  188. }
  189. [Test]
  190. public void ToDouble ()
  191. {
  192. Assert.AreEqual (1.0d/0.0d, XmlConvert.ToDouble ("INF"));
  193. Assert.AreEqual (-1.0d/0.0d, XmlConvert.ToDouble ("-INF"));
  194. Assert.AreEqual (0.0d/0.0d, XmlConvert.ToDouble ("NaN"));
  195. Assert.AreEqual (789324, XmlConvert.ToDouble ("789324"));
  196. Assert.AreEqual (42, XmlConvert.ToDouble (" 42 "));
  197. Assert.AreEqual (double.NaN, XmlConvert.ToDouble (" NaN "));
  198. Assert.AreEqual (double.PositiveInfinity, XmlConvert.ToDouble (" Infinity "));
  199. Assert.AreEqual (double.NegativeInfinity, XmlConvert.ToDouble (" -Infinity "));
  200. Assert.AreEqual (double.PositiveInfinity, XmlConvert.ToDouble (" INF"));
  201. Assert.AreEqual (double.NegativeInfinity, XmlConvert.ToDouble (" -INF "));
  202. }
  203. [Test]
  204. public void ToDoubleRoundtrip ()
  205. {
  206. // bug #320424
  207. string s = XmlConvert.ToString (double.MaxValue);
  208. Assert.AreEqual (double.MaxValue, XmlConvert.ToDouble (s));
  209. }
  210. [Test]
  211. public void ToGuid ()
  212. {
  213. Assert.AreEqual (new Guid ("ca761232-ed42-11ce-bacd-00aa0057b223"), XmlConvert.ToGuid ("ca761232-ed42-11ce-bacd-00aa0057b223"));
  214. }
  215. [Test]
  216. public void ToInt16 ()
  217. {
  218. Assert.AreEqual (0, XmlConvert.ToInt16 ("0"), "0");
  219. Assert.AreEqual (-1, XmlConvert.ToInt16 ("-1"), "-1");
  220. Assert.AreEqual (1, XmlConvert.ToInt16 ("1"), "1");
  221. Assert.AreEqual (32767, XmlConvert.ToInt16 ("32767"), "32767");
  222. Assert.AreEqual (-32768, XmlConvert.ToInt16 ("-32768"), "-32768");
  223. try {
  224. XmlConvert.ToInt16 ("32768");
  225. Assert.Fail ("32768");
  226. } catch (OverflowException) {
  227. }
  228. try {
  229. XmlConvert.ToInt16 ("-32769");
  230. Assert.Fail ("-32769");
  231. } catch (OverflowException) {
  232. }
  233. try {
  234. XmlConvert.ToInt16 ("0x100");
  235. Assert.Fail ("0x100");
  236. } catch (FormatException) {
  237. }
  238. }
  239. [Test]
  240. public void ToInt32 ()
  241. {
  242. Assert.AreEqual (0, XmlConvert.ToInt32 ("0"), "0");
  243. Assert.AreEqual (-1, XmlConvert.ToInt32 ("-1"), "-1");
  244. Assert.AreEqual (1, XmlConvert.ToInt32 ("1"), "1");
  245. Assert.AreEqual (int.MaxValue, XmlConvert.ToInt32 ("2147483647"), "2147483647");
  246. Assert.AreEqual (int.MinValue, XmlConvert.ToInt32 ("-2147483648"), "-2147483648");
  247. try {
  248. int.Parse ("2147483648", CultureInfo.CurrentCulture);
  249. Assert.Fail ("int.Parse(current culture)");
  250. } catch (OverflowException) {
  251. }
  252. try {
  253. int.Parse ("2147483648", CultureInfo.InvariantCulture);
  254. Assert.Fail ("int.Parse(invariant culture)");
  255. } catch (OverflowException) {
  256. }
  257. try {
  258. XmlConvert.ToInt32 ("2147483648");
  259. Assert.Fail ("2147483648");
  260. } catch (OverflowException) {
  261. }
  262. try {
  263. XmlConvert.ToInt32 ("-2147483649");
  264. Assert.Fail ("-2147483649");
  265. } catch (OverflowException) {
  266. }
  267. try {
  268. XmlConvert.ToInt32 ("0x10000");
  269. Assert.Fail ("0x10000");
  270. } catch (FormatException) {
  271. }
  272. }
  273. [Test]
  274. public void ToInt64 ()
  275. {
  276. Assert.AreEqual (0, XmlConvert.ToInt64 ("0"), "0");
  277. Assert.AreEqual (-1, XmlConvert.ToInt64 ("-1"), "-1");
  278. Assert.AreEqual (1, XmlConvert.ToInt64 ("1"), "1");
  279. Assert.AreEqual (long.MaxValue, XmlConvert.ToInt64 ("9223372036854775807"), "9223372036854775807");
  280. Assert.AreEqual (long.MinValue, XmlConvert.ToInt64 ("-9223372036854775808"), "-9223372036854775808");
  281. try {
  282. XmlConvert.ToInt64 ("9223372036854775808");
  283. Assert.Fail ("9223372036854775808");
  284. } catch (OverflowException) {
  285. }
  286. try {
  287. XmlConvert.ToInt64 ("-9223372036854775809");
  288. Assert.Fail ("-9223372036854775809");
  289. } catch (OverflowException) {
  290. }
  291. try {
  292. XmlConvert.ToInt64 ("0x10000");
  293. Assert.Fail ("0x10000");
  294. } catch (FormatException) {
  295. }
  296. }
  297. [Test]
  298. public void ToSByte ()
  299. {
  300. Assert.AreEqual (0, XmlConvert.ToSByte ("0"), "0");
  301. Assert.AreEqual (-1, XmlConvert.ToSByte ("-1"), "-1");
  302. Assert.AreEqual (1, XmlConvert.ToSByte ("1"), "1");
  303. Assert.AreEqual (127, XmlConvert.ToSByte ("127"), "127");
  304. Assert.AreEqual (-128, XmlConvert.ToSByte ("-128"), "-128");
  305. try {
  306. XmlConvert.ToSByte ("128");
  307. Assert.Fail ("128");
  308. } catch (OverflowException) {
  309. }
  310. try {
  311. XmlConvert.ToSByte ("-129");
  312. Assert.Fail ("-129");
  313. } catch (OverflowException) {
  314. }
  315. try {
  316. XmlConvert.ToSByte ("0x80");
  317. Assert.Fail ("0x80");
  318. } catch (FormatException) {
  319. }
  320. }
  321. [Test]
  322. public void ToSingle ()
  323. {
  324. Assert.AreEqual (1.0d/0.0d, XmlConvert.ToSingle ("INF"));
  325. Assert.AreEqual (-1.0d/0.0d, XmlConvert.ToSingle ("-INF"));
  326. Assert.AreEqual (0.0d/0.0d, XmlConvert.ToSingle ("NaN"));
  327. Assert.AreEqual (789324, XmlConvert.ToSingle ("789324"));
  328. Assert.AreEqual (42, XmlConvert.ToSingle (" 42 "));
  329. Assert.AreEqual (float.NaN, XmlConvert.ToSingle (" NaN "));
  330. Assert.AreEqual (float.PositiveInfinity, XmlConvert.ToSingle (" Infinity "));
  331. Assert.AreEqual (float.NegativeInfinity, XmlConvert.ToSingle (" -Infinity "));
  332. Assert.AreEqual (float.PositiveInfinity, XmlConvert.ToSingle (" INF"));
  333. Assert.AreEqual (float.NegativeInfinity, XmlConvert.ToSingle (" -INF "));
  334. }
  335. [Test]
  336. public void ToStringTest ()//not done
  337. {
  338. // Don't include TimeZone value for test value.
  339. string dateString =
  340. XmlConvert.ToString (new DateTime (2003, 5, 5));
  341. Assert.AreEqual (33, dateString.Length);
  342. Assert.AreEqual (dateString.Substring (0, 27), "2003-05-05T00:00:00.0000000");
  343. // Must not throw an exception...
  344. Assert.IsNotNull ("-P10675199DT2H48M5.4775808S", XmlConvert.ToString (TimeSpan.MinValue));
  345. }
  346. [Test]
  347. public void TimeSpanToStringShouldNotHaveTimeSuffixIfTimeIsZero()
  348. {
  349. string s = XmlConvert.ToString(new TimeSpan(345, 0, 0, 0));
  350. Assert.AreEqual("P345D", s);
  351. }
  352. [Test]
  353. public void FromTimeSpan ()
  354. {
  355. // bug #77252
  356. TimeSpan t1 = TimeSpan.FromTicks (
  357. TimeSpan.TicksPerSecond + 1);
  358. Assert.AreEqual ("PT1.0000001S", XmlConvert.ToString (t1), "#1");
  359. // XAttributeTest.CastTimeSpans():#5d
  360. t1 = new TimeSpan (2710L);
  361. Assert.AreEqual ("PT0.000271S", XmlConvert.ToString (t1), "#2");
  362. t1 = new TimeSpan (27100000L);
  363. Assert.AreEqual ("PT2.71S", XmlConvert.ToString (t1), "#3");
  364. }
  365. [Test]
  366. public void ToTimeSpan ()
  367. {
  368. Assert.AreEqual (new TimeSpan (0, 0, 0, 0, 1), XmlConvert.ToTimeSpan ("PT0.001S"), "#1");
  369. // bug #76328
  370. Assert.AreEqual (new TimeSpan (0, 0, 0, 0, 100), XmlConvert.ToTimeSpan ("PT0.1S"), "#2");
  371. Assert.AreEqual (new TimeSpan (0, 0, 0, 0, 100), XmlConvert.ToTimeSpan ("PT0.100S"), "#3");
  372. Assert.AreEqual (new TimeSpan (0, 0, 0, 0, 10), XmlConvert.ToTimeSpan ("PT0.010S"), "#4");
  373. Assert.AreEqual (new TimeSpan (0, 0, 0, 0, 10), XmlConvert.ToTimeSpan ("PT0.01S"), "#5");
  374. // bug #77252
  375. Assert.AreEqual (TimeSpan.FromTicks (TimeSpan.TicksPerSecond + 1), XmlConvert.ToTimeSpan ("PT1.0000001S"), "#6");
  376. Assert.AreEqual (TimeSpan.MinValue, XmlConvert.ToTimeSpan ("-P10675199DT2H48M5.4775808S"), "#7");
  377. Assert.AreEqual (TimeSpan.MaxValue, XmlConvert.ToTimeSpan ("P10675199DT2H48M5.4775807S"), "#8");
  378. Assert.AreEqual (TimeSpan.FromDays (2), XmlConvert.ToTimeSpan (" \r\n \tP2D "), "#9");
  379. }
  380. [Test]
  381. public void ToUInt16 ()
  382. {
  383. Assert.AreEqual (0, XmlConvert.ToUInt16 ("0"), "0");
  384. Assert.AreEqual (1, XmlConvert.ToUInt16 ("1"), "1");
  385. Assert.AreEqual (ushort.MaxValue, XmlConvert.ToUInt16 ("65535"), "65535");
  386. try {
  387. ushort.Parse ("65536", CultureInfo.CurrentCulture);
  388. Assert.Fail ("ushort.Parse(current culture)");
  389. } catch (OverflowException) {
  390. }
  391. try {
  392. ushort.Parse ("65536", CultureInfo.InvariantCulture);
  393. Assert.Fail ("ushort.Parse(invariant culture)");
  394. } catch (OverflowException) {
  395. }
  396. try {
  397. XmlConvert.ToUInt16 ("65536");
  398. Assert.Fail ("65536");
  399. } catch (OverflowException) {
  400. }
  401. try {
  402. XmlConvert.ToUInt16 ("0x10000");
  403. Assert.Fail ("0x10000");
  404. } catch (FormatException) {
  405. }
  406. // LAMESPEC: it is not fixable as there is no public
  407. // member of UInt16 that treats this as FormatException
  408. // while others above as either OverflowException or
  409. // FormatException respectively.
  410. // (.NET uses internal member in UInt16 here);
  411. //try {
  412. // XmlConvert.ToUInt16 ("-101");
  413. // Assert.Fail ("-101");
  414. //} catch (FormatException) {
  415. //}
  416. }
  417. [Test]
  418. public void ToUInt32 ()
  419. {
  420. Assert.AreEqual (0, XmlConvert.ToUInt32 ("0"), "0");
  421. Assert.AreEqual (1, XmlConvert.ToUInt32 ("1"), "1");
  422. Assert.AreEqual (uint.MaxValue, XmlConvert.ToUInt32 ("4294967295"), "4294967295");
  423. try {
  424. uint.Parse ("4294967296", CultureInfo.CurrentCulture);
  425. Assert.Fail ("uint.Parse(current culture)");
  426. } catch (OverflowException) {
  427. }
  428. try {
  429. uint.Parse ("4294967296", CultureInfo.InvariantCulture);
  430. Assert.Fail ("uint.Parse(invariant culture)");
  431. } catch (OverflowException) {
  432. }
  433. try {
  434. XmlConvert.ToUInt32 ("4294967296");
  435. Assert.Fail ("4294967296");
  436. } catch (OverflowException) {
  437. }
  438. try {
  439. XmlConvert.ToUInt32 ("0x10000");
  440. Assert.Fail ("0x10000");
  441. } catch (FormatException) {
  442. }
  443. // LAMESPEC: it is not fixable as there is no public
  444. // member of UInt32 that treats this as FormatException
  445. // while others above as either OverflowException or
  446. // FormatException respectively.
  447. // (.NET uses internal member in UInt32 here);
  448. //try {
  449. // XmlConvert.ToUInt32 ("-101");
  450. // Assert.Fail ("-101");
  451. //} catch (FormatException) {
  452. //}
  453. }
  454. [Test]
  455. public void ToUInt64 ()
  456. {
  457. Assert.AreEqual (0, XmlConvert.ToUInt64 ("0"), "0");
  458. Assert.AreEqual (1, XmlConvert.ToUInt64 ("1"), "1");
  459. Assert.AreEqual (ulong.MaxValue, XmlConvert.ToUInt64 ("18446744073709551615"), "18446744073709551615");
  460. try {
  461. ulong.Parse ("18446744073709551616", CultureInfo.CurrentCulture);
  462. Assert.Fail ("ulong.Parse(current culture)");
  463. } catch (OverflowException) {
  464. }
  465. try {
  466. ulong.Parse ("18446744073709551616", CultureInfo.InvariantCulture);
  467. Assert.Fail ("ulong.Parse(invariant culture)");
  468. } catch (OverflowException) {
  469. }
  470. try {
  471. XmlConvert.ToUInt64 ("18446744073709551616");
  472. Assert.Fail ("18446744073709551616");
  473. } catch (OverflowException) {
  474. }
  475. try {
  476. XmlConvert.ToUInt64 ("0x10000");
  477. Assert.Fail ("0x10000");
  478. } catch (FormatException) {
  479. }
  480. // LAMESPEC: it is not fixable as there is no public
  481. // member of UInt64 that treats this as FormatException
  482. // while others above as either OverflowException or
  483. // FormatException respectively.
  484. // (.NET uses internal member in UInt64 here);
  485. //try {
  486. // XmlConvert.ToUInt64 ("-101");
  487. // Assert.Fail ("-101");
  488. //} catch (FormatException) {
  489. //}
  490. }
  491. [Test]
  492. public void VerifyName ()
  493. {
  494. VerifyNameValid ("a");
  495. VerifyNameValid ("a1");
  496. VerifyNameValid ("\u3041");
  497. VerifyNameValid ("a:b");
  498. VerifyNameValid ("_");
  499. VerifyNameValid ("__");
  500. VerifyNameValid ("_1");
  501. VerifyNameValid (":");
  502. VerifyNameValid (":a");
  503. VerifyNameValid ("a.b");
  504. }
  505. [Test]
  506. public void VerifyNameInvalid ()
  507. {
  508. VerifyNameInvalid ("!");
  509. VerifyNameInvalid ("_a!b");
  510. VerifyNameInvalid ("?a");
  511. VerifyNameInvalid (" ");
  512. }
  513. [Test]
  514. [ExpectedException (typeof (ArgumentNullException))]
  515. public void VerifyNameNull ()
  516. {
  517. XmlConvert.VerifyName (null);
  518. }
  519. [Test]
  520. [ExpectedException (typeof (ArgumentNullException))]
  521. public void VerifyNameEmpty ()
  522. {
  523. XmlConvert.VerifyName ("");
  524. }
  525. private void VerifyNameValid (string value)
  526. {
  527. try {
  528. XmlConvert.VerifyName (value);
  529. } catch (XmlException) {
  530. Assert.Fail (String.Format ("'{0}'", value));
  531. }
  532. }
  533. private void VerifyNameInvalid (string value)
  534. {
  535. try {
  536. XmlConvert.VerifyName (value);
  537. Assert.Fail (value);
  538. } catch (XmlException) {
  539. }
  540. }
  541. [Test]
  542. public void VerifyNCName ()
  543. {
  544. Assert.AreEqual ("foo", XmlConvert.VerifyNCName ("foo"));
  545. try {
  546. XmlConvert.VerifyNCName ("?foo");
  547. Assert.Fail ();
  548. } catch (XmlException) {}
  549. try {
  550. XmlConvert.VerifyNCName (":foo");
  551. Assert.Fail ();
  552. } catch (XmlException) {}
  553. try {
  554. XmlConvert.VerifyNCName ("foo:bar");
  555. Assert.Fail ();
  556. } catch (XmlException) {}
  557. try {
  558. XmlConvert.VerifyNCName ("foo:bar:baz");
  559. Assert.Fail ();
  560. } catch (XmlException) {}
  561. }
  562. [Test]
  563. [ExpectedException (typeof (ArgumentNullException))]
  564. public void VerifyNCNameNull ()
  565. {
  566. XmlConvert.VerifyNCName (null);
  567. }
  568. [Test]
  569. [ExpectedException (typeof (ArgumentNullException))]
  570. public void VerifyNCNameEmpty ()
  571. {
  572. XmlConvert.VerifyNCName ("");
  573. }
  574. [Test]
  575. public void DurationZero () // bug #77350
  576. {
  577. Assert.AreEqual ("PT0S", XmlConvert.ToString (TimeSpan.FromSeconds (0)));
  578. }
  579. #if NET_2_0
  580. [Test]
  581. public void VerifyTOKEN ()
  582. {
  583. VerifyToken ("", true);
  584. VerifyToken (" ", false);
  585. VerifyToken ("A", true);
  586. VerifyToken ("!", true);
  587. VerifyToken (" !", false);
  588. VerifyToken ("! ", false);
  589. VerifyToken ("! !", true);
  590. VerifyToken ("!\t!", false);
  591. VerifyToken ("!\n!", false);
  592. VerifyToken ("!\r!", false);
  593. VerifyToken ("###", true);
  594. }
  595. private void VerifyToken (string s, bool success)
  596. {
  597. try {
  598. XmlConvert.VerifyTOKEN (s);
  599. if (success)
  600. return;
  601. Assert.Fail (s + "should fail");
  602. } catch (XmlException ex) {
  603. if (success)
  604. Assert.Fail (s + "should not fail");
  605. }
  606. }
  607. [Test]
  608. public void XmlDateTimeSerializationModeAndMaxValue ()
  609. {
  610. Assert.AreEqual ("9999-12-31T23:59:59.9999999", XmlConvert.ToString (DateTime.MaxValue, XmlDateTimeSerializationMode.Unspecified).Substring (0, 27), "#1");
  611. Assert.AreEqual ("9999-12-31T23:59:59.9999999Z", XmlConvert.ToString (DateTime.MaxValue, XmlDateTimeSerializationMode.Utc), "#2");
  612. Assert.AreEqual ("9999-12-31T23:59:59.9999999", XmlConvert.ToString (DateTime.MaxValue, XmlDateTimeSerializationMode.RoundtripKind), "#3");
  613. Assert.AreEqual ("9999-12-31T23:59:59.9999999", XmlConvert.ToString (DateTime.MaxValue, XmlDateTimeSerializationMode.Local).Substring (0, 27), "#4");
  614. // direct formatting string - no difference
  615. Assert.AreEqual ("9999-12-31T23:59:59.9999999Z", XmlConvert.ToString (DateTime.MaxValue, "yyyy-MM-ddTHH:mm:ss.FFFFFFFZ"), "#5");
  616. Assert.AreEqual ("9999-12-31T23:59:59.9999999", XmlConvert.ToString (DateTime.MaxValue, "yyyy-MM-ddTHH:mm:ss.FFFFFFFzzz").Substring (0, 27), "#6");
  617. }
  618. [Test]
  619. public void XmlDateTimeSerializationModeRountripKind ()
  620. {
  621. string format = "yyyy-MM-ddTHH:mm:ss.FFFFFFFK";
  622. string s = XmlConvert.ToString (DateTime.UtcNow, format);
  623. Assert.AreEqual ('Z', s [s.Length -1], "#1-1");
  624. // LAMESPEC: .NET has a bug here that 'K' in format string does not reflect 'Z' as Utc Kind.
  625. // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=307694
  626. //Assert.AreEqual (DateTimeKind.Utc, XmlConvert.ToDateTime (s, format).Kind, "#1-2");
  627. s = XmlConvert.ToString (DateTime.UtcNow, XmlDateTimeSerializationMode.RoundtripKind);
  628. Assert.AreEqual ('Z', s [s.Length -1], "#2-1");
  629. Assert.AreEqual (DateTimeKind.Utc, XmlConvert.ToDateTime (s, XmlDateTimeSerializationMode.RoundtripKind).Kind, "#2-2");
  630. }
  631. [Test]
  632. public void XmlDateTimeSerializationModeUnspecified ()
  633. {
  634. Assert.AreEqual (27, XmlConvert.ToString (new DateTime (DateTime.MaxValue.Ticks, DateTimeKind.Utc), XmlDateTimeSerializationMode.Unspecified).Length, "#1");
  635. DateTime dt1 = XmlConvert.ToDateTime ("0001-02-03T10:20:30.0000+02:00", XmlDateTimeSerializationMode.Unspecified);
  636. DateTime dt2 = XmlConvert.ToDateTime ("0001-02-03T10:20:30.0000", XmlDateTimeSerializationMode.Unspecified);
  637. Assert.AreEqual (false, dt1 == dt2, "#2");
  638. XmlConvert.ToDateTime ("2006-05-30T09:48:32.0Z", XmlDateTimeSerializationMode.Unspecified);
  639. string format = "yyyy-MM-ddTHH:mm:ss.FFFFFFFK";
  640. XmlConvert.ToDateTime (XmlConvert.ToString (DateTime.UtcNow, format), XmlDateTimeSerializationMode.Unspecified);
  641. }
  642. [Test]
  643. public void XmlDateTimeSerializationModeLocal ()
  644. {
  645. XmlConvert.ToDateTime ("2010-11-10", XmlDateTimeSerializationMode.Local); // bug #655089
  646. XmlConvert.ToDateTime ("2010-11", XmlDateTimeSerializationMode.Local);
  647. }
  648. [Test]
  649. public void XmlDateTimeSerializationModeUtc ()
  650. {
  651. Assert.AreEqual (27, XmlConvert.ToString (new DateTime (DateTime.MaxValue.Ticks, DateTimeKind.Utc), XmlDateTimeSerializationMode.Unspecified).Length, "#1");
  652. DateTime dt1 = XmlConvert.ToDateTime ("0001-02-03T10:20:30.0000+02:00", XmlDateTimeSerializationMode.Utc);
  653. DateTime dt2 = XmlConvert.ToDateTime ("0001-02-03T10:20:30.0000", XmlDateTimeSerializationMode.Utc);
  654. Assert.AreEqual (false, dt1 == dt2, "#2");
  655. XmlConvert.ToDateTime ("2006-05-30T09:48:32.0Z", XmlDateTimeSerializationMode.Utc);
  656. XmlConvert.ToDateTime ("2006-05-30T09:48:32.0+02:00", XmlDateTimeSerializationMode.Utc);
  657. XmlConvert.ToDateTime ("2008-06-11T11:09:47.125Z", XmlDateTimeSerializationMode.Utc);
  658. }
  659. [Test]
  660. public void XmlDateTimeSerializationModeSeveralFormats ()
  661. {
  662. XmlDateTimeSerializationMode m = XmlDateTimeSerializationMode.RoundtripKind;
  663. XmlConvert.ToDateTime ("0001", m);
  664. XmlConvert.ToDateTime ("0001Z", m);
  665. XmlConvert.ToDateTime ("0001+09:00", m);
  666. XmlConvert.ToDateTime ("0001-02", m);
  667. XmlConvert.ToDateTime ("0001-02Z", m);
  668. XmlConvert.ToDateTime ("0001-02+09:00", m);
  669. XmlConvert.ToDateTime ("0001-02-03", m);
  670. XmlConvert.ToDateTime ("0001-02-03Z", m);
  671. XmlConvert.ToDateTime ("0001-02-03+09:00", m);
  672. XmlConvert.ToDateTime ("--02-03", m);
  673. XmlConvert.ToDateTime ("--02-03Z", m);
  674. XmlConvert.ToDateTime ("--02-03+09:00", m);
  675. XmlConvert.ToDateTime ("---03", m);
  676. XmlConvert.ToDateTime ("---03Z", m);
  677. XmlConvert.ToDateTime ("---03+09:00", m);
  678. XmlConvert.ToDateTime ("10:20:30", m);
  679. XmlConvert.ToDateTime ("10:20:30Z", m);
  680. XmlConvert.ToDateTime ("10:20:30+09:00", m);
  681. XmlConvert.ToDateTime ("0001-02-03T10:20:30", m);
  682. XmlConvert.ToDateTime ("0001-02-03T10:20:30Z", m);
  683. XmlConvert.ToDateTime ("0001-02-03T10:20:30+09:00", m);
  684. XmlConvert.ToDateTime ("0001-02-03T10:20:30.00", m);
  685. XmlConvert.ToDateTime ("0001-02-03T10:20:30.00Z", m);
  686. XmlConvert.ToDateTime ("0001-02-03T10:20:30.00+09:00", m);
  687. XmlConvert.ToDateTime ("0001-02-03T10:20:30.0000", m);
  688. XmlConvert.ToDateTime ("0001-02-03T10:20:30.0000Z", m);
  689. XmlConvert.ToDateTime ("0001-02-03T10:20:30.0000+09:00", m);
  690. try {
  691. XmlConvert.ToDateTime ("0001-02-03T", m);
  692. Assert.Fail ("#1");
  693. } catch (FormatException) {
  694. }
  695. try {
  696. XmlConvert.ToDateTime ("0001-02-03T10:20", m);
  697. Assert.Fail ("#2");
  698. } catch (FormatException) {
  699. }
  700. try {
  701. XmlConvert.ToDateTime ("0001-02-03T10:20:30.", m);
  702. Assert.Fail ("#3");
  703. } catch (FormatException) {
  704. }
  705. }
  706. [Test] // see http://smdn.invisiblefulmoon.net/misc/forum/programming/#n10
  707. public void DateTimeOffsetTimezoneRoundtrip ()
  708. {
  709. Assert.AreEqual (new DateTimeOffset (2009, 11, 05, 20, 16, 22, TimeSpan.FromHours (9)), XmlConvert.ToDateTimeOffset ("2009-11-05T20:16:22+09:00"), "#1");
  710. }
  711. [Test]
  712. public void DateTimeOffsetWithWhitespace ()
  713. {
  714. var s = " 2010-01-02T00:00:00Z \t";
  715. XmlConvert.ToDateTime (s);
  716. }
  717. [Test]
  718. public void ToDateTimeUtc ()
  719. {
  720. // bug #661787
  721. var date = XmlConvert.ToDateTime ("2010-12-29T22:01:15.1619814", XmlDateTimeSerializationMode.Utc);
  722. Assert.AreEqual (22, date.Hour, "#1");
  723. }
  724. [Test]
  725. public void ToDateTimeZ ()
  726. {
  727. // bug 690475
  728. // looks like *all* XmlDateTimeSerializationMode allows use of Z
  729. foreach (XmlDateTimeSerializationMode mode in Enum.GetValues (typeof (XmlDateTimeSerializationMode))) {
  730. XmlConvert.ToDateTime ("2009-12-15T08:44:05Z", mode);
  731. XmlConvert.ToDateTime ("2009-12-15Z", mode);
  732. XmlConvert.ToDateTime ("2009-12Z", mode);
  733. XmlConvert.ToDateTime ("2009Z", mode);
  734. XmlConvert.ToDateTime ("---09Z", mode);
  735. XmlConvert.ToDateTime ("10:01:02Z", mode);
  736. XmlConvert.ToDateTime ("2009-12-15T08:44:05.2700544Z", mode);
  737. }
  738. }
  739. #endif
  740. }
  741. }