2 // Microsoft.CSharp.* Test Cases
5 // Erik LeBel (eriklebel@yahoo.ca)
11 using System.CodeDom.Compiler;
12 using System.Globalization;
16 using Microsoft.CSharp;
18 using NUnit.Framework;
20 namespace MonoTests.Microsoft.CSharp
23 /// Test ICodeGenerator's GenerateCodeFromExpression, along with a
24 /// minimal set CodeDom components.
27 public class CodeGeneratorFromExpressionTest
29 private CSharpCodeProvider provider;
30 private ICodeGenerator generator;
31 private CodeGeneratorOptions options;
36 provider = new CSharpCodeProvider ();
37 generator = provider.CreateGenerator ();
38 options = new CodeGeneratorOptions ();
42 public void DefaultExpressionTest ()
44 using (StringWriter sw = new StringWriter ()) {
46 Generate (new CodeExpression (), sw);
48 } catch (ArgumentException ex) {
49 // Element type System.CodeDom.CodeExpression is not supported
50 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
51 Assert.IsNull (ex.InnerException, "#3");
52 Assert.IsNotNull (ex.Message, "#4");
53 Assert.AreEqual ("e", ex.ParamName, "#5");
59 public void NullExpressionTest ()
61 using (StringWriter sw = new StringWriter ()) {
65 } catch (ArgumentNullException ex) {
66 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
67 Assert.IsNull (ex.InnerException, "#3");
68 Assert.IsNotNull (ex.Message, "#4");
69 Assert.AreEqual ("e", ex.ParamName, "#5");
75 public void TypeReferenceExpressionTest ()
77 StringBuilder sb = new StringBuilder ();
79 using (StringWriter sw = new StringWriter (sb)) {
80 Assert.AreEqual ("bool", Generate (new CodeTypeReferenceExpression (typeof (bool)), sw), "#1");
82 Assert.AreEqual ("char", Generate (new CodeTypeReferenceExpression (typeof (char)), sw), "#2");
84 Assert.AreEqual (typeof(DateTime).FullName, Generate (new CodeTypeReferenceExpression (typeof (DateTime)), sw), "#3");
86 Assert.AreEqual ("short", Generate (new CodeTypeReferenceExpression (typeof (short)), sw), "#4");
88 Assert.AreEqual ("int", Generate (new CodeTypeReferenceExpression (typeof (int)), sw), "#5");
90 Assert.AreEqual ("long", Generate (new CodeTypeReferenceExpression (typeof (long)), sw), "#6");
92 Assert.AreEqual ("object", Generate (new CodeTypeReferenceExpression (typeof (object)), sw), "#7");
94 Assert.AreEqual ("void", Generate (new CodeTypeReferenceExpression (typeof (void)), sw), "#8");
96 Assert.AreEqual ("void", Generate (new CodeTypeReferenceExpression ((string) null), sw), "#9");
98 Assert.AreEqual ("void", Generate (new CodeTypeReferenceExpression (""), sw), "#10");
101 Assert.AreEqual ("byte", Generate (new CodeTypeReferenceExpression (typeof (byte)), sw), "#11");
103 Assert.AreEqual ("decimal", Generate (new CodeTypeReferenceExpression (typeof (decimal)), sw), "#12");
105 Assert.AreEqual ("double", Generate (new CodeTypeReferenceExpression (typeof (double)), sw), "#13");
107 Assert.AreEqual ("sbyte", Generate (new CodeTypeReferenceExpression (typeof (sbyte)), sw), "#14");
109 Assert.AreEqual ("ushort", Generate (new CodeTypeReferenceExpression (typeof (ushort)), sw), "#15");
111 Assert.AreEqual ("uint", Generate (new CodeTypeReferenceExpression (typeof (uint)), sw), "#16");
113 Assert.AreEqual ("ulong", Generate (new CodeTypeReferenceExpression (typeof (ulong)), sw), "#17");
115 Assert.AreEqual ("float", Generate (new CodeTypeReferenceExpression (typeof (float)), sw), "#18");
118 Assert.AreEqual (typeof (byte).FullName, Generate (new CodeTypeReferenceExpression (typeof (byte)), sw), "#19");
120 Assert.AreEqual (typeof (decimal).FullName, Generate (new CodeTypeReferenceExpression (typeof (decimal)), sw), "#20");
122 Assert.AreEqual (typeof (double).FullName, Generate (new CodeTypeReferenceExpression (typeof (double)), sw), "#21");
124 Assert.AreEqual (typeof (sbyte).FullName, Generate (new CodeTypeReferenceExpression (typeof (sbyte)), sw), "#22");
126 Assert.AreEqual (typeof (ushort).FullName, Generate (new CodeTypeReferenceExpression (typeof (ushort)), sw), "#23");
128 Assert.AreEqual (typeof (uint).FullName, Generate (new CodeTypeReferenceExpression (typeof (uint)), sw), "#24");
130 Assert.AreEqual (typeof (ulong).FullName, Generate (new CodeTypeReferenceExpression (typeof (ulong)), sw), "#25");
132 Assert.AreEqual (typeof (float).FullName, Generate (new CodeTypeReferenceExpression (typeof (float)), sw), "#26");
140 public void PrimitiveExpressionTest ()
142 StringBuilder sb = new StringBuilder ();
144 using (StringWriter sw = new StringWriter (sb)) {
145 Assert.AreEqual ("null", Generate (new CodePrimitiveExpression (null), sw), "#1");
147 Assert.AreEqual ("\"AB\\\"C\"", Generate (new CodePrimitiveExpression ("AB\"C"), sw), "#2");
149 Assert.AreEqual ("5", Generate (new CodePrimitiveExpression ((byte) 5), sw), "#4");
151 Assert.AreEqual ("20", Generate (new CodePrimitiveExpression ((short) 20), sw), "#5");
153 Assert.AreEqual ("243", Generate (new CodePrimitiveExpression (243), sw), "#6");
155 Assert.AreEqual ("434343", Generate (new CodePrimitiveExpression ((long) 434343), sw), "#7");
157 Assert.AreEqual ("6.445F", Generate (new CodePrimitiveExpression ((float) 6.445), sw), "#8");
159 Assert.AreEqual ("5.76", Generate (new CodePrimitiveExpression ((double) 5.76), sw), "#9");
161 Assert.AreEqual ("7.667m", Generate (new CodePrimitiveExpression ((decimal) 7.667), sw), "#10");
163 Assert.AreEqual ("true", Generate (new CodePrimitiveExpression (true), sw), "#11");
165 Assert.AreEqual ("false", Generate (new CodePrimitiveExpression (false), sw), "#12");
171 public void PrimitiveExpressionTest_Char ()
173 StringBuilder sb = new StringBuilder ();
175 using (StringWriter sw = new StringWriter (sb)) {
176 Assert.AreEqual ("'\\0'", Generate (new CodePrimitiveExpression ('\0'), sw), "#0");
178 Assert.AreEqual ("'\x01'", Generate (new CodePrimitiveExpression ('\x01'), sw), "#1");
180 Assert.AreEqual ("'\x02'", Generate (new CodePrimitiveExpression ('\x02'), sw), "#2");
182 Assert.AreEqual ("'\x03'", Generate (new CodePrimitiveExpression ('\x03'), sw), "#3");
184 Assert.AreEqual ("'\x04'", Generate (new CodePrimitiveExpression ('\x04'), sw), "#4");
186 Assert.AreEqual ("'\x05'", Generate (new CodePrimitiveExpression ('\x05'), sw), "#5");
188 Assert.AreEqual ("'\x06'", Generate (new CodePrimitiveExpression ('\x06'), sw), "#6");
190 Assert.AreEqual ("'\a'", Generate (new CodePrimitiveExpression ('\a'), sw), "#7");
192 Assert.AreEqual ("'\b'", Generate (new CodePrimitiveExpression ('\b'), sw), "#8");
194 Assert.AreEqual ("'\\t'", Generate (new CodePrimitiveExpression ('\t'), sw), "#9");
196 Assert.AreEqual ("'\\n'", Generate (new CodePrimitiveExpression ('\n'), sw), "#10");
198 Assert.AreEqual ("'\v'", Generate (new CodePrimitiveExpression ('\v'), sw), "#11");
200 Assert.AreEqual ("'\f'", Generate (new CodePrimitiveExpression ('\f'), sw), "#12");
202 Assert.AreEqual ("'\\r'", Generate (new CodePrimitiveExpression ('\r'), sw), "#13");
204 Assert.AreEqual ("'\x0E'", Generate (new CodePrimitiveExpression ('\x0E'), sw), "#14");
206 Assert.AreEqual ("'\x0F'", Generate (new CodePrimitiveExpression ('\x0F'), sw), "#15");
208 Assert.AreEqual ("'\x10'", Generate (new CodePrimitiveExpression ('\x10'), sw), "#16");
210 Assert.AreEqual ("'\x11'", Generate (new CodePrimitiveExpression ('\x11'), sw), "#17");
212 Assert.AreEqual ("'\x12'", Generate (new CodePrimitiveExpression ('\x12'), sw), "#18");
214 Assert.AreEqual ("'\x13'", Generate (new CodePrimitiveExpression ('\x13'), sw), "#19");
216 Assert.AreEqual ("'\x14'", Generate (new CodePrimitiveExpression ('\x14'), sw), "#20");
218 Assert.AreEqual ("'\x15'", Generate (new CodePrimitiveExpression ('\x15'), sw), "#21");
220 Assert.AreEqual ("'\x16'", Generate (new CodePrimitiveExpression ('\x16'), sw), "#22");
222 Assert.AreEqual ("'\x17'", Generate (new CodePrimitiveExpression ('\x17'), sw), "#23");
224 Assert.AreEqual ("'\x18'", Generate (new CodePrimitiveExpression ('\x18'), sw), "#24");
226 Assert.AreEqual ("'\x19'", Generate (new CodePrimitiveExpression ('\x19'), sw), "#25");
228 Assert.AreEqual ("'\x1A'", Generate (new CodePrimitiveExpression ('\x1A'), sw), "#26");
230 Assert.AreEqual ("'\x1B'", Generate (new CodePrimitiveExpression ('\x1B'), sw), "#27");
232 Assert.AreEqual ("'\x1C'", Generate (new CodePrimitiveExpression ('\x1C'), sw), "#28");
234 Assert.AreEqual ("'\x1D'", Generate (new CodePrimitiveExpression ('\x1D'), sw), "#29");
236 Assert.AreEqual ("'\x1E'", Generate (new CodePrimitiveExpression ('\x1E'), sw), "#30");
238 Assert.AreEqual ("'\x1F'", Generate (new CodePrimitiveExpression ('\x1F'), sw), "#31");
240 Assert.AreEqual ("'\x20'", Generate (new CodePrimitiveExpression ('\x20'), sw), "#32");
242 Assert.AreEqual ("'\x21'", Generate (new CodePrimitiveExpression ('\x21'), sw), "#33");
244 Assert.AreEqual ("'\\\"'", Generate (new CodePrimitiveExpression ('"'), sw), "#34");
246 Assert.AreEqual ("'\x23'", Generate (new CodePrimitiveExpression ('\x23'), sw), "#35");
248 Assert.AreEqual ("'\x24'", Generate (new CodePrimitiveExpression ('\x24'), sw), "#36");
250 Assert.AreEqual ("'\x25'", Generate (new CodePrimitiveExpression ('\x25'), sw), "#37");
252 Assert.AreEqual ("'\x26'", Generate (new CodePrimitiveExpression ('\x26'), sw), "#38");
254 Assert.AreEqual ("'\\''", Generate (new CodePrimitiveExpression ('\''), sw), "#39");
257 Assert.AreEqual ("'\\u2028'", Generate (new CodePrimitiveExpression ('\u2028'), sw), "#40");
259 Assert.AreEqual ("'\\u8232'", Generate (new CodePrimitiveExpression ('\u2028'), sw), "#40");
263 Assert.AreEqual ("'\\u2029'", Generate (new CodePrimitiveExpression ('\u2029'), sw), "#41");
265 Assert.AreEqual ("'\\u8233'", Generate (new CodePrimitiveExpression ('\u2029'), sw), "#41");
268 Assert.AreEqual ("'\u2030'", Generate (new CodePrimitiveExpression ('\u2030'), sw), "#42");
275 [ExpectedException (typeof (ArgumentException))]
277 public void PrimitiveExpressionTest_SByte ()
279 StringBuilder sb = new StringBuilder ();
281 using (StringWriter sw = new StringWriter (sb)) {
282 Assert.AreEqual ("5", Generate (new CodePrimitiveExpression ((sbyte) 5), sw));
289 [ExpectedException (typeof (ArgumentException))]
291 public void PrimitiveExpressionTest_UInt16 ()
293 StringBuilder sb = new StringBuilder ();
295 using (StringWriter sw = new StringWriter (sb)) {
296 Assert.AreEqual ("5", Generate (new CodePrimitiveExpression ((ushort) 5), sw));
303 [ExpectedException (typeof (ArgumentException))]
305 public void PrimitiveExpressionTest_UInt32 ()
307 StringBuilder sb = new StringBuilder ();
309 using (StringWriter sw = new StringWriter (sb)) {
310 Assert.AreEqual ("5u", Generate (new CodePrimitiveExpression ((uint) 5), sw));
317 [ExpectedException (typeof (ArgumentException))]
319 public void PrimitiveExpressionTest_UInt64 ()
321 StringBuilder sb = new StringBuilder ();
323 using (StringWriter sw = new StringWriter (sb)) {
324 Assert.AreEqual ("5ul", Generate (new CodePrimitiveExpression ((ulong) 5), sw));
330 public void ParameterDeclarationExpressionTest ()
332 CodeParameterDeclarationExpression cpde = null;
334 StringBuilder sb = new StringBuilder ();
336 using (StringWriter sw = new StringWriter (sb)) {
337 cpde = new CodeParameterDeclarationExpression ();
338 Assert.AreEqual ("void ", Generate (cpde, sw), "#1");
341 cpde = new CodeParameterDeclarationExpression ((string) null,
343 Assert.AreEqual ("void ", Generate (cpde, sw), "#2");
346 cpde = new CodeParameterDeclarationExpression ("A", (string) null);
347 Assert.AreEqual ("A ", Generate (cpde, sw), "#4");
350 cpde = new CodeParameterDeclarationExpression ((string) null, "B");
351 Assert.AreEqual ("void B", Generate (cpde, sw), "#4");
354 cpde = new CodeParameterDeclarationExpression ("A", "B");
355 Assert.AreEqual ("A B", Generate (cpde, sw), "#5");
358 cpde.Direction = FieldDirection.Out;
359 Assert.AreEqual ("out A B", Generate (cpde, sw), "#6");
362 cpde.Direction = FieldDirection.Ref;
363 Assert.AreEqual ("ref A B", Generate (cpde, sw), "#7");
369 public void ArrayCreateExpressionTest ()
373 sb = new StringBuilder ();
374 using (StringWriter sw = new StringWriter (sb)) {
376 string.Format (CultureInfo.InvariantCulture,
377 "new int[] {{{0} 5}}",
378 Environment.NewLine),
379 Generate (new CodeArrayCreateExpression (
381 new CodeExpression [] {
382 new CodePrimitiveExpression (5)
387 sb = new StringBuilder ();
388 using (StringWriter sw = new StringWriter (sb)) {
389 Assert.AreEqual ("new int[5]",
390 Generate (new CodeArrayCreateExpression (
392 new CodePrimitiveExpression (5))
396 sb = new StringBuilder ();
397 using (StringWriter sw = new StringWriter (sb)) {
399 string.Format (CultureInfo.InvariantCulture,
400 "new string[] {{{0}" +
404 Environment.NewLine),
405 Generate (new CodeArrayCreateExpression (
407 new CodeExpression [] {
408 new CodePrimitiveExpression ("a"),
409 new CodePrimitiveExpression ("b"),
410 new CodePrimitiveExpression ("c"),
418 public void EscapedIdentifierTest ()
423 sb = new StringBuilder ();
424 using (StringWriter sw = new StringWriter (sb)) {
425 code = Generate (new CodeVariableReferenceExpression ("using"), sw);
426 Assert.AreEqual ("@using", code, "#1");
430 sb = new StringBuilder ();
431 using (StringWriter sw = new StringWriter (sb)) {
432 code = Generate (new CodeTypeReferenceExpression ("using"), sw);
433 Assert.AreEqual ("@using", code, "#2");
437 sb = new StringBuilder ();
438 using (StringWriter sw = new StringWriter (sb)) {
439 code = Generate (new CodePropertyReferenceExpression (null, "using"), sw);
440 Assert.AreEqual ("@using", code, "#3");
444 sb = new StringBuilder ();
445 using (StringWriter sw = new StringWriter (sb)) {
446 code = Generate (new CodeMethodReferenceExpression (null, "using"), sw);
447 Assert.AreEqual ("@using", code, "#4");
451 sb = new StringBuilder ();
452 using (StringWriter sw = new StringWriter (sb)) {
453 code = Generate (new CodeFieldReferenceExpression (null, "using"), sw);
454 Assert.AreEqual ("@using", code, "#5");
458 sb = new StringBuilder ();
459 using (StringWriter sw = new StringWriter (sb)) {
460 code = Generate (new CodeEventReferenceExpression (null, "using"), sw);
461 Assert.AreEqual ("@using", code, "#6");
467 public void EventReferenceTest ()
472 sb = new StringBuilder ();
473 using (StringWriter sw = new StringWriter (sb)) {
474 code = Generate (new CodeEventReferenceExpression (null, null), sw);
475 Assert.AreEqual (string.Empty, code, "#1");
478 sb = new StringBuilder ();
479 using (StringWriter sw = new StringWriter (sb)) {
480 code = Generate (new CodeEventReferenceExpression (null, "abc"), sw);
481 Assert.AreEqual ("abc", code, "#2");
484 sb = new StringBuilder ();
485 using (StringWriter sw = new StringWriter (sb)) {
486 code = Generate (new CodeEventReferenceExpression (new CodeThisReferenceExpression (), null), sw);
487 Assert.AreEqual ("this.", code, "#3");
490 sb = new StringBuilder ();
491 using (StringWriter sw = new StringWriter (sb)) {
492 code = Generate (new CodeEventReferenceExpression (new CodeThisReferenceExpression (), "abc"), sw);
493 Assert.AreEqual ("this.abc", code, "#4");
496 sb = new StringBuilder ();
497 using (StringWriter sw = new StringWriter (sb)) {
498 code = Generate (new CodeEventReferenceExpression (new CodePrimitiveExpression ("primitive"), null), sw);
499 Assert.AreEqual ("\"primitive\".", code, "#5");
502 sb = new StringBuilder ();
503 using (StringWriter sw = new StringWriter (sb)) {
504 code = Generate (new CodeEventReferenceExpression (new CodePrimitiveExpression ("primitive"), "abc"), sw);
505 Assert.AreEqual ("\"primitive\".abc", code, "#6");
511 public void DefaultValueExpressionTest ()
513 StringBuilder sb = new StringBuilder ();
515 using (StringWriter sw = new StringWriter (sb)) {
516 Assert.AreEqual ("default(string)", Generate (new CodeDefaultValueExpression (new CodeTypeReference (typeof(string))), sw), "#0");
524 public void DelegateInvokeTest ()
529 sb = new StringBuilder ();
530 using (StringWriter sw = new StringWriter (sb)) {
531 code = Generate (new CodeDelegateInvokeExpression (null, new CodePrimitiveExpression ("abc")), sw);
532 Assert.AreEqual ("(\"abc\")", code, "#1");
535 sb = new StringBuilder ();
536 using (StringWriter sw = new StringWriter (sb)) {
537 code = Generate (new CodeDelegateInvokeExpression (new CodeThisReferenceExpression (), new CodePrimitiveExpression ("abc")), sw);
538 Assert.AreEqual ("this(\"abc\")", code, "#2");
541 sb = new StringBuilder ();
542 using (StringWriter sw = new StringWriter (sb)) {
543 code = Generate (new CodeDelegateInvokeExpression (new CodePrimitiveExpression ("primitive"), new CodePrimitiveExpression ("abc")), sw);
544 Assert.AreEqual ("\"primitive\"(\"abc\")", code, "#3");
547 sb = new StringBuilder ();
548 using (StringWriter sw = new StringWriter (sb)) {
549 code = Generate (new CodeDelegateInvokeExpression (new CodeEventReferenceExpression (new CodeThisReferenceExpression (), "Click"), new CodePrimitiveExpression ("abc")), sw);
550 Assert.AreEqual ("this.Click(\"abc\")", code, "#4");
553 sb = new StringBuilder ();
554 using (StringWriter sw = new StringWriter (sb)) {
555 code = Generate (new CodeDelegateInvokeExpression (new CodeEventReferenceExpression (new CodeThisReferenceExpression (), null), new CodePrimitiveExpression ("abc")), sw);
556 Assert.AreEqual ("this.(\"abc\")", code, "#5");
559 sb = new StringBuilder ();
560 using (StringWriter sw = new StringWriter (sb)) {
561 code = Generate (new CodeDelegateInvokeExpression (new CodeEventReferenceExpression (new CodePrimitiveExpression ("primitive"), "Click"), new CodePrimitiveExpression ("abc")), sw);
562 Assert.AreEqual ("\"primitive\".Click(\"abc\")", code, "#6");
565 sb = new StringBuilder ();
566 using (StringWriter sw = new StringWriter (sb)) {
567 code = Generate (new CodeDelegateInvokeExpression (new CodeEventReferenceExpression (new CodePrimitiveExpression ("primitive"), null), new CodePrimitiveExpression ("abc")), sw);
568 Assert.AreEqual ("\"primitive\".(\"abc\")", code, "#7");
571 sb = new StringBuilder ();
572 using (StringWriter sw = new StringWriter (sb)) {
573 code = Generate (new CodeDelegateInvokeExpression (), sw);
574 Assert.AreEqual ("()", code, "#8");
578 private string Generate (CodeExpression expression, StringWriter sw)
580 generator.GenerateCodeFromExpression (expression, sw, options);
581 return sw.ToString ();