Test.cs 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147
  1. // -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
  2. //
  3. // System.Xml.Test.cs
  4. //
  5. // Author:
  6. // Jason Diamond ([email protected])
  7. //
  8. // (C) 2001 Jason Diamond http://injektilo.org/
  9. //
  10. using System;
  11. using System.Diagnostics;
  12. using System.IO;
  13. using NUnit.Framework;
  14. namespace System.Xml
  15. {
  16. public class Test : TestCase
  17. {
  18. public Test(string name) : base(name) { }
  19. private void AssertStartDocument(XmlReader xmlReader)
  20. {
  21. Assert(xmlReader.ReadState == ReadState.Initial);
  22. Assert(xmlReader.NodeType == XmlNodeType.None);
  23. Assert(xmlReader.Depth == 0);
  24. Assert(!xmlReader.EOF);
  25. }
  26. private void AssertNode(
  27. XmlReader xmlReader,
  28. XmlNodeType nodeType,
  29. int depth,
  30. bool isEmptyElement,
  31. string name,
  32. string value,
  33. int attributeCount)
  34. {
  35. Assert(xmlReader.Read());
  36. Assert(xmlReader.ReadState == ReadState.Interactive);
  37. Assert(!xmlReader.EOF);
  38. Assert(xmlReader.NodeType == nodeType);
  39. Assert(xmlReader.Depth == depth);
  40. Assert(xmlReader.IsEmptyElement == isEmptyElement);
  41. Assert(xmlReader.Name == name);
  42. Assert(xmlReader.HasValue == (value != String.Empty));
  43. Assert(xmlReader.Value == value);
  44. Assert(xmlReader.HasAttributes == (attributeCount > 0));
  45. Assert(xmlReader.AttributeCount == attributeCount);
  46. }
  47. private void AssertAttribute(
  48. XmlReader xmlReader,
  49. string name,
  50. string value)
  51. {
  52. Assert(xmlReader[name] == value);
  53. Assert(xmlReader.GetAttribute(name) == value);
  54. }
  55. private void AssertEndDocument(XmlReader xmlReader)
  56. {
  57. Assert(!xmlReader.Read());
  58. Assert(xmlReader.NodeType == XmlNodeType.None);
  59. Assert(xmlReader.Depth == 0);
  60. Assert(xmlReader.ReadState == ReadState.EndOfFile);
  61. Assert(xmlReader.EOF);
  62. xmlReader.Close();
  63. Assert(xmlReader.ReadState == ReadState.Closed);
  64. }
  65. public void TestEmptyElement()
  66. {
  67. string xml = "<foo/>";
  68. XmlReader xmlReader =
  69. new XmlTextReader(new StringReader(xml));
  70. AssertStartDocument(xmlReader);
  71. AssertNode(
  72. xmlReader, // xmlReader
  73. XmlNodeType.Element, // nodeType
  74. 0, // depth
  75. true, // isEmptyElement
  76. "foo", // name
  77. String.Empty, // value
  78. 0 // attributeCount
  79. );
  80. AssertEndDocument(xmlReader);
  81. }
  82. public void TestEmptyElementWithWhitespace()
  83. {
  84. string xml = "<foo />";
  85. XmlReader xmlReader =
  86. new XmlTextReader(new StringReader(xml));
  87. AssertStartDocument(xmlReader);
  88. AssertNode(
  89. xmlReader, // xmlReader
  90. XmlNodeType.Element, // nodeType
  91. 0, //depth
  92. true, // isEmptyElement
  93. "foo", // name
  94. String.Empty, // value
  95. 0 // attributeCount
  96. );
  97. AssertEndDocument(xmlReader);
  98. }
  99. public void TestEmptyElementWithStartAndEndTag()
  100. {
  101. string xml = "<foo></foo>";
  102. XmlReader xmlReader =
  103. new XmlTextReader(new StringReader(xml));
  104. AssertStartDocument(xmlReader);
  105. AssertNode(
  106. xmlReader, // xmlReader
  107. XmlNodeType.Element, // nodeType
  108. 0, //depth
  109. false, // isEmptyElement
  110. "foo", // name
  111. String.Empty, // value
  112. 0 // attributeCount
  113. );
  114. AssertNode(
  115. xmlReader, // xmlReader
  116. XmlNodeType.EndElement, // nodeType
  117. 0, //depth
  118. false, // isEmptyElement
  119. "foo", // name
  120. String.Empty, // value
  121. 0 // attributeCount
  122. );
  123. AssertEndDocument(xmlReader);
  124. }
  125. public void TestEmptyElementWithStartAndEndTagWithWhitespace()
  126. {
  127. string xml = "<foo ></foo >";
  128. XmlReader xmlReader =
  129. new XmlTextReader(new StringReader(xml));
  130. AssertStartDocument(xmlReader);
  131. AssertNode(
  132. xmlReader, // xmlReader
  133. XmlNodeType.Element, // nodeType
  134. 0, //depth
  135. false, // isEmptyElement
  136. "foo", // name
  137. String.Empty, // value
  138. 0 // attributeCount
  139. );
  140. AssertNode(
  141. xmlReader, // xmlReader
  142. XmlNodeType.EndElement, // nodeType
  143. 0, //depth
  144. false, // isEmptyElement
  145. "foo", // name
  146. String.Empty, // value
  147. 0 // attributeCount
  148. );
  149. AssertEndDocument(xmlReader);
  150. }
  151. public void TestNestedEmptyTag()
  152. {
  153. string xml = "<foo><bar/></foo>";
  154. XmlReader xmlReader =
  155. new XmlTextReader(new StringReader(xml));
  156. AssertStartDocument(xmlReader);
  157. AssertNode(
  158. xmlReader, // xmlReader
  159. XmlNodeType.Element, // nodeType
  160. 0, //depth
  161. false, // isEmptyElement
  162. "foo", // name
  163. String.Empty, // value
  164. 0 // attributeCount
  165. );
  166. AssertNode(
  167. xmlReader, // xmlReader
  168. XmlNodeType.Element, // nodeType
  169. 1, //depth
  170. true, // isEmptyElement
  171. "bar", // name
  172. String.Empty, // value
  173. 0 // attributeCount
  174. );
  175. AssertNode(
  176. xmlReader, // xmlReader
  177. XmlNodeType.EndElement, // nodeType
  178. 0, //depth
  179. false, // isEmptyElement
  180. "foo", // name
  181. String.Empty, // value
  182. 0 // attributeCount
  183. );
  184. AssertEndDocument(xmlReader);
  185. }
  186. public void TestNestedText()
  187. {
  188. string xml = "<foo>bar</foo>";
  189. XmlReader xmlReader =
  190. new XmlTextReader(new StringReader(xml));
  191. AssertStartDocument(xmlReader);
  192. AssertNode(
  193. xmlReader, // xmlReader
  194. XmlNodeType.Element, // nodeType
  195. 0, //depth
  196. false, // isEmptyElement
  197. "foo", // name
  198. String.Empty, // value
  199. 0 // attributeCount
  200. );
  201. AssertNode(
  202. xmlReader, // xmlReader
  203. XmlNodeType.Text, // nodeType
  204. 1, //depth
  205. false, // isEmptyElement
  206. String.Empty, // name
  207. "bar", // value
  208. 0 // attributeCount
  209. );
  210. AssertNode(
  211. xmlReader, // xmlReader
  212. XmlNodeType.EndElement, // nodeType
  213. 0, //depth
  214. false, // isEmptyElement
  215. "foo", // name
  216. String.Empty, // value
  217. 0 // attributeCount
  218. );
  219. AssertEndDocument(xmlReader);
  220. }
  221. public void TestEmptyElementWithAttribute()
  222. {
  223. string xml = @"<foo bar=""baz""/>";
  224. XmlReader xmlReader =
  225. new XmlTextReader(new StringReader(xml));
  226. AssertStartDocument(xmlReader);
  227. AssertNode(
  228. xmlReader, // xmlReader
  229. XmlNodeType.Element, // nodeType
  230. 0, //depth
  231. true, // isEmptyElement
  232. "foo", // name
  233. String.Empty, // value
  234. 1 // attributeCount
  235. );
  236. AssertAttribute(
  237. xmlReader, // xmlReader
  238. "bar", // name
  239. "baz" // value
  240. );
  241. AssertEndDocument(xmlReader);
  242. }
  243. public void TestStartAndEndTagWithAttribute()
  244. {
  245. string xml = @"<foo bar='baz'></foo>";
  246. XmlReader xmlReader =
  247. new XmlTextReader(new StringReader(xml));
  248. AssertStartDocument(xmlReader);
  249. AssertNode(
  250. xmlReader, // xmlReader
  251. XmlNodeType.Element, // nodeType
  252. 0, //depth
  253. false, // isEmptyElement
  254. "foo", // name
  255. String.Empty, // value
  256. 1 // attributeCount
  257. );
  258. AssertAttribute(
  259. xmlReader, // xmlReader
  260. "bar", // name
  261. "baz" // value
  262. );
  263. AssertNode(
  264. xmlReader, // xmlReader
  265. XmlNodeType.EndElement, // nodeType
  266. 0, //depth
  267. false, // isEmptyElement
  268. "foo", // name
  269. String.Empty, // value
  270. 0 // attributeCount
  271. );
  272. AssertEndDocument(xmlReader);
  273. }
  274. public void TestEmptyElementWithTwoAttributes()
  275. {
  276. string xml = @"<foo bar=""baz"" quux='quuux'/>";
  277. XmlReader xmlReader =
  278. new XmlTextReader(new StringReader(xml));
  279. AssertStartDocument(xmlReader);
  280. AssertNode(
  281. xmlReader, // xmlReader
  282. XmlNodeType.Element, // nodeType
  283. 0, //depth
  284. true, // isEmptyElement
  285. "foo", // name
  286. String.Empty, // value
  287. 2 // attributeCount
  288. );
  289. AssertAttribute(
  290. xmlReader, // xmlReader
  291. "bar", // name
  292. "baz" // value
  293. );
  294. AssertAttribute(
  295. xmlReader, // xmlReader
  296. "quux", // name
  297. "quuux" // value
  298. );
  299. AssertEndDocument(xmlReader);
  300. }
  301. public void TestProcessingInstructionBeforeDocumentElement()
  302. {
  303. string xml = "<?foo bar?><baz/>";
  304. XmlReader xmlReader =
  305. new XmlTextReader(new StringReader(xml));
  306. AssertStartDocument(xmlReader);
  307. AssertNode(
  308. xmlReader, // xmlReader
  309. XmlNodeType.ProcessingInstruction, // nodeType
  310. 0, //depth
  311. false, // isEmptyElement
  312. "foo", // name
  313. "bar", // value
  314. 0 // attributeCount
  315. );
  316. AssertNode(
  317. xmlReader, // xmlReader
  318. XmlNodeType.Element, // nodeType
  319. 0, //depth
  320. true, // isEmptyElement
  321. "baz", // name
  322. String.Empty, // value
  323. 0 // attributeCount
  324. );
  325. AssertEndDocument(xmlReader);
  326. }
  327. public void TestCommentBeforeDocumentElement()
  328. {
  329. string xml = "<!--foo--><bar/>";
  330. XmlReader xmlReader =
  331. new XmlTextReader(new StringReader(xml));
  332. AssertStartDocument(xmlReader);
  333. AssertNode(
  334. xmlReader, // xmlReader
  335. XmlNodeType.Comment, // nodeType
  336. 0, //depth
  337. false, // isEmptyElement
  338. String.Empty, // name
  339. "foo", // value
  340. 0 // attributeCount
  341. );
  342. AssertNode(
  343. xmlReader, // xmlReader
  344. XmlNodeType.Element, // nodeType
  345. 0, //depth
  346. true, // isEmptyElement
  347. "bar", // name
  348. String.Empty, // value
  349. 0 // attributeCount
  350. );
  351. AssertEndDocument(xmlReader);
  352. }
  353. public void TestPredefinedEntities()
  354. {
  355. string xml = "<foo>&lt;&gt;&amp;&apos;&quot;</foo>";
  356. XmlReader xmlReader =
  357. new XmlTextReader(new StringReader(xml));
  358. AssertStartDocument(xmlReader);
  359. AssertNode(
  360. xmlReader, // xmlReader
  361. XmlNodeType.Element, // nodeType
  362. 0, //depth
  363. false, // isEmptyElement
  364. "foo", // name
  365. String.Empty, // value
  366. 0 // attributeCount
  367. );
  368. AssertNode(
  369. xmlReader, // xmlReader
  370. XmlNodeType.Text, // nodeType
  371. 1, //depth
  372. false, // isEmptyElement
  373. String.Empty, // name
  374. "<>&'\"", // value
  375. 0 // attributeCount
  376. );
  377. AssertNode(
  378. xmlReader, // xmlReader
  379. XmlNodeType.EndElement, // nodeType
  380. 0, //depth
  381. false, // isEmptyElement
  382. "foo", // name
  383. String.Empty, // value
  384. 0 // attributeCount
  385. );
  386. AssertEndDocument(xmlReader);
  387. }
  388. public void TestEntityReference()
  389. {
  390. string xml = "<foo>&bar;</foo>";
  391. XmlReader xmlReader =
  392. new XmlTextReader(new StringReader(xml));
  393. AssertStartDocument(xmlReader);
  394. AssertNode(
  395. xmlReader, // xmlReader
  396. XmlNodeType.Element, // nodeType
  397. 0, //depth
  398. false, // isEmptyElement
  399. "foo", // name
  400. String.Empty, // value
  401. 0 // attributeCount
  402. );
  403. AssertNode(
  404. xmlReader, // xmlReader
  405. XmlNodeType.EntityReference, // nodeType
  406. 1, //depth
  407. false, // isEmptyElement
  408. "bar", // name
  409. String.Empty, // value
  410. 0 // attributeCount
  411. );
  412. AssertNode(
  413. xmlReader, // xmlReader
  414. XmlNodeType.EndElement, // nodeType
  415. 0, //depth
  416. false, // isEmptyElement
  417. "foo", // name
  418. String.Empty, // value
  419. 0 // attributeCount
  420. );
  421. AssertEndDocument(xmlReader);
  422. }
  423. public void TestEntityReferenceInsideText()
  424. {
  425. string xml = "<foo>bar&baz;quux</foo>";
  426. XmlReader xmlReader =
  427. new XmlTextReader(new StringReader(xml));
  428. AssertStartDocument(xmlReader);
  429. AssertNode(
  430. xmlReader, // xmlReader
  431. XmlNodeType.Element, // nodeType
  432. 0, //depth
  433. false, // isEmptyElement
  434. "foo", // name
  435. String.Empty, // value
  436. 0 // attributeCount
  437. );
  438. AssertNode(
  439. xmlReader, // xmlReader
  440. XmlNodeType.Text, // nodeType
  441. 1, //depth
  442. false, // isEmptyElement
  443. String.Empty, // name
  444. "bar", // value
  445. 0 // attributeCount
  446. );
  447. AssertNode(
  448. xmlReader, // xmlReader
  449. XmlNodeType.EntityReference, // nodeType
  450. 1, //depth
  451. false, // isEmptyElement
  452. "baz", // name
  453. String.Empty, // value
  454. 0 // attributeCount
  455. );
  456. AssertNode(
  457. xmlReader, // xmlReader
  458. XmlNodeType.Text, // nodeType
  459. 1, //depth
  460. false, // isEmptyElement
  461. String.Empty, // name
  462. "quux", // value
  463. 0 // attributeCount
  464. );
  465. AssertNode(
  466. xmlReader, // xmlReader
  467. XmlNodeType.EndElement, // nodeType
  468. 0, //depth
  469. false, // isEmptyElement
  470. "foo", // name
  471. String.Empty, // value
  472. 0 // attributeCount
  473. );
  474. AssertEndDocument(xmlReader);
  475. }
  476. public void TestCharacterReferences()
  477. {
  478. string xml = "<foo>&#70;&#x4F;&#x4f;</foo>";
  479. XmlReader xmlReader =
  480. new XmlTextReader(new StringReader(xml));
  481. AssertStartDocument(xmlReader);
  482. AssertNode(
  483. xmlReader, // xmlReader
  484. XmlNodeType.Element, // nodeType
  485. 0, //depth
  486. false, // isEmptyElement
  487. "foo", // name
  488. String.Empty, // value
  489. 0 // attributeCount
  490. );
  491. AssertNode(
  492. xmlReader, // xmlReader
  493. XmlNodeType.Text, // nodeType
  494. 1, //depth
  495. false, // isEmptyElement
  496. String.Empty, // name
  497. "FOO", // value
  498. 0 // attributeCount
  499. );
  500. AssertNode(
  501. xmlReader, // xmlReader
  502. XmlNodeType.EndElement, // nodeType
  503. 0, //depth
  504. false, // isEmptyElement
  505. "foo", // name
  506. String.Empty, // value
  507. 0 // attributeCount
  508. );
  509. AssertEndDocument(xmlReader);
  510. }
  511. public void TestEntityReferenceInAttribute()
  512. {
  513. string xml = "<foo bar='&baz;'/>";
  514. XmlReader xmlReader =
  515. new XmlTextReader(new StringReader(xml));
  516. AssertStartDocument(xmlReader);
  517. AssertNode(
  518. xmlReader, // xmlReader
  519. XmlNodeType.Element, // nodeType
  520. 0, //depth
  521. true, // isEmptyElement
  522. "foo", // name
  523. String.Empty, // value
  524. 1 // attributeCount
  525. );
  526. AssertAttribute(
  527. xmlReader, // xmlReader
  528. "bar", // name
  529. "&baz;" // value
  530. );
  531. AssertEndDocument(xmlReader);
  532. }
  533. public void TestPredefinedEntitiesInAttribute()
  534. {
  535. string xml = "<foo bar='&lt;&gt;&amp;&apos;&quot;'/>";
  536. XmlReader xmlReader =
  537. new XmlTextReader(new StringReader(xml));
  538. AssertStartDocument(xmlReader);
  539. AssertNode(
  540. xmlReader, // xmlReader
  541. XmlNodeType.Element, // nodeType
  542. 0, //depth
  543. true, // isEmptyElement
  544. "foo", // name
  545. String.Empty, // value
  546. 1 // attributeCount
  547. );
  548. AssertAttribute(
  549. xmlReader, // xmlReader
  550. "bar", // name
  551. "<>&'\"" // value
  552. );
  553. AssertEndDocument(xmlReader);
  554. }
  555. public void TestCharacterReferencesInAttribute()
  556. {
  557. string xml = "<foo bar='&#70;&#x4F;&#x4f;'/>";
  558. XmlReader xmlReader =
  559. new XmlTextReader(new StringReader(xml));
  560. AssertStartDocument(xmlReader);
  561. AssertNode(
  562. xmlReader, // xmlReader
  563. XmlNodeType.Element, // nodeType
  564. 0, //depth
  565. true, // isEmptyElement
  566. "foo", // name
  567. String.Empty, // value
  568. 1 // attributeCount
  569. );
  570. AssertAttribute(
  571. xmlReader, // xmlReader
  572. "bar", // name
  573. "FOO" // value
  574. );
  575. AssertEndDocument(xmlReader);
  576. }
  577. public void TestCDATA()
  578. {
  579. string xml = "<foo><![CDATA[<>&]]></foo>";
  580. XmlReader xmlReader =
  581. new XmlTextReader(new StringReader(xml));
  582. AssertStartDocument(xmlReader);
  583. AssertNode(
  584. xmlReader, // xmlReader
  585. XmlNodeType.Element, // nodeType
  586. 0, //depth
  587. false, // isEmptyElement
  588. "foo", // name
  589. String.Empty, // value
  590. 0 // attributeCount
  591. );
  592. AssertNode(
  593. xmlReader, // xmlReader
  594. XmlNodeType.CDATA, // nodeType
  595. 1, //depth
  596. false, // isEmptyElement
  597. String.Empty, // name
  598. "<>&", // value
  599. 0 // attributeCount
  600. );
  601. AssertNode(
  602. xmlReader, // xmlReader
  603. XmlNodeType.EndElement, // nodeType
  604. 0, //depth
  605. false, // isEmptyElement
  606. "foo", // name
  607. String.Empty, // value
  608. 0 // attributeCount
  609. );
  610. AssertEndDocument(xmlReader);
  611. }
  612. // The following is #if'ed out because it's specific to the Mono
  613. // implementation and won't compile when testing Microsoft's code.
  614. // Feel free to turn it on if you want to test Mono's name tables.
  615. #if false
  616. public void TestIsFirstNameChar()
  617. {
  618. for (int ch = 0; ch <= 0xFFFF; ++ch)
  619. {
  620. Assert(
  621. XmlChar.IsFirstNameChar(ch) ==
  622. IsFirstNameChar(ch));
  623. }
  624. }
  625. public void TestIsNameChar()
  626. {
  627. for (int ch = 0; ch <= 0xFFFF; ++ch)
  628. {
  629. Assert(
  630. XmlChar.IsNameChar(ch) ==
  631. IsNameChar(ch));
  632. }
  633. }
  634. private static bool IsFirstNameChar(int ch)
  635. {
  636. return
  637. IsLetter(ch) ||
  638. (ch == '_') ||
  639. (ch == ':');
  640. }
  641. private static bool IsNameChar(int ch)
  642. {
  643. return
  644. IsLetter(ch) ||
  645. IsDigit(ch) ||
  646. (ch == '.') ||
  647. (ch == '-') ||
  648. (ch == '_') ||
  649. (ch == ':') ||
  650. IsCombiningChar(ch) ||
  651. IsExtender(ch);
  652. }
  653. private static bool IsLetter(int ch)
  654. {
  655. return
  656. IsBaseChar(ch) ||
  657. IsIdeographic(ch);
  658. }
  659. private static bool IsBaseChar(int ch)
  660. {
  661. return
  662. (ch >= 0x0041 && ch <= 0x005A) ||
  663. (ch >= 0x0061 && ch <= 0x007A) ||
  664. (ch >= 0x00C0 && ch <= 0x00D6) ||
  665. (ch >= 0x00D8 && ch <= 0x00F6) ||
  666. (ch >= 0x00F8 && ch <= 0x00FF) ||
  667. (ch >= 0x0100 && ch <= 0x0131) ||
  668. (ch >= 0x0134 && ch <= 0x013E) ||
  669. (ch >= 0x0141 && ch <= 0x0148) ||
  670. (ch >= 0x014A && ch <= 0x017E) ||
  671. (ch >= 0x0180 && ch <= 0x01C3) ||
  672. (ch >= 0x01CD && ch <= 0x01F0) ||
  673. (ch >= 0x01F4 && ch <= 0x01F5) ||
  674. (ch >= 0x01FA && ch <= 0x0217) ||
  675. (ch >= 0x0250 && ch <= 0x02A8) ||
  676. (ch >= 0x02BB && ch <= 0x02C1) ||
  677. (ch == 0x0386) ||
  678. (ch >= 0x0388 && ch <= 0x038A) ||
  679. (ch == 0x038C) ||
  680. (ch >= 0x038E && ch <= 0x03A1) ||
  681. (ch >= 0x03A3 && ch <= 0x03CE) ||
  682. (ch >= 0x03D0 && ch <= 0x03D6) ||
  683. (ch == 0x03DA) ||
  684. (ch == 0x03DC) ||
  685. (ch == 0x03DE) ||
  686. (ch == 0x03E0) ||
  687. (ch >= 0x03E2 && ch <= 0x03F3) ||
  688. (ch >= 0x0401 && ch <= 0x040C) ||
  689. (ch >= 0x040E && ch <= 0x044F) ||
  690. (ch >= 0x0451 && ch <= 0x045C) ||
  691. (ch >= 0x045E && ch <= 0x0481) ||
  692. (ch >= 0x0490 && ch <= 0x04C4) ||
  693. (ch >= 0x04C7 && ch <= 0x04C8) ||
  694. (ch >= 0x04CB && ch <= 0x04CC) ||
  695. (ch >= 0x04D0 && ch <= 0x04EB) ||
  696. (ch >= 0x04EE && ch <= 0x04F5) ||
  697. (ch >= 0x04F8 && ch <= 0x04F9) ||
  698. (ch >= 0x0531 && ch <= 0x0556) ||
  699. (ch == 0x0559) ||
  700. (ch >= 0x0561 && ch <= 0x0586) ||
  701. (ch >= 0x05D0 && ch <= 0x05EA) ||
  702. (ch >= 0x05F0 && ch <= 0x05F2) ||
  703. (ch >= 0x0621 && ch <= 0x063A) ||
  704. (ch >= 0x0641 && ch <= 0x064A) ||
  705. (ch >= 0x0671 && ch <= 0x06B7) ||
  706. (ch >= 0x06BA && ch <= 0x06BE) ||
  707. (ch >= 0x06C0 && ch <= 0x06CE) ||
  708. (ch >= 0x06D0 && ch <= 0x06D3) ||
  709. (ch == 0x06D5) ||
  710. (ch >= 0x06E5 && ch <= 0x06E6) ||
  711. (ch >= 0x0905 && ch <= 0x0939) ||
  712. (ch == 0x093D) ||
  713. (ch >= 0x0958 && ch <= 0x0961) ||
  714. (ch >= 0x0985 && ch <= 0x098C) ||
  715. (ch >= 0x098F && ch <= 0x0990) ||
  716. (ch >= 0x0993 && ch <= 0x09A8) ||
  717. (ch >= 0x09AA && ch <= 0x09B0) ||
  718. (ch == 0x09B2) ||
  719. (ch >= 0x09B6 && ch <= 0x09B9) ||
  720. (ch >= 0x09DC && ch <= 0x09DD) ||
  721. (ch >= 0x09DF && ch <= 0x09E1) ||
  722. (ch >= 0x09F0 && ch <= 0x09F1) ||
  723. (ch >= 0x0A05 && ch <= 0x0A0A) ||
  724. (ch >= 0x0A0F && ch <= 0x0A10) ||
  725. (ch >= 0x0A13 && ch <= 0x0A28) ||
  726. (ch >= 0x0A2A && ch <= 0x0A30) ||
  727. (ch >= 0x0A32 && ch <= 0x0A33) ||
  728. (ch >= 0x0A35 && ch <= 0x0A36) ||
  729. (ch >= 0x0A38 && ch <= 0x0A39) ||
  730. (ch >= 0x0A59 && ch <= 0x0A5C) ||
  731. (ch == 0x0A5E) ||
  732. (ch >= 0x0A72 && ch <= 0x0A74) ||
  733. (ch >= 0x0A85 && ch <= 0x0A8B) ||
  734. (ch == 0x0A8D) ||
  735. (ch >= 0x0A8F && ch <= 0x0A91) ||
  736. (ch >= 0x0A93 && ch <= 0x0AA8) ||
  737. (ch >= 0x0AAA && ch <= 0x0AB0) ||
  738. (ch >= 0x0AB2 && ch <= 0x0AB3) ||
  739. (ch >= 0x0AB5 && ch <= 0x0AB9) ||
  740. (ch == 0x0ABD) ||
  741. (ch == 0x0AE0) ||
  742. (ch >= 0x0B05 && ch <= 0x0B0C) ||
  743. (ch >= 0x0B0F && ch <= 0x0B10) ||
  744. (ch >= 0x0B13 && ch <= 0x0B28) ||
  745. (ch >= 0x0B2A && ch <= 0x0B30) ||
  746. (ch >= 0x0B32 && ch <= 0x0B33) ||
  747. (ch >= 0x0B36 && ch <= 0x0B39) ||
  748. (ch == 0x0B3D) ||
  749. (ch >= 0x0B5C && ch <= 0x0B5D) ||
  750. (ch >= 0x0B5F && ch <= 0x0B61) ||
  751. (ch >= 0x0B85 && ch <= 0x0B8A) ||
  752. (ch >= 0x0B8E && ch <= 0x0B90) ||
  753. (ch >= 0x0B92 && ch <= 0x0B95) ||
  754. (ch >= 0x0B99 && ch <= 0x0B9A) ||
  755. (ch == 0x0B9C) ||
  756. (ch >= 0x0B9E && ch <= 0x0B9F) ||
  757. (ch >= 0x0BA3 && ch <= 0x0BA4) ||
  758. (ch >= 0x0BA8 && ch <= 0x0BAA) ||
  759. (ch >= 0x0BAE && ch <= 0x0BB5) ||
  760. (ch >= 0x0BB7 && ch <= 0x0BB9) ||
  761. (ch >= 0x0C05 && ch <= 0x0C0C) ||
  762. (ch >= 0x0C0E && ch <= 0x0C10) ||
  763. (ch >= 0x0C12 && ch <= 0x0C28) ||
  764. (ch >= 0x0C2A && ch <= 0x0C33) ||
  765. (ch >= 0x0C35 && ch <= 0x0C39) ||
  766. (ch >= 0x0C60 && ch <= 0x0C61) ||
  767. (ch >= 0x0C85 && ch <= 0x0C8C) ||
  768. (ch >= 0x0C8E && ch <= 0x0C90) ||
  769. (ch >= 0x0C92 && ch <= 0x0CA8) ||
  770. (ch >= 0x0CAA && ch <= 0x0CB3) ||
  771. (ch >= 0x0CB5 && ch <= 0x0CB9) ||
  772. (ch == 0x0CDE) ||
  773. (ch >= 0x0CE0 && ch <= 0x0CE1) ||
  774. (ch >= 0x0D05 && ch <= 0x0D0C) ||
  775. (ch >= 0x0D0E && ch <= 0x0D10) ||
  776. (ch >= 0x0D12 && ch <= 0x0D28) ||
  777. (ch >= 0x0D2A && ch <= 0x0D39) ||
  778. (ch >= 0x0D60 && ch <= 0x0D61) ||
  779. (ch >= 0x0E01 && ch <= 0x0E2E) ||
  780. (ch == 0x0E30) ||
  781. (ch >= 0x0E32 && ch <= 0x0E33) ||
  782. (ch >= 0x0E40 && ch <= 0x0E45) ||
  783. (ch >= 0x0E81 && ch <= 0x0E82) ||
  784. (ch == 0x0E84) ||
  785. (ch >= 0x0E87 && ch <= 0x0E88) ||
  786. (ch == 0x0E8A) ||
  787. (ch == 0x0E8D) ||
  788. (ch >= 0x0E94 && ch <= 0x0E97) ||
  789. (ch >= 0x0E99 && ch <= 0x0E9F) ||
  790. (ch >= 0x0EA1 && ch <= 0x0EA3) ||
  791. (ch == 0x0EA5) ||
  792. (ch == 0x0EA7) ||
  793. (ch >= 0x0EAA && ch <= 0x0EAB) ||
  794. (ch >= 0x0EAD && ch <= 0x0EAE) ||
  795. (ch == 0x0EB0) ||
  796. (ch >= 0x0EB2 && ch <= 0x0EB3) ||
  797. (ch == 0x0EBD) ||
  798. (ch >= 0x0EC0 && ch <= 0x0EC4) ||
  799. (ch >= 0x0F40 && ch <= 0x0F47) ||
  800. (ch >= 0x0F49 && ch <= 0x0F69) ||
  801. (ch >= 0x10A0 && ch <= 0x10C5) ||
  802. (ch >= 0x10D0 && ch <= 0x10F6) ||
  803. (ch == 0x1100) ||
  804. (ch >= 0x1102 && ch <= 0x1103) ||
  805. (ch >= 0x1105 && ch <= 0x1107) ||
  806. (ch == 0x1109) ||
  807. (ch >= 0x110B && ch <= 0x110C) ||
  808. (ch >= 0x110E && ch <= 0x1112) ||
  809. (ch == 0x113C) ||
  810. (ch == 0x113E) ||
  811. (ch == 0x1140) ||
  812. (ch == 0x114C) ||
  813. (ch == 0x114E) ||
  814. (ch == 0x1150) ||
  815. (ch >= 0x1154 && ch <= 0x1155) ||
  816. (ch == 0x1159) ||
  817. (ch >= 0x115F && ch <= 0x1161) ||
  818. (ch == 0x1163) ||
  819. (ch == 0x1165) ||
  820. (ch == 0x1167) ||
  821. (ch == 0x1169) ||
  822. (ch >= 0x116D && ch <= 0x116E) ||
  823. (ch >= 0x1172 && ch <= 0x1173) ||
  824. (ch == 0x1175) ||
  825. (ch == 0x119E) ||
  826. (ch == 0x11A8) ||
  827. (ch == 0x11AB) ||
  828. (ch >= 0x11AE && ch <= 0x11AF) ||
  829. (ch >= 0x11B7 && ch <= 0x11B8) ||
  830. (ch == 0x11BA) ||
  831. (ch >= 0x11BC && ch <= 0x11C2) ||
  832. (ch == 0x11EB) ||
  833. (ch == 0x11F0) ||
  834. (ch == 0x11F9) ||
  835. (ch >= 0x1E00 && ch <= 0x1E9B) ||
  836. (ch >= 0x1EA0 && ch <= 0x1EF9) ||
  837. (ch >= 0x1F00 && ch <= 0x1F15) ||
  838. (ch >= 0x1F18 && ch <= 0x1F1D) ||
  839. (ch >= 0x1F20 && ch <= 0x1F45) ||
  840. (ch >= 0x1F48 && ch <= 0x1F4D) ||
  841. (ch >= 0x1F50 && ch <= 0x1F57) ||
  842. (ch == 0x1F59) ||
  843. (ch == 0x1F5B) ||
  844. (ch == 0x1F5D) ||
  845. (ch >= 0x1F5F && ch <= 0x1F7D) ||
  846. (ch >= 0x1F80 && ch <= 0x1FB4) ||
  847. (ch >= 0x1FB6 && ch <= 0x1FBC) ||
  848. (ch == 0x1FBE) ||
  849. (ch >= 0x1FC2 && ch <= 0x1FC4) ||
  850. (ch >= 0x1FC6 && ch <= 0x1FCC) ||
  851. (ch >= 0x1FD0 && ch <= 0x1FD3) ||
  852. (ch >= 0x1FD6 && ch <= 0x1FDB) ||
  853. (ch >= 0x1FE0 && ch <= 0x1FEC) ||
  854. (ch >= 0x1FF2 && ch <= 0x1FF4) ||
  855. (ch >= 0x1FF6 && ch <= 0x1FFC) ||
  856. (ch == 0x2126) ||
  857. (ch >= 0x212A && ch <= 0x212B) ||
  858. (ch == 0x212E) ||
  859. (ch >= 0x2180 && ch <= 0x2182) ||
  860. (ch >= 0x3041 && ch <= 0x3094) ||
  861. (ch >= 0x30A1 && ch <= 0x30FA) ||
  862. (ch >= 0x3105 && ch <= 0x312C) ||
  863. (ch >= 0xAC00 && ch <= 0xD7A3);
  864. }
  865. private static bool IsIdeographic(int ch)
  866. {
  867. return
  868. (ch >= 0x4E00 && ch <= 0x9FA5) ||
  869. (ch == 0x3007) ||
  870. (ch >= 0x3021 && ch <= 0x3029);
  871. }
  872. private static bool IsDigit(int ch)
  873. {
  874. return
  875. (ch >= 0x0030 && ch <= 0x0039) ||
  876. (ch >= 0x0660 && ch <= 0x0669) ||
  877. (ch >= 0x06F0 && ch <= 0x06F9) ||
  878. (ch >= 0x0966 && ch <= 0x096F) ||
  879. (ch >= 0x09E6 && ch <= 0x09EF) ||
  880. (ch >= 0x0A66 && ch <= 0x0A6F) ||
  881. (ch >= 0x0AE6 && ch <= 0x0AEF) ||
  882. (ch >= 0x0B66 && ch <= 0x0B6F) ||
  883. (ch >= 0x0BE7 && ch <= 0x0BEF) ||
  884. (ch >= 0x0C66 && ch <= 0x0C6F) ||
  885. (ch >= 0x0CE6 && ch <= 0x0CEF) ||
  886. (ch >= 0x0D66 && ch <= 0x0D6F) ||
  887. (ch >= 0x0E50 && ch <= 0x0E59) ||
  888. (ch >= 0x0ED0 && ch <= 0x0ED9) ||
  889. (ch >= 0x0F20 && ch <= 0x0F29);
  890. }
  891. private static bool IsCombiningChar(int ch)
  892. {
  893. return
  894. (ch >= 0x0300 && ch <= 0x0345) ||
  895. (ch >= 0x0360 && ch <= 0x0361) ||
  896. (ch >= 0x0483 && ch <= 0x0486) ||
  897. (ch >= 0x0591 && ch <= 0x05A1) ||
  898. (ch >= 0x05A3 && ch <= 0x05B9) ||
  899. (ch >= 0x05BB && ch <= 0x05BD) ||
  900. (ch == 0x05BF) ||
  901. (ch >= 0x05C1 && ch <= 0x05C2) ||
  902. (ch == 0x05C4) ||
  903. (ch >= 0x064B && ch <= 0x0652) ||
  904. (ch == 0x0670) ||
  905. (ch >= 0x06D6 && ch <= 0x06DC) ||
  906. (ch >= 0x06DD && ch <= 0x06DF) ||
  907. (ch >= 0x06E0 && ch <= 0x06E4) ||
  908. (ch >= 0x06E7 && ch <= 0x06E8) ||
  909. (ch >= 0x06EA && ch <= 0x06ED) ||
  910. (ch >= 0x0901 && ch <= 0x0903) ||
  911. (ch == 0x093C) ||
  912. (ch >= 0x093E && ch <= 0x094C) ||
  913. (ch == 0x094D) ||
  914. (ch >= 0x0951 && ch <= 0x0954) ||
  915. (ch >= 0x0962 && ch <= 0x0963) ||
  916. (ch >= 0x0981 && ch <= 0x0983) ||
  917. (ch == 0x09BC) ||
  918. (ch == 0x09BE) ||
  919. (ch == 0x09BF) ||
  920. (ch >= 0x09C0 && ch <= 0x09C4) ||
  921. (ch >= 0x09C7 && ch <= 0x09C8) ||
  922. (ch >= 0x09CB && ch <= 0x09CD) ||
  923. (ch == 0x09D7) ||
  924. (ch >= 0x09E2 && ch <= 0x09E3) ||
  925. (ch == 0x0A02) ||
  926. (ch == 0x0A3C) ||
  927. (ch == 0x0A3E) ||
  928. (ch == 0x0A3F) ||
  929. (ch >= 0x0A40 && ch <= 0x0A42) ||
  930. (ch >= 0x0A47 && ch <= 0x0A48) ||
  931. (ch >= 0x0A4B && ch <= 0x0A4D) ||
  932. (ch >= 0x0A70 && ch <= 0x0A71) ||
  933. (ch >= 0x0A81 && ch <= 0x0A83) ||
  934. (ch == 0x0ABC) ||
  935. (ch >= 0x0ABE && ch <= 0x0AC5) ||
  936. (ch >= 0x0AC7 && ch <= 0x0AC9) ||
  937. (ch >= 0x0ACB && ch <= 0x0ACD) ||
  938. (ch >= 0x0B01 && ch <= 0x0B03) ||
  939. (ch == 0x0B3C) ||
  940. (ch >= 0x0B3E && ch <= 0x0B43) ||
  941. (ch >= 0x0B47 && ch <= 0x0B48) ||
  942. (ch >= 0x0B4B && ch <= 0x0B4D) ||
  943. (ch >= 0x0B56 && ch <= 0x0B57) ||
  944. (ch >= 0x0B82 && ch <= 0x0B83) ||
  945. (ch >= 0x0BBE && ch <= 0x0BC2) ||
  946. (ch >= 0x0BC6 && ch <= 0x0BC8) ||
  947. (ch >= 0x0BCA && ch <= 0x0BCD) ||
  948. (ch == 0x0BD7) ||
  949. (ch >= 0x0C01 && ch <= 0x0C03) ||
  950. (ch >= 0x0C3E && ch <= 0x0C44) ||
  951. (ch >= 0x0C46 && ch <= 0x0C48) ||
  952. (ch >= 0x0C4A && ch <= 0x0C4D) ||
  953. (ch >= 0x0C55 && ch <= 0x0C56) ||
  954. (ch >= 0x0C82 && ch <= 0x0C83) ||
  955. (ch >= 0x0CBE && ch <= 0x0CC4) ||
  956. (ch >= 0x0CC6 && ch <= 0x0CC8) ||
  957. (ch >= 0x0CCA && ch <= 0x0CCD) ||
  958. (ch >= 0x0CD5 && ch <= 0x0CD6) ||
  959. (ch >= 0x0D02 && ch <= 0x0D03) ||
  960. (ch >= 0x0D3E && ch <= 0x0D43) ||
  961. (ch >= 0x0D46 && ch <= 0x0D48) ||
  962. (ch >= 0x0D4A && ch <= 0x0D4D) ||
  963. (ch == 0x0D57) ||
  964. (ch == 0x0E31) ||
  965. (ch >= 0x0E34 && ch <= 0x0E3A) ||
  966. (ch >= 0x0E47 && ch <= 0x0E4E) ||
  967. (ch == 0x0EB1) ||
  968. (ch >= 0x0EB4 && ch <= 0x0EB9) ||
  969. (ch >= 0x0EBB && ch <= 0x0EBC) ||
  970. (ch >= 0x0EC8 && ch <= 0x0ECD) ||
  971. (ch >= 0x0F18 && ch <= 0x0F19) ||
  972. (ch == 0x0F35) ||
  973. (ch == 0x0F37) ||
  974. (ch == 0x0F39) ||
  975. (ch == 0x0F3E) ||
  976. (ch == 0x0F3F) ||
  977. (ch >= 0x0F71 && ch <= 0x0F84) ||
  978. (ch >= 0x0F86 && ch <= 0x0F8B) ||
  979. (ch >= 0x0F90 && ch <= 0x0F95) ||
  980. (ch == 0x0F97) ||
  981. (ch >= 0x0F99 && ch <= 0x0FAD) ||
  982. (ch >= 0x0FB1 && ch <= 0x0FB7) ||
  983. (ch == 0x0FB9) ||
  984. (ch >= 0x20D0 && ch <= 0x20DC) ||
  985. (ch == 0x20E1) ||
  986. (ch >= 0x302A && ch <= 0x302F) ||
  987. (ch == 0x3099) ||
  988. (ch == 0x309A);
  989. }
  990. private static bool IsExtender(int ch)
  991. {
  992. return
  993. (ch == 0x00B7) ||
  994. (ch == 0x02D0) ||
  995. (ch == 0x02D1) ||
  996. (ch == 0x0387) ||
  997. (ch == 0x0640) ||
  998. (ch == 0x0E46) ||
  999. (ch == 0x0EC6) ||
  1000. (ch == 0x3005) ||
  1001. (ch >= 0x3031 && ch <= 0x3035) ||
  1002. (ch >= 0x309D && ch <= 0x309E) ||
  1003. (ch >= 0x30FC && ch <= 0x30FE);
  1004. }
  1005. #endif
  1006. public void TestIsName()
  1007. {
  1008. Assert(XmlReader.IsName("foo"));
  1009. Assert(!XmlReader.IsName("1foo"));
  1010. Assert(!XmlReader.IsName(" foo"));
  1011. }
  1012. public void TestIsNameToken()
  1013. {
  1014. Assert(XmlReader.IsNameToken("foo"));
  1015. Assert(XmlReader.IsNameToken("1foo"));
  1016. Assert(!XmlReader.IsNameToken(" foo"));
  1017. }
  1018. }
  1019. }