CodeGeneratorFromExpressionTest.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. //
  2. // Microsoft.CSharp.* Test Cases
  3. //
  4. // Authors:
  5. // Erik LeBel ([email protected])
  6. //
  7. // (c) 2003 Erik LeBel
  8. //
  9. using System;
  10. using System.CodeDom;
  11. using System.CodeDom.Compiler;
  12. using System.IO;
  13. using System.Text;
  14. using Microsoft.CSharp;
  15. using NUnit.Framework;
  16. namespace MonoTests.Microsoft.CSharp
  17. {
  18. /// <summary>
  19. /// Test ICodeGenerator's GenerateCodeFromExpression, along with a
  20. /// minimal set CodeDom components.
  21. /// </summary>
  22. [TestFixture]
  23. public class CodeGeneratorFromExpressionTest
  24. {
  25. private CSharpCodeProvider provider;
  26. private ICodeGenerator generator;
  27. private CodeGeneratorOptions options;
  28. [SetUp]
  29. public void SetUp ()
  30. {
  31. provider = new CSharpCodeProvider ();
  32. generator = provider.CreateGenerator ();
  33. options = new CodeGeneratorOptions ();
  34. }
  35. [Test]
  36. [ExpectedException (typeof (ArgumentException))]
  37. public void DefaultExpressionTest ()
  38. {
  39. using (StringWriter sw = new StringWriter ()) {
  40. Generate (new CodeExpression (), sw);
  41. sw.Close ();
  42. }
  43. }
  44. [Test]
  45. [ExpectedException (typeof (ArgumentNullException))]
  46. public void NullExpressionTest ()
  47. {
  48. using (StringWriter sw = new StringWriter ()) {
  49. Generate (null, sw);
  50. }
  51. }
  52. [Test]
  53. public void TypeReferenceExpressionTest ()
  54. {
  55. StringBuilder sb = new StringBuilder ();
  56. using (StringWriter sw = new StringWriter (sb)) {
  57. Assert.AreEqual ("bool", Generate (new CodeTypeReferenceExpression (typeof (bool)), sw), "#1");
  58. sb.Length = 0;
  59. Assert.AreEqual ("char", Generate (new CodeTypeReferenceExpression (typeof (char)), sw), "#2");
  60. sb.Length = 0;
  61. Assert.AreEqual (typeof(DateTime).FullName, Generate (new CodeTypeReferenceExpression (typeof (DateTime)), sw), "#3");
  62. sb.Length = 0;
  63. Assert.AreEqual ("short", Generate (new CodeTypeReferenceExpression (typeof (short)), sw), "#4");
  64. sb.Length = 0;
  65. Assert.AreEqual ("int", Generate (new CodeTypeReferenceExpression (typeof (int)), sw), "#5");
  66. sb.Length = 0;
  67. Assert.AreEqual ("long", Generate (new CodeTypeReferenceExpression (typeof (long)), sw), "#6");
  68. sb.Length = 0;
  69. Assert.AreEqual ("object", Generate (new CodeTypeReferenceExpression (typeof (object)), sw), "#7");
  70. sb.Length = 0;
  71. Assert.AreEqual ("void", Generate (new CodeTypeReferenceExpression (typeof (void)), sw), "#8");
  72. sb.Length = 0;
  73. Assert.AreEqual ("void", Generate (new CodeTypeReferenceExpression ((string) null), sw), "#9");
  74. sb.Length = 0;
  75. Assert.AreEqual ("void", Generate (new CodeTypeReferenceExpression (""), sw), "#10");
  76. sb.Length = 0;
  77. #if NET_2_0
  78. Assert.AreEqual ("byte", Generate (new CodeTypeReferenceExpression (typeof (byte)), sw), "#11");
  79. sb.Length = 0;
  80. Assert.AreEqual ("decimal", Generate (new CodeTypeReferenceExpression (typeof (decimal)), sw), "#12");
  81. sb.Length = 0;
  82. Assert.AreEqual ("double", Generate (new CodeTypeReferenceExpression (typeof (double)), sw), "#13");
  83. sb.Length = 0;
  84. Assert.AreEqual ("sbyte", Generate (new CodeTypeReferenceExpression (typeof (sbyte)), sw), "#14");
  85. sb.Length = 0;
  86. Assert.AreEqual ("ushort", Generate (new CodeTypeReferenceExpression (typeof (ushort)), sw), "#15");
  87. sb.Length = 0;
  88. Assert.AreEqual ("uint", Generate (new CodeTypeReferenceExpression (typeof (uint)), sw), "#16");
  89. sb.Length = 0;
  90. Assert.AreEqual ("ulong", Generate (new CodeTypeReferenceExpression (typeof (ulong)), sw), "#17");
  91. sb.Length = 0;
  92. Assert.AreEqual ("float", Generate (new CodeTypeReferenceExpression (typeof (float)), sw), "#18");
  93. sb.Length = 0;
  94. #else
  95. Assert.AreEqual (typeof (byte).FullName, Generate (new CodeTypeReferenceExpression (typeof (byte)), sw), "#19");
  96. sb.Length = 0;
  97. Assert.AreEqual (typeof (decimal).FullName, Generate (new CodeTypeReferenceExpression (typeof (decimal)), sw), "#20");
  98. sb.Length = 0;
  99. Assert.AreEqual (typeof (double).FullName, Generate (new CodeTypeReferenceExpression (typeof (double)), sw), "#21");
  100. sb.Length = 0;
  101. Assert.AreEqual (typeof (sbyte).FullName, Generate (new CodeTypeReferenceExpression (typeof (sbyte)), sw), "#22");
  102. sb.Length = 0;
  103. Assert.AreEqual (typeof (ushort).FullName, Generate (new CodeTypeReferenceExpression (typeof (ushort)), sw), "#23");
  104. sb.Length = 0;
  105. Assert.AreEqual (typeof (uint).FullName, Generate (new CodeTypeReferenceExpression (typeof (uint)), sw), "#24");
  106. sb.Length = 0;
  107. Assert.AreEqual (typeof (ulong).FullName, Generate (new CodeTypeReferenceExpression (typeof (ulong)), sw), "#25");
  108. sb.Length = 0;
  109. Assert.AreEqual (typeof (float).FullName, Generate (new CodeTypeReferenceExpression (typeof (float)), sw), "#26");
  110. sb.Length = 0;
  111. #endif
  112. sw.Close ();
  113. }
  114. }
  115. [Test]
  116. public void PrimitiveExpressionTest ()
  117. {
  118. StringBuilder sb = new StringBuilder ();
  119. using (StringWriter sw = new StringWriter (sb)) {
  120. Assert.AreEqual ("null", Generate (new CodePrimitiveExpression (null), sw), "#1");
  121. sb.Length = 0;
  122. Assert.AreEqual ("\"AB\\\"C\"", Generate (new CodePrimitiveExpression ("AB\"C"), sw), "#2");
  123. sb.Length = 0;
  124. Assert.AreEqual ("5", Generate (new CodePrimitiveExpression ((byte) 5), sw), "#4");
  125. sb.Length = 0;
  126. Assert.AreEqual ("20", Generate (new CodePrimitiveExpression ((short) 20), sw), "#5");
  127. sb.Length = 0;
  128. Assert.AreEqual ("243", Generate (new CodePrimitiveExpression (243), sw), "#6");
  129. sb.Length = 0;
  130. Assert.AreEqual ("434343", Generate (new CodePrimitiveExpression ((long) 434343), sw), "#7");
  131. sb.Length = 0;
  132. Assert.AreEqual ("6.445F", Generate (new CodePrimitiveExpression ((float) 6.445), sw), "#8");
  133. sb.Length = 0;
  134. Assert.AreEqual ("5.76", Generate (new CodePrimitiveExpression ((double) 5.76), sw), "#9");
  135. sb.Length = 0;
  136. Assert.AreEqual ("7.667m", Generate (new CodePrimitiveExpression ((decimal) 7.667), sw), "#10");
  137. sb.Length = 0;
  138. Assert.AreEqual ("true", Generate (new CodePrimitiveExpression (true), sw), "#11");
  139. sb.Length = 0;
  140. Assert.AreEqual ("false", Generate (new CodePrimitiveExpression (false), sw), "#12");
  141. sw.Close ();
  142. }
  143. }
  144. [Test]
  145. public void PrimitiveExpressionTest_Char ()
  146. {
  147. StringBuilder sb = new StringBuilder ();
  148. using (StringWriter sw = new StringWriter (sb)) {
  149. Assert.AreEqual ("'\\0'", Generate (new CodePrimitiveExpression ('\0'), sw), "#0");
  150. sb.Length = 0;
  151. Assert.AreEqual ("'\x01'", Generate (new CodePrimitiveExpression ('\x01'), sw), "#1");
  152. sb.Length = 0;
  153. Assert.AreEqual ("'\x02'", Generate (new CodePrimitiveExpression ('\x02'), sw), "#2");
  154. sb.Length = 0;
  155. Assert.AreEqual ("'\x03'", Generate (new CodePrimitiveExpression ('\x03'), sw), "#3");
  156. sb.Length = 0;
  157. Assert.AreEqual ("'\x04'", Generate (new CodePrimitiveExpression ('\x04'), sw), "#4");
  158. sb.Length = 0;
  159. Assert.AreEqual ("'\x05'", Generate (new CodePrimitiveExpression ('\x05'), sw), "#5");
  160. sb.Length = 0;
  161. Assert.AreEqual ("'\x06'", Generate (new CodePrimitiveExpression ('\x06'), sw), "#6");
  162. sb.Length = 0;
  163. Assert.AreEqual ("'\a'", Generate (new CodePrimitiveExpression ('\a'), sw), "#7");
  164. sb.Length = 0;
  165. Assert.AreEqual ("'\b'", Generate (new CodePrimitiveExpression ('\b'), sw), "#8");
  166. sb.Length = 0;
  167. Assert.AreEqual ("'\\t'", Generate (new CodePrimitiveExpression ('\t'), sw), "#9");
  168. sb.Length = 0;
  169. Assert.AreEqual ("'\\n'", Generate (new CodePrimitiveExpression ('\n'), sw), "#10");
  170. sb.Length = 0;
  171. Assert.AreEqual ("'\v'", Generate (new CodePrimitiveExpression ('\v'), sw), "#11");
  172. sb.Length = 0;
  173. Assert.AreEqual ("'\f'", Generate (new CodePrimitiveExpression ('\f'), sw), "#12");
  174. sb.Length = 0;
  175. Assert.AreEqual ("'\\r'", Generate (new CodePrimitiveExpression ('\r'), sw), "#13");
  176. sb.Length = 0;
  177. Assert.AreEqual ("'\x0E'", Generate (new CodePrimitiveExpression ('\x0E'), sw), "#14");
  178. sb.Length = 0;
  179. Assert.AreEqual ("'\x0F'", Generate (new CodePrimitiveExpression ('\x0F'), sw), "#15");
  180. sb.Length = 0;
  181. Assert.AreEqual ("'\x10'", Generate (new CodePrimitiveExpression ('\x10'), sw), "#16");
  182. sb.Length = 0;
  183. Assert.AreEqual ("'\x11'", Generate (new CodePrimitiveExpression ('\x11'), sw), "#17");
  184. sb.Length = 0;
  185. Assert.AreEqual ("'\x12'", Generate (new CodePrimitiveExpression ('\x12'), sw), "#18");
  186. sb.Length = 0;
  187. Assert.AreEqual ("'\x13'", Generate (new CodePrimitiveExpression ('\x13'), sw), "#19");
  188. sb.Length = 0;
  189. Assert.AreEqual ("'\x14'", Generate (new CodePrimitiveExpression ('\x14'), sw), "#20");
  190. sb.Length = 0;
  191. Assert.AreEqual ("'\x15'", Generate (new CodePrimitiveExpression ('\x15'), sw), "#21");
  192. sb.Length = 0;
  193. Assert.AreEqual ("'\x16'", Generate (new CodePrimitiveExpression ('\x16'), sw), "#22");
  194. sb.Length = 0;
  195. Assert.AreEqual ("'\x17'", Generate (new CodePrimitiveExpression ('\x17'), sw), "#23");
  196. sb.Length = 0;
  197. Assert.AreEqual ("'\x18'", Generate (new CodePrimitiveExpression ('\x18'), sw), "#24");
  198. sb.Length = 0;
  199. Assert.AreEqual ("'\x19'", Generate (new CodePrimitiveExpression ('\x19'), sw), "#25");
  200. sb.Length = 0;
  201. Assert.AreEqual ("'\x1A'", Generate (new CodePrimitiveExpression ('\x1A'), sw), "#26");
  202. sb.Length = 0;
  203. Assert.AreEqual ("'\x1B'", Generate (new CodePrimitiveExpression ('\x1B'), sw), "#27");
  204. sb.Length = 0;
  205. Assert.AreEqual ("'\x1C'", Generate (new CodePrimitiveExpression ('\x1C'), sw), "#28");
  206. sb.Length = 0;
  207. Assert.AreEqual ("'\x1D'", Generate (new CodePrimitiveExpression ('\x1D'), sw), "#29");
  208. sb.Length = 0;
  209. Assert.AreEqual ("'\x1E'", Generate (new CodePrimitiveExpression ('\x1E'), sw), "#30");
  210. sb.Length = 0;
  211. Assert.AreEqual ("'\x1F'", Generate (new CodePrimitiveExpression ('\x1F'), sw), "#31");
  212. sb.Length = 0;
  213. Assert.AreEqual ("'\x20'", Generate (new CodePrimitiveExpression ('\x20'), sw), "#32");
  214. sb.Length = 0;
  215. Assert.AreEqual ("'\x21'", Generate (new CodePrimitiveExpression ('\x21'), sw), "#33");
  216. sb.Length = 0;
  217. Assert.AreEqual ("'\\\"'", Generate (new CodePrimitiveExpression ('"'), sw), "#34");
  218. sb.Length = 0;
  219. Assert.AreEqual ("'\x23'", Generate (new CodePrimitiveExpression ('\x23'), sw), "#35");
  220. sb.Length = 0;
  221. Assert.AreEqual ("'\x24'", Generate (new CodePrimitiveExpression ('\x24'), sw), "#36");
  222. sb.Length = 0;
  223. Assert.AreEqual ("'\x25'", Generate (new CodePrimitiveExpression ('\x25'), sw), "#37");
  224. sb.Length = 0;
  225. Assert.AreEqual ("'\x26'", Generate (new CodePrimitiveExpression ('\x26'), sw), "#38");
  226. sb.Length = 0;
  227. Assert.AreEqual ("'\\''", Generate (new CodePrimitiveExpression ('\''), sw), "#39");
  228. sb.Length = 0;
  229. #if NET_2_0
  230. Assert.AreEqual ("'\\u2028'", Generate (new CodePrimitiveExpression ('\u2028'), sw), "#40");
  231. #else
  232. Assert.AreEqual ("'\\u8232'", Generate (new CodePrimitiveExpression ('\u2028'), sw), "#40");
  233. #endif
  234. sb.Length = 0;
  235. #if NET_2_0
  236. Assert.AreEqual ("'\\u2029'", Generate (new CodePrimitiveExpression ('\u2029'), sw), "#41");
  237. #else
  238. Assert.AreEqual ("'\\u8233'", Generate (new CodePrimitiveExpression ('\u2029'), sw), "#41");
  239. #endif
  240. sb.Length = 0;
  241. Assert.AreEqual ("'\u2030'", Generate (new CodePrimitiveExpression ('\u2030'), sw), "#42");
  242. sw.Close ();
  243. }
  244. }
  245. [Test]
  246. #if ONLY_1_1
  247. [ExpectedException (typeof (ArgumentException))]
  248. #endif
  249. public void PrimitiveExpressionTest_SByte ()
  250. {
  251. StringBuilder sb = new StringBuilder ();
  252. using (StringWriter sw = new StringWriter (sb)) {
  253. Assert.AreEqual ("5", Generate (new CodePrimitiveExpression ((sbyte) 5), sw));
  254. sw.Close ();
  255. }
  256. }
  257. [Test]
  258. #if ONLY_1_1
  259. [ExpectedException (typeof (ArgumentException))]
  260. #endif
  261. public void PrimitiveExpressionTest_UInt16 ()
  262. {
  263. StringBuilder sb = new StringBuilder ();
  264. using (StringWriter sw = new StringWriter (sb)) {
  265. Assert.AreEqual ("5", Generate (new CodePrimitiveExpression ((ushort) 5), sw));
  266. sw.Close ();
  267. }
  268. }
  269. [Test]
  270. #if ONLY_1_1
  271. [ExpectedException (typeof (ArgumentException))]
  272. #endif
  273. public void PrimitiveExpressionTest_UInt32 ()
  274. {
  275. StringBuilder sb = new StringBuilder ();
  276. using (StringWriter sw = new StringWriter (sb)) {
  277. Assert.AreEqual ("5u", Generate (new CodePrimitiveExpression ((uint) 5), sw));
  278. sw.Close ();
  279. }
  280. }
  281. [Test]
  282. #if ONLY_1_1
  283. [ExpectedException (typeof (ArgumentException))]
  284. #endif
  285. public void PrimitiveExpressionTest_UInt64 ()
  286. {
  287. StringBuilder sb = new StringBuilder ();
  288. using (StringWriter sw = new StringWriter (sb)) {
  289. Assert.AreEqual ("5ul", Generate (new CodePrimitiveExpression ((ulong) 5), sw));
  290. sw.Close ();
  291. }
  292. }
  293. [Test]
  294. public void ParameterDeclarationExpressionTest ()
  295. {
  296. CodeParameterDeclarationExpression cpde = null;
  297. StringBuilder sb = new StringBuilder ();
  298. using (StringWriter sw = new StringWriter (sb)) {
  299. cpde = new CodeParameterDeclarationExpression ();
  300. Assert.AreEqual ("void ", Generate (cpde, sw), "#1");
  301. sb.Length = 0;
  302. cpde = new CodeParameterDeclarationExpression ((string) null,
  303. (string) null);
  304. Assert.AreEqual ("void ", Generate (cpde, sw), "#2");
  305. sb.Length = 0;
  306. cpde = new CodeParameterDeclarationExpression ("A", (string) null);
  307. Assert.AreEqual ("A ", Generate (cpde, sw), "#4");
  308. sb.Length = 0;
  309. cpde = new CodeParameterDeclarationExpression ((string) null, "B");
  310. Assert.AreEqual ("void B", Generate (cpde, sw), "#4");
  311. sb.Length = 0;
  312. cpde = new CodeParameterDeclarationExpression ("A", "B");
  313. Assert.AreEqual ("A B", Generate (cpde, sw), "#5");
  314. sb.Length = 0;
  315. cpde.Direction = FieldDirection.Out;
  316. Assert.AreEqual ("out A B", Generate (cpde, sw), "#6");
  317. sb.Length = 0;
  318. cpde.Direction = FieldDirection.Ref;
  319. Assert.AreEqual ("ref A B", Generate (cpde, sw), "#7");
  320. sb.Length = 0;
  321. }
  322. }
  323. private string Generate (CodeExpression expression, StringWriter sw)
  324. {
  325. generator.GenerateCodeFromExpression (expression, sw, options);
  326. return sw.ToString ();
  327. }
  328. }
  329. }