Test.cs 21 KB

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