XmlTextReaderTests.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873
  1. //
  2. // XmlTextReaderTests.cs
  3. //
  4. // Authors:
  5. // Jason Diamond ([email protected])
  6. // Martin Willemoes Hansen ([email protected])
  7. //
  8. // (C) 2001, 2002 Jason Diamond http://injektilo.org/
  9. //
  10. using System;
  11. using System.IO;
  12. using System.Xml;
  13. using System.Text;
  14. using NUnit.Framework;
  15. namespace MonoTests.System.Xml
  16. {
  17. [TestFixture]
  18. public class XmlTextReaderTests
  19. {
  20. private void AssertStartDocument (XmlReader xmlReader)
  21. {
  22. Assertion.Assert (xmlReader.ReadState == ReadState.Initial);
  23. Assertion.Assert (xmlReader.NodeType == XmlNodeType.None);
  24. Assertion.Assert (xmlReader.Depth == 0);
  25. Assertion.Assert (!xmlReader.EOF);
  26. }
  27. private void AssertNode (
  28. XmlReader xmlReader,
  29. XmlNodeType nodeType,
  30. int depth,
  31. bool isEmptyElement,
  32. string name,
  33. string prefix,
  34. string localName,
  35. string namespaceURI,
  36. string value,
  37. int attributeCount)
  38. {
  39. Assertion.Assert (xmlReader.Read ());
  40. Assertion.Assert (xmlReader.ReadState == ReadState.Interactive);
  41. Assertion.Assert (!xmlReader.EOF);
  42. AssertNodeValues (xmlReader, nodeType, depth, isEmptyElement, name, prefix, localName, namespaceURI, value, attributeCount);
  43. }
  44. private void AssertNodeValues (
  45. XmlReader xmlReader,
  46. XmlNodeType nodeType,
  47. int depth,
  48. bool isEmptyElement,
  49. string name,
  50. string prefix,
  51. string localName,
  52. string namespaceURI,
  53. string value,
  54. int attributeCount)
  55. {
  56. Assertion.AssertEquals ("NodeType", nodeType, xmlReader.NodeType);
  57. Assertion.AssertEquals ("Depth", depth, xmlReader.Depth);
  58. Assertion.AssertEquals ("IsEmptyElement", isEmptyElement, xmlReader.IsEmptyElement);
  59. Assertion.AssertEquals ("name", name, xmlReader.Name);
  60. Assertion.AssertEquals ("prefix", prefix, xmlReader.Prefix);
  61. Assertion.AssertEquals ("localName", localName, xmlReader.LocalName);
  62. Assertion.AssertEquals ("namespaceURI", namespaceURI, xmlReader.NamespaceURI);
  63. Assertion.AssertEquals ("hasValue", (value != String.Empty), xmlReader.HasValue);
  64. Assertion.AssertEquals ("Value", value, xmlReader.Value);
  65. Assertion.AssertEquals ("hasAttributes", attributeCount > 0, xmlReader.HasAttributes);
  66. Assertion.AssertEquals ("attributeCount", attributeCount, xmlReader.AttributeCount);
  67. }
  68. private void AssertAttribute (
  69. XmlReader xmlReader,
  70. string name,
  71. string prefix,
  72. string localName,
  73. string namespaceURI,
  74. string value)
  75. {
  76. Assertion.AssertEquals ("value", value, xmlReader [name]);
  77. Assertion.Assert (xmlReader.GetAttribute (name) == value);
  78. if (namespaceURI != String.Empty) {
  79. Assertion.Assert (xmlReader[localName, namespaceURI] == value);
  80. Assertion.Assert (xmlReader.GetAttribute (localName, namespaceURI) == value);
  81. }
  82. }
  83. private void AssertEndDocument (XmlReader xmlReader)
  84. {
  85. Assertion.Assert ("could read", !xmlReader.Read ());
  86. Assertion.AssertEquals ("NodeType is not XmlNodeType.None", XmlNodeType.None, xmlReader.NodeType);
  87. Assertion.AssertEquals ("Depth is not 0", 0, xmlReader.Depth);
  88. Assertion.AssertEquals ("ReadState is not ReadState.EndOfFile", ReadState.EndOfFile, xmlReader.ReadState);
  89. Assertion.Assert ("not EOF", xmlReader.EOF);
  90. xmlReader.Close ();
  91. Assertion.AssertEquals ("ReadState is not ReadState.Cosed", ReadState.Closed, xmlReader.ReadState);
  92. }
  93. [Test]
  94. public void StartAndEndTagWithAttribute ()
  95. {
  96. string xml = @"<foo bar='baz'></foo>";
  97. XmlReader xmlReader =
  98. new XmlTextReader (new StringReader (xml));
  99. AssertStartDocument (xmlReader);
  100. AssertNode (
  101. xmlReader, // xmlReader
  102. XmlNodeType.Element, // nodeType
  103. 0, //depth
  104. false, // isEmptyElement
  105. "foo", // name
  106. String.Empty, // prefix
  107. "foo", // localName
  108. String.Empty, // namespaceURI
  109. String.Empty, // value
  110. 1 // attributeCount
  111. );
  112. AssertAttribute (
  113. xmlReader, // xmlReader
  114. "bar", // name
  115. String.Empty, // prefix
  116. "bar", // localName
  117. String.Empty, // namespaceURI
  118. "baz" // value
  119. );
  120. AssertNode (
  121. xmlReader, // xmlReader
  122. XmlNodeType.EndElement, // nodeType
  123. 0, //depth
  124. false, // isEmptyElement
  125. "foo", // name
  126. String.Empty, // prefix
  127. "foo", // localName
  128. String.Empty, // namespaceURI
  129. String.Empty, // value
  130. 0 // attributeCount
  131. );
  132. AssertEndDocument (xmlReader);
  133. }
  134. // expecting parser error
  135. [Test]
  136. public void EmptyElementWithBadName ()
  137. {
  138. string xml = "<1foo/>";
  139. XmlReader xmlReader =
  140. new XmlTextReader (new StringReader (xml));
  141. bool caughtXmlException = false;
  142. try {
  143. xmlReader.Read();
  144. } catch (XmlException) {
  145. caughtXmlException = true;
  146. }
  147. Assertion.Assert(caughtXmlException);
  148. }
  149. [Test]
  150. public void EmptyElementWithStartAndEndTag ()
  151. {
  152. string xml = "<foo></foo>";
  153. XmlReader xmlReader =
  154. new XmlTextReader (new StringReader (xml));
  155. AssertStartDocument (xmlReader);
  156. AssertNode (
  157. xmlReader, // xmlReader
  158. XmlNodeType.Element, // nodeType
  159. 0, //depth
  160. false, // isEmptyElement
  161. "foo", // name
  162. String.Empty, // prefix
  163. "foo", // localName
  164. String.Empty, // namespaceURI
  165. String.Empty, // value
  166. 0 // attributeCount
  167. );
  168. AssertNode (
  169. xmlReader, // xmlReader
  170. XmlNodeType.EndElement, // nodeType
  171. 0, //depth
  172. false, // isEmptyElement
  173. "foo", // name
  174. String.Empty, // prefix
  175. "foo", // localName
  176. String.Empty, // namespaceURI
  177. String.Empty, // value
  178. 0 // attributeCount
  179. );
  180. AssertEndDocument (xmlReader);
  181. }
  182. // checking parser
  183. [Test]
  184. public void EmptyElementWithStartAndEndTagWithWhitespace ()
  185. {
  186. string xml = "<foo ></foo >";
  187. XmlReader xmlReader =
  188. new XmlTextReader (new StringReader (xml));
  189. AssertStartDocument (xmlReader);
  190. AssertNode (
  191. xmlReader, // xmlReader
  192. XmlNodeType.Element, // nodeType
  193. 0, //depth
  194. false, // isEmptyElement
  195. "foo", // name
  196. String.Empty, // prefix
  197. "foo", // localName
  198. String.Empty, // namespaceURI
  199. String.Empty, // value
  200. 0 // attributeCount
  201. );
  202. AssertNode (
  203. xmlReader, // xmlReader
  204. XmlNodeType.EndElement, // nodeType
  205. 0, //depth
  206. false, // isEmptyElement
  207. "foo", // name
  208. String.Empty, // prefix
  209. "foo", // localName
  210. String.Empty, // namespaceURI
  211. String.Empty, // value
  212. 0 // attributeCount
  213. );
  214. AssertEndDocument (xmlReader);
  215. }
  216. [Test]
  217. public void EmptyElementWithAttribute ()
  218. {
  219. string xml = @"<foo bar=""baz""/>";
  220. XmlReader xmlReader =
  221. new XmlTextReader (new StringReader (xml));
  222. AssertStartDocument (xmlReader);
  223. AssertNode (
  224. xmlReader, // xmlReader
  225. XmlNodeType.Element, // nodeType
  226. 0, //depth
  227. true, // isEmptyElement
  228. "foo", // name
  229. String.Empty, // prefix
  230. "foo", // localName
  231. String.Empty, // namespaceURI
  232. String.Empty, // value
  233. 1 // attributeCount
  234. );
  235. AssertAttribute (
  236. xmlReader, // xmlReader
  237. "bar", // name
  238. String.Empty, // prefix
  239. "bar", // localName
  240. String.Empty, // namespaceURI
  241. "baz" // value
  242. );
  243. AssertEndDocument (xmlReader);
  244. }
  245. [Test]
  246. public void EmptyElementInNamespace ()
  247. {
  248. string xml = @"<foo:bar xmlns:foo='http://foo/' />";
  249. XmlReader xmlReader =
  250. new XmlTextReader (new StringReader (xml));
  251. AssertStartDocument (xmlReader);
  252. AssertNode (
  253. xmlReader, // xmlReader
  254. XmlNodeType.Element, // nodeType
  255. 0, // depth
  256. true, // isEmptyElement
  257. "foo:bar", // name
  258. "foo", // prefix
  259. "bar", // localName
  260. "http://foo/", // namespaceURI
  261. String.Empty, // value
  262. 1 // attributeCount
  263. );
  264. AssertAttribute (
  265. xmlReader, // xmlReader
  266. "xmlns:foo", // name
  267. "xmlns", // prefix
  268. "foo", // localName
  269. "http://www.w3.org/2000/xmlns/", // namespaceURI
  270. "http://foo/" // value
  271. );
  272. Assertion.AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo"));
  273. AssertEndDocument (xmlReader);
  274. }
  275. [Test]
  276. public void EntityReferenceInAttribute ()
  277. {
  278. string xml = "<foo bar='&baz;'/>";
  279. XmlReader xmlReader =
  280. new XmlTextReader (new StringReader (xml));
  281. AssertStartDocument (xmlReader);
  282. AssertNode (
  283. xmlReader, // xmlReader
  284. XmlNodeType.Element, // nodeType
  285. 0, //depth
  286. true, // isEmptyElement
  287. "foo", // name
  288. String.Empty, // prefix
  289. "foo", // localName
  290. String.Empty, // namespaceURI
  291. String.Empty, // value
  292. 1 // attributeCount
  293. );
  294. AssertAttribute (
  295. xmlReader, // xmlReader
  296. "bar", // name
  297. String.Empty, // prefix
  298. "bar", // localName
  299. String.Empty, // namespaceURI
  300. "&baz;" // value
  301. );
  302. AssertEndDocument (xmlReader);
  303. }
  304. // The following is #if'ed out because it's specific to the Mono
  305. // implementation and won't compile when testing Microsoft's code.
  306. // Feel free to turn it on if you want to test Mono's name tables.
  307. #if false
  308. [Test]
  309. public void IsFirstNameCharTest ()
  310. {
  311. for (int ch = 0; ch <= 0xFFFF; ++ch) {
  312. Assertion.Assert (
  313. XmlChar.IsFirstNameChar (ch) ==
  314. IsFirstNameChar (ch));
  315. }
  316. }
  317. [Test]
  318. public void IsNameCharTest ()
  319. {
  320. for (int ch = 0; ch <= 0xFFFF; ++ch) {
  321. Assertion.Assert (
  322. XmlChar.IsNameChar (ch) ==
  323. IsNameChar (ch));
  324. }
  325. }
  326. private static bool IsFirstNameChar (int ch)
  327. {
  328. return
  329. IsLetter (ch) ||
  330. (ch == '_') ||
  331. (ch == ':');
  332. }
  333. private static bool IsNameChar (int ch)
  334. {
  335. return
  336. IsLetter (ch) ||
  337. IsDigit (ch) ||
  338. (ch == '.') ||
  339. (ch == '-') ||
  340. (ch == '_') ||
  341. (ch == ':') ||
  342. IsCombiningChar (ch) ||
  343. IsExtender (ch);
  344. }
  345. private static bool IsLetter (int ch)
  346. {
  347. return
  348. IsBaseChar (ch) ||
  349. IsIdeographic (ch);
  350. }
  351. private static bool IsBaseChar (int ch)
  352. {
  353. return
  354. (ch >= 0x0041 && ch <= 0x005A) ||
  355. (ch >= 0x0061 && ch <= 0x007A) ||
  356. (ch >= 0x00C0 && ch <= 0x00D6) ||
  357. (ch >= 0x00D8 && ch <= 0x00F6) ||
  358. (ch >= 0x00F8 && ch <= 0x00FF) ||
  359. (ch >= 0x0100 && ch <= 0x0131) ||
  360. (ch >= 0x0134 && ch <= 0x013E) ||
  361. (ch >= 0x0141 && ch <= 0x0148) ||
  362. (ch >= 0x014A && ch <= 0x017E) ||
  363. (ch >= 0x0180 && ch <= 0x01C3) ||
  364. (ch >= 0x01CD && ch <= 0x01F0) ||
  365. (ch >= 0x01F4 && ch <= 0x01F5) ||
  366. (ch >= 0x01FA && ch <= 0x0217) ||
  367. (ch >= 0x0250 && ch <= 0x02A8) ||
  368. (ch >= 0x02BB && ch <= 0x02C1) ||
  369. (ch == 0x0386) ||
  370. (ch >= 0x0388 && ch <= 0x038A) ||
  371. (ch == 0x038C) ||
  372. (ch >= 0x038E && ch <= 0x03A1) ||
  373. (ch >= 0x03A3 && ch <= 0x03CE) ||
  374. (ch >= 0x03D0 && ch <= 0x03D6) ||
  375. (ch == 0x03DA) ||
  376. (ch == 0x03DC) ||
  377. (ch == 0x03DE) ||
  378. (ch == 0x03E0) ||
  379. (ch >= 0x03E2 && ch <= 0x03F3) ||
  380. (ch >= 0x0401 && ch <= 0x040C) ||
  381. (ch >= 0x040E && ch <= 0x044F) ||
  382. (ch >= 0x0451 && ch <= 0x045C) ||
  383. (ch >= 0x045E && ch <= 0x0481) ||
  384. (ch >= 0x0490 && ch <= 0x04C4) ||
  385. (ch >= 0x04C7 && ch <= 0x04C8) ||
  386. (ch >= 0x04CB && ch <= 0x04CC) ||
  387. (ch >= 0x04D0 && ch <= 0x04EB) ||
  388. (ch >= 0x04EE && ch <= 0x04F5) ||
  389. (ch >= 0x04F8 && ch <= 0x04F9) ||
  390. (ch >= 0x0531 && ch <= 0x0556) ||
  391. (ch == 0x0559) ||
  392. (ch >= 0x0561 && ch <= 0x0586) ||
  393. (ch >= 0x05D0 && ch <= 0x05EA) ||
  394. (ch >= 0x05F0 && ch <= 0x05F2) ||
  395. (ch >= 0x0621 && ch <= 0x063A) ||
  396. (ch >= 0x0641 && ch <= 0x064A) ||
  397. (ch >= 0x0671 && ch <= 0x06B7) ||
  398. (ch >= 0x06BA && ch <= 0x06BE) ||
  399. (ch >= 0x06C0 && ch <= 0x06CE) ||
  400. (ch >= 0x06D0 && ch <= 0x06D3) ||
  401. (ch == 0x06D5) ||
  402. (ch >= 0x06E5 && ch <= 0x06E6) ||
  403. (ch >= 0x0905 && ch <= 0x0939) ||
  404. (ch == 0x093D) ||
  405. (ch >= 0x0958 && ch <= 0x0961) ||
  406. (ch >= 0x0985 && ch <= 0x098C) ||
  407. (ch >= 0x098F && ch <= 0x0990) ||
  408. (ch >= 0x0993 && ch <= 0x09A8) ||
  409. (ch >= 0x09AA && ch <= 0x09B0) ||
  410. (ch == 0x09B2) ||
  411. (ch >= 0x09B6 && ch <= 0x09B9) ||
  412. (ch >= 0x09DC && ch <= 0x09DD) ||
  413. (ch >= 0x09DF && ch <= 0x09E1) ||
  414. (ch >= 0x09F0 && ch <= 0x09F1) ||
  415. (ch >= 0x0A05 && ch <= 0x0A0A) ||
  416. (ch >= 0x0A0F && ch <= 0x0A10) ||
  417. (ch >= 0x0A13 && ch <= 0x0A28) ||
  418. (ch >= 0x0A2A && ch <= 0x0A30) ||
  419. (ch >= 0x0A32 && ch <= 0x0A33) ||
  420. (ch >= 0x0A35 && ch <= 0x0A36) ||
  421. (ch >= 0x0A38 && ch <= 0x0A39) ||
  422. (ch >= 0x0A59 && ch <= 0x0A5C) ||
  423. (ch == 0x0A5E) ||
  424. (ch >= 0x0A72 && ch <= 0x0A74) ||
  425. (ch >= 0x0A85 && ch <= 0x0A8B) ||
  426. (ch == 0x0A8D) ||
  427. (ch >= 0x0A8F && ch <= 0x0A91) ||
  428. (ch >= 0x0A93 && ch <= 0x0AA8) ||
  429. (ch >= 0x0AAA && ch <= 0x0AB0) ||
  430. (ch >= 0x0AB2 && ch <= 0x0AB3) ||
  431. (ch >= 0x0AB5 && ch <= 0x0AB9) ||
  432. (ch == 0x0ABD) ||
  433. (ch == 0x0AE0) ||
  434. (ch >= 0x0B05 && ch <= 0x0B0C) ||
  435. (ch >= 0x0B0F && ch <= 0x0B10) ||
  436. (ch >= 0x0B13 && ch <= 0x0B28) ||
  437. (ch >= 0x0B2A && ch <= 0x0B30) ||
  438. (ch >= 0x0B32 && ch <= 0x0B33) ||
  439. (ch >= 0x0B36 && ch <= 0x0B39) ||
  440. (ch == 0x0B3D) ||
  441. (ch >= 0x0B5C && ch <= 0x0B5D) ||
  442. (ch >= 0x0B5F && ch <= 0x0B61) ||
  443. (ch >= 0x0B85 && ch <= 0x0B8A) ||
  444. (ch >= 0x0B8E && ch <= 0x0B90) ||
  445. (ch >= 0x0B92 && ch <= 0x0B95) ||
  446. (ch >= 0x0B99 && ch <= 0x0B9A) ||
  447. (ch == 0x0B9C) ||
  448. (ch >= 0x0B9E && ch <= 0x0B9F) ||
  449. (ch >= 0x0BA3 && ch <= 0x0BA4) ||
  450. (ch >= 0x0BA8 && ch <= 0x0BAA) ||
  451. (ch >= 0x0BAE && ch <= 0x0BB5) ||
  452. (ch >= 0x0BB7 && ch <= 0x0BB9) ||
  453. (ch >= 0x0C05 && ch <= 0x0C0C) ||
  454. (ch >= 0x0C0E && ch <= 0x0C10) ||
  455. (ch >= 0x0C12 && ch <= 0x0C28) ||
  456. (ch >= 0x0C2A && ch <= 0x0C33) ||
  457. (ch >= 0x0C35 && ch <= 0x0C39) ||
  458. (ch >= 0x0C60 && ch <= 0x0C61) ||
  459. (ch >= 0x0C85 && ch <= 0x0C8C) ||
  460. (ch >= 0x0C8E && ch <= 0x0C90) ||
  461. (ch >= 0x0C92 && ch <= 0x0CA8) ||
  462. (ch >= 0x0CAA && ch <= 0x0CB3) ||
  463. (ch >= 0x0CB5 && ch <= 0x0CB9) ||
  464. (ch == 0x0CDE) ||
  465. (ch >= 0x0CE0 && ch <= 0x0CE1) ||
  466. (ch >= 0x0D05 && ch <= 0x0D0C) ||
  467. (ch >= 0x0D0E && ch <= 0x0D10) ||
  468. (ch >= 0x0D12 && ch <= 0x0D28) ||
  469. (ch >= 0x0D2A && ch <= 0x0D39) ||
  470. (ch >= 0x0D60 && ch <= 0x0D61) ||
  471. (ch >= 0x0E01 && ch <= 0x0E2E) ||
  472. (ch == 0x0E30) ||
  473. (ch >= 0x0E32 && ch <= 0x0E33) ||
  474. (ch >= 0x0E40 && ch <= 0x0E45) ||
  475. (ch >= 0x0E81 && ch <= 0x0E82) ||
  476. (ch == 0x0E84) ||
  477. (ch >= 0x0E87 && ch <= 0x0E88) ||
  478. (ch == 0x0E8A) ||
  479. (ch == 0x0E8D) ||
  480. (ch >= 0x0E94 && ch <= 0x0E97) ||
  481. (ch >= 0x0E99 && ch <= 0x0E9F) ||
  482. (ch >= 0x0EA1 && ch <= 0x0EA3) ||
  483. (ch == 0x0EA5) ||
  484. (ch == 0x0EA7) ||
  485. (ch >= 0x0EAA && ch <= 0x0EAB) ||
  486. (ch >= 0x0EAD && ch <= 0x0EAE) ||
  487. (ch == 0x0EB0) ||
  488. (ch >= 0x0EB2 && ch <= 0x0EB3) ||
  489. (ch == 0x0EBD) ||
  490. (ch >= 0x0EC0 && ch <= 0x0EC4) ||
  491. (ch >= 0x0F40 && ch <= 0x0F47) ||
  492. (ch >= 0x0F49 && ch <= 0x0F69) ||
  493. (ch >= 0x10A0 && ch <= 0x10C5) ||
  494. (ch >= 0x10D0 && ch <= 0x10F6) ||
  495. (ch == 0x1100) ||
  496. (ch >= 0x1102 && ch <= 0x1103) ||
  497. (ch >= 0x1105 && ch <= 0x1107) ||
  498. (ch == 0x1109) ||
  499. (ch >= 0x110B && ch <= 0x110C) ||
  500. (ch >= 0x110E && ch <= 0x1112) ||
  501. (ch == 0x113C) ||
  502. (ch == 0x113E) ||
  503. (ch == 0x1140) ||
  504. (ch == 0x114C) ||
  505. (ch == 0x114E) ||
  506. (ch == 0x1150) ||
  507. (ch >= 0x1154 && ch <= 0x1155) ||
  508. (ch == 0x1159) ||
  509. (ch >= 0x115F && ch <= 0x1161) ||
  510. (ch == 0x1163) ||
  511. (ch == 0x1165) ||
  512. (ch == 0x1167) ||
  513. (ch == 0x1169) ||
  514. (ch >= 0x116D && ch <= 0x116E) ||
  515. (ch >= 0x1172 && ch <= 0x1173) ||
  516. (ch == 0x1175) ||
  517. (ch == 0x119E) ||
  518. (ch == 0x11A8) ||
  519. (ch == 0x11AB) ||
  520. (ch >= 0x11AE && ch <= 0x11AF) ||
  521. (ch >= 0x11B7 && ch <= 0x11B8) ||
  522. (ch == 0x11BA) ||
  523. (ch >= 0x11BC && ch <= 0x11C2) ||
  524. (ch == 0x11EB) ||
  525. (ch == 0x11F0) ||
  526. (ch == 0x11F9) ||
  527. (ch >= 0x1E00 && ch <= 0x1E9B) ||
  528. (ch >= 0x1EA0 && ch <= 0x1EF9) ||
  529. (ch >= 0x1F00 && ch <= 0x1F15) ||
  530. (ch >= 0x1F18 && ch <= 0x1F1D) ||
  531. (ch >= 0x1F20 && ch <= 0x1F45) ||
  532. (ch >= 0x1F48 && ch <= 0x1F4D) ||
  533. (ch >= 0x1F50 && ch <= 0x1F57) ||
  534. (ch == 0x1F59) ||
  535. (ch == 0x1F5B) ||
  536. (ch == 0x1F5D) ||
  537. (ch >= 0x1F5F && ch <= 0x1F7D) ||
  538. (ch >= 0x1F80 && ch <= 0x1FB4) ||
  539. (ch >= 0x1FB6 && ch <= 0x1FBC) ||
  540. (ch == 0x1FBE) ||
  541. (ch >= 0x1FC2 && ch <= 0x1FC4) ||
  542. (ch >= 0x1FC6 && ch <= 0x1FCC) ||
  543. (ch >= 0x1FD0 && ch <= 0x1FD3) ||
  544. (ch >= 0x1FD6 && ch <= 0x1FDB) ||
  545. (ch >= 0x1FE0 && ch <= 0x1FEC) ||
  546. (ch >= 0x1FF2 && ch <= 0x1FF4) ||
  547. (ch >= 0x1FF6 && ch <= 0x1FFC) ||
  548. (ch == 0x2126) ||
  549. (ch >= 0x212A && ch <= 0x212B) ||
  550. (ch == 0x212E) ||
  551. (ch >= 0x2180 && ch <= 0x2182) ||
  552. (ch >= 0x3041 && ch <= 0x3094) ||
  553. (ch >= 0x30A1 && ch <= 0x30FA) ||
  554. (ch >= 0x3105 && ch <= 0x312C) ||
  555. (ch >= 0xAC00 && ch <= 0xD7A3);
  556. }
  557. private static bool IsIdeographic (int ch)
  558. {
  559. return
  560. (ch >= 0x4E00 && ch <= 0x9FA5) ||
  561. (ch == 0x3007) ||
  562. (ch >= 0x3021 && ch <= 0x3029);
  563. }
  564. private static bool IsDigit (int ch)
  565. {
  566. return
  567. (ch >= 0x0030 && ch <= 0x0039) ||
  568. (ch >= 0x0660 && ch <= 0x0669) ||
  569. (ch >= 0x06F0 && ch <= 0x06F9) ||
  570. (ch >= 0x0966 && ch <= 0x096F) ||
  571. (ch >= 0x09E6 && ch <= 0x09EF) ||
  572. (ch >= 0x0A66 && ch <= 0x0A6F) ||
  573. (ch >= 0x0AE6 && ch <= 0x0AEF) ||
  574. (ch >= 0x0B66 && ch <= 0x0B6F) ||
  575. (ch >= 0x0BE7 && ch <= 0x0BEF) ||
  576. (ch >= 0x0C66 && ch <= 0x0C6F) ||
  577. (ch >= 0x0CE6 && ch <= 0x0CEF) ||
  578. (ch >= 0x0D66 && ch <= 0x0D6F) ||
  579. (ch >= 0x0E50 && ch <= 0x0E59) ||
  580. (ch >= 0x0ED0 && ch <= 0x0ED9) ||
  581. (ch >= 0x0F20 && ch <= 0x0F29);
  582. }
  583. private static bool IsCombiningChar (int ch)
  584. {
  585. return
  586. (ch >= 0x0300 && ch <= 0x0345) ||
  587. (ch >= 0x0360 && ch <= 0x0361) ||
  588. (ch >= 0x0483 && ch <= 0x0486) ||
  589. (ch >= 0x0591 && ch <= 0x05A1) ||
  590. (ch >= 0x05A3 && ch <= 0x05B9) ||
  591. (ch >= 0x05BB && ch <= 0x05BD) ||
  592. (ch == 0x05BF) ||
  593. (ch >= 0x05C1 && ch <= 0x05C2) ||
  594. (ch == 0x05C4) ||
  595. (ch >= 0x064B && ch <= 0x0652) ||
  596. (ch == 0x0670) ||
  597. (ch >= 0x06D6 && ch <= 0x06DC) ||
  598. (ch >= 0x06DD && ch <= 0x06DF) ||
  599. (ch >= 0x06E0 && ch <= 0x06E4) ||
  600. (ch >= 0x06E7 && ch <= 0x06E8) ||
  601. (ch >= 0x06EA && ch <= 0x06ED) ||
  602. (ch >= 0x0901 && ch <= 0x0903) ||
  603. (ch == 0x093C) ||
  604. (ch >= 0x093E && ch <= 0x094C) ||
  605. (ch == 0x094D) ||
  606. (ch >= 0x0951 && ch <= 0x0954) ||
  607. (ch >= 0x0962 && ch <= 0x0963) ||
  608. (ch >= 0x0981 && ch <= 0x0983) ||
  609. (ch == 0x09BC) ||
  610. (ch == 0x09BE) ||
  611. (ch == 0x09BF) ||
  612. (ch >= 0x09C0 && ch <= 0x09C4) ||
  613. (ch >= 0x09C7 && ch <= 0x09C8) ||
  614. (ch >= 0x09CB && ch <= 0x09CD) ||
  615. (ch == 0x09D7) ||
  616. (ch >= 0x09E2 && ch <= 0x09E3) ||
  617. (ch == 0x0A02) ||
  618. (ch == 0x0A3C) ||
  619. (ch == 0x0A3E) ||
  620. (ch == 0x0A3F) ||
  621. (ch >= 0x0A40 && ch <= 0x0A42) ||
  622. (ch >= 0x0A47 && ch <= 0x0A48) ||
  623. (ch >= 0x0A4B && ch <= 0x0A4D) ||
  624. (ch >= 0x0A70 && ch <= 0x0A71) ||
  625. (ch >= 0x0A81 && ch <= 0x0A83) ||
  626. (ch == 0x0ABC) ||
  627. (ch >= 0x0ABE && ch <= 0x0AC5) ||
  628. (ch >= 0x0AC7 && ch <= 0x0AC9) ||
  629. (ch >= 0x0ACB && ch <= 0x0ACD) ||
  630. (ch >= 0x0B01 && ch <= 0x0B03) ||
  631. (ch == 0x0B3C) ||
  632. (ch >= 0x0B3E && ch <= 0x0B43) ||
  633. (ch >= 0x0B47 && ch <= 0x0B48) ||
  634. (ch >= 0x0B4B && ch <= 0x0B4D) ||
  635. (ch >= 0x0B56 && ch <= 0x0B57) ||
  636. (ch >= 0x0B82 && ch <= 0x0B83) ||
  637. (ch >= 0x0BBE && ch <= 0x0BC2) ||
  638. (ch >= 0x0BC6 && ch <= 0x0BC8) ||
  639. (ch >= 0x0BCA && ch <= 0x0BCD) ||
  640. (ch == 0x0BD7) ||
  641. (ch >= 0x0C01 && ch <= 0x0C03) ||
  642. (ch >= 0x0C3E && ch <= 0x0C44) ||
  643. (ch >= 0x0C46 && ch <= 0x0C48) ||
  644. (ch >= 0x0C4A && ch <= 0x0C4D) ||
  645. (ch >= 0x0C55 && ch <= 0x0C56) ||
  646. (ch >= 0x0C82 && ch <= 0x0C83) ||
  647. (ch >= 0x0CBE && ch <= 0x0CC4) ||
  648. (ch >= 0x0CC6 && ch <= 0x0CC8) ||
  649. (ch >= 0x0CCA && ch <= 0x0CCD) ||
  650. (ch >= 0x0CD5 && ch <= 0x0CD6) ||
  651. (ch >= 0x0D02 && ch <= 0x0D03) ||
  652. (ch >= 0x0D3E && ch <= 0x0D43) ||
  653. (ch >= 0x0D46 && ch <= 0x0D48) ||
  654. (ch >= 0x0D4A && ch <= 0x0D4D) ||
  655. (ch == 0x0D57) ||
  656. (ch == 0x0E31) ||
  657. (ch >= 0x0E34 && ch <= 0x0E3A) ||
  658. (ch >= 0x0E47 && ch <= 0x0E4E) ||
  659. (ch == 0x0EB1) ||
  660. (ch >= 0x0EB4 && ch <= 0x0EB9) ||
  661. (ch >= 0x0EBB && ch <= 0x0EBC) ||
  662. (ch >= 0x0EC8 && ch <= 0x0ECD) ||
  663. (ch >= 0x0F18 && ch <= 0x0F19) ||
  664. (ch == 0x0F35) ||
  665. (ch == 0x0F37) ||
  666. (ch == 0x0F39) ||
  667. (ch == 0x0F3E) ||
  668. (ch == 0x0F3F) ||
  669. (ch >= 0x0F71 && ch <= 0x0F84) ||
  670. (ch >= 0x0F86 && ch <= 0x0F8B) ||
  671. (ch >= 0x0F90 && ch <= 0x0F95) ||
  672. (ch == 0x0F97) ||
  673. (ch >= 0x0F99 && ch <= 0x0FAD) ||
  674. (ch >= 0x0FB1 && ch <= 0x0FB7) ||
  675. (ch == 0x0FB9) ||
  676. (ch >= 0x20D0 && ch <= 0x20DC) ||
  677. (ch == 0x20E1) ||
  678. (ch >= 0x302A && ch <= 0x302F) ||
  679. (ch == 0x3099) ||
  680. (ch == 0x309A);
  681. }
  682. private static bool IsExtender (int ch)
  683. {
  684. return
  685. (ch == 0x00B7) ||
  686. (ch == 0x02D0) ||
  687. (ch == 0x02D1) ||
  688. (ch == 0x0387) ||
  689. (ch == 0x0640) ||
  690. (ch == 0x0E46) ||
  691. (ch == 0x0EC6) ||
  692. (ch == 0x3005) ||
  693. (ch >= 0x3031 && ch <= 0x3035) ||
  694. (ch >= 0x309D && ch <= 0x309E) ||
  695. (ch >= 0x30FC && ch <= 0x30FE);
  696. }
  697. #endif
  698. [Test]
  699. public void IsName ()
  700. {
  701. Assertion.Assert (XmlReader.IsName ("foo"));
  702. Assertion.Assert (!XmlReader.IsName ("1foo"));
  703. Assertion.Assert (!XmlReader.IsName (" foo"));
  704. }
  705. [Test]
  706. public void IsNameToken ()
  707. {
  708. Assertion.Assert (XmlReader.IsNameToken ("foo"));
  709. Assertion.Assert (XmlReader.IsNameToken ("1foo"));
  710. Assertion.Assert (!XmlReader.IsNameToken (" foo"));
  711. }
  712. [Test]
  713. public void FragmentConstructor()
  714. {
  715. XmlDocument doc = new XmlDocument();
  716. // doc.LoadXml("<root/>");
  717. string xml = @"<foo><bar xmlns=""NSURI"">TEXT NODE</bar></foo>";
  718. MemoryStream ms = new MemoryStream(Encoding.Default.GetBytes(xml));
  719. XmlParserContext ctx = new XmlParserContext(doc.NameTable, new XmlNamespaceManager(doc.NameTable), "", "", "", "",
  720. doc.BaseURI, "", XmlSpace.Default, Encoding.Default);
  721. XmlTextReader xmlReader = new XmlTextReader(ms, XmlNodeType.Element, ctx);
  722. AssertNode(xmlReader, XmlNodeType.Element, 0, false, "foo", "", "foo", "", "", 0);
  723. AssertNode(xmlReader, XmlNodeType.Element, 1, false, "bar", "", "bar", "NSURI", "", 1);
  724. AssertNode(xmlReader, XmlNodeType.Text, 2, false, "", "", "", "NSURI", "TEXT NODE", 0);
  725. AssertNode(xmlReader, XmlNodeType.EndElement, 1, false, "bar", "", "bar", "NSURI", "", 0);
  726. AssertNode(xmlReader, XmlNodeType.EndElement, 0, false, "foo", "", "foo", "", "", 0);
  727. AssertEndDocument (xmlReader);
  728. }
  729. [Test]
  730. public void AttributeWithCharacterReference ()
  731. {
  732. string xml = @"<a value='hello &amp; world' />";
  733. XmlReader xmlReader =
  734. new XmlTextReader (new StringReader (xml));
  735. xmlReader.Read ();
  736. Assertion.AssertEquals ("hello & world", xmlReader ["value"]);
  737. }
  738. [Test]
  739. public void AttributeWithEntityReference ()
  740. {
  741. string xml = @"<a value='hello &ent; world' />";
  742. XmlReader xmlReader =
  743. new XmlTextReader (new StringReader (xml));
  744. xmlReader.Read ();
  745. xmlReader.MoveToFirstAttribute ();
  746. xmlReader.ReadAttributeValue ();
  747. Assertion.AssertEquals ("hello ", xmlReader.Value);
  748. xmlReader.ReadAttributeValue ();
  749. Assertion.AssertEquals (XmlNodeType.EntityReference, xmlReader.NodeType);
  750. Assertion.AssertEquals ("ent", xmlReader.Name);
  751. Assertion.AssertEquals (XmlNodeType.EntityReference, xmlReader.NodeType);
  752. xmlReader.ReadAttributeValue ();
  753. Assertion.AssertEquals (" world", xmlReader.Value);
  754. Assertion.AssertEquals (XmlNodeType.Text, xmlReader.NodeType);
  755. xmlReader.ReadAttributeValue ();
  756. Assertion.AssertEquals (XmlNodeType.None, xmlReader.NodeType);
  757. xmlReader.ReadAttributeValue ();
  758. Assertion.AssertEquals (XmlNodeType.None, xmlReader.NodeType);
  759. }
  760. [Test]
  761. public void QuoteChar ()
  762. {
  763. string xml = @"<a value='hello &amp; world' value2="""" />";
  764. XmlReader xmlReader =
  765. new XmlTextReader (new StringReader (xml));
  766. xmlReader.Read ();
  767. xmlReader.MoveToFirstAttribute ();
  768. Assertion.AssertEquals ("First", '\'', xmlReader.QuoteChar);
  769. xmlReader.MoveToNextAttribute ();
  770. Assertion.AssertEquals ("Next", '"', xmlReader.QuoteChar);
  771. xmlReader.MoveToFirstAttribute ();
  772. Assertion.AssertEquals ("First.Again", '\'', xmlReader.QuoteChar);
  773. }
  774. [Test]
  775. public void ReadInnerXmlWrongInit ()
  776. {
  777. // This behavior is different from XmlNodeReader.
  778. XmlReader reader = new XmlTextReader (new StringReader ("<root>test of <b>mixed</b> string.</root>"));
  779. reader.ReadInnerXml ();
  780. Assertion.AssertEquals ("initial.ReadState", ReadState.Initial, reader.ReadState);
  781. Assertion.AssertEquals ("initial.EOF", false, reader.EOF);
  782. Assertion.AssertEquals ("initial.NodeType", XmlNodeType.None, reader.NodeType);
  783. }
  784. // [Test] Comment out in the meantime.
  785. // public void TestExternalDocument ()
  786. // {
  787. // XmlDocument doc = new XmlDocument ();
  788. // doc.Load ("xmlfiles/encoding/utf-7.xml");
  789. // }
  790. }
  791. }