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");
100 Assert
.AreEqual ("byte", Generate (new CodeTypeReferenceExpression (typeof (byte)), sw
), "#11");
102 Assert
.AreEqual ("decimal", Generate (new CodeTypeReferenceExpression (typeof (decimal)), sw
), "#12");
104 Assert
.AreEqual ("double", Generate (new CodeTypeReferenceExpression (typeof (double)), sw
), "#13");
106 Assert
.AreEqual ("sbyte", Generate (new CodeTypeReferenceExpression (typeof (sbyte)), sw
), "#14");
108 Assert
.AreEqual ("ushort", Generate (new CodeTypeReferenceExpression (typeof (ushort)), sw
), "#15");
110 Assert
.AreEqual ("uint", Generate (new CodeTypeReferenceExpression (typeof (uint)), sw
), "#16");
112 Assert
.AreEqual ("ulong", Generate (new CodeTypeReferenceExpression (typeof (ulong)), sw
), "#17");
114 Assert
.AreEqual ("float", Generate (new CodeTypeReferenceExpression (typeof (float)), sw
), "#18");
121 public void PrimitiveExpressionTest ()
123 StringBuilder sb
= new StringBuilder ();
125 using (StringWriter sw
= new StringWriter (sb
)) {
126 Assert
.AreEqual ("null", Generate (new CodePrimitiveExpression (null), sw
), "#1");
128 Assert
.AreEqual ("\"AB\\\"C\"", Generate (new CodePrimitiveExpression ("AB\"C"), sw
), "#2");
130 Assert
.AreEqual ("5", Generate (new CodePrimitiveExpression ((byte) 5), sw
), "#4");
132 Assert
.AreEqual ("20", Generate (new CodePrimitiveExpression ((short) 20), sw
), "#5");
134 Assert
.AreEqual ("243", Generate (new CodePrimitiveExpression (243), sw
), "#6");
136 Assert
.AreEqual ("434343", Generate (new CodePrimitiveExpression ((long) 434343), sw
), "#7");
138 Assert
.AreEqual ("6.445F", Generate (new CodePrimitiveExpression ((float) 6.445), sw
), "#8");
140 Assert
.AreEqual ("5.76D", Generate (new CodePrimitiveExpression ((double) 5.76), sw
), "#9");
142 Assert
.AreEqual ("7.667m", Generate (new CodePrimitiveExpression ((decimal) 7.667), sw
), "#10");
144 Assert
.AreEqual ("true", Generate (new CodePrimitiveExpression (true), sw
), "#11");
146 Assert
.AreEqual ("false", Generate (new CodePrimitiveExpression (false), sw
), "#12");
152 public void PrimitiveExpressionTest_Char ()
154 StringBuilder sb
= new StringBuilder ();
156 using (StringWriter sw
= new StringWriter (sb
)) {
157 Assert
.AreEqual ("'\\0'", Generate (new CodePrimitiveExpression ('\0'), sw
), "#0");
159 Assert
.AreEqual ("'\x01'", Generate (new CodePrimitiveExpression ('\x01'), sw
), "#1");
161 Assert
.AreEqual ("'\x02'", Generate (new CodePrimitiveExpression ('\x02'), sw
), "#2");
163 Assert
.AreEqual ("'\x03'", Generate (new CodePrimitiveExpression ('\x03'), sw
), "#3");
165 Assert
.AreEqual ("'\x04'", Generate (new CodePrimitiveExpression ('\x04'), sw
), "#4");
167 Assert
.AreEqual ("'\x05'", Generate (new CodePrimitiveExpression ('\x05'), sw
), "#5");
169 Assert
.AreEqual ("'\x06'", Generate (new CodePrimitiveExpression ('\x06'), sw
), "#6");
171 Assert
.AreEqual ("'\a'", Generate (new CodePrimitiveExpression ('\a'), sw
), "#7");
173 Assert
.AreEqual ("'\b'", Generate (new CodePrimitiveExpression ('\b'), sw
), "#8");
175 Assert
.AreEqual ("'\\t'", Generate (new CodePrimitiveExpression ('\t'), sw
), "#9");
177 Assert
.AreEqual ("'\\n'", Generate (new CodePrimitiveExpression ('\n'), sw
), "#10");
179 Assert
.AreEqual ("'\v'", Generate (new CodePrimitiveExpression ('\v'), sw
), "#11");
181 Assert
.AreEqual ("'\f'", Generate (new CodePrimitiveExpression ('\f'), sw
), "#12");
183 Assert
.AreEqual ("'\\r'", Generate (new CodePrimitiveExpression ('\r'), sw
), "#13");
185 Assert
.AreEqual ("'\x0E'", Generate (new CodePrimitiveExpression ('\x0E'), sw
), "#14");
187 Assert
.AreEqual ("'\x0F'", Generate (new CodePrimitiveExpression ('\x0F'), sw
), "#15");
189 Assert
.AreEqual ("'\x10'", Generate (new CodePrimitiveExpression ('\x10'), sw
), "#16");
191 Assert
.AreEqual ("'\x11'", Generate (new CodePrimitiveExpression ('\x11'), sw
), "#17");
193 Assert
.AreEqual ("'\x12'", Generate (new CodePrimitiveExpression ('\x12'), sw
), "#18");
195 Assert
.AreEqual ("'\x13'", Generate (new CodePrimitiveExpression ('\x13'), sw
), "#19");
197 Assert
.AreEqual ("'\x14'", Generate (new CodePrimitiveExpression ('\x14'), sw
), "#20");
199 Assert
.AreEqual ("'\x15'", Generate (new CodePrimitiveExpression ('\x15'), sw
), "#21");
201 Assert
.AreEqual ("'\x16'", Generate (new CodePrimitiveExpression ('\x16'), sw
), "#22");
203 Assert
.AreEqual ("'\x17'", Generate (new CodePrimitiveExpression ('\x17'), sw
), "#23");
205 Assert
.AreEqual ("'\x18'", Generate (new CodePrimitiveExpression ('\x18'), sw
), "#24");
207 Assert
.AreEqual ("'\x19'", Generate (new CodePrimitiveExpression ('\x19'), sw
), "#25");
209 Assert
.AreEqual ("'\x1A'", Generate (new CodePrimitiveExpression ('\x1A'), sw
), "#26");
211 Assert
.AreEqual ("'\x1B'", Generate (new CodePrimitiveExpression ('\x1B'), sw
), "#27");
213 Assert
.AreEqual ("'\x1C'", Generate (new CodePrimitiveExpression ('\x1C'), sw
), "#28");
215 Assert
.AreEqual ("'\x1D'", Generate (new CodePrimitiveExpression ('\x1D'), sw
), "#29");
217 Assert
.AreEqual ("'\x1E'", Generate (new CodePrimitiveExpression ('\x1E'), sw
), "#30");
219 Assert
.AreEqual ("'\x1F'", Generate (new CodePrimitiveExpression ('\x1F'), sw
), "#31");
221 Assert
.AreEqual ("'\x20'", Generate (new CodePrimitiveExpression ('\x20'), sw
), "#32");
223 Assert
.AreEqual ("'\x21'", Generate (new CodePrimitiveExpression ('\x21'), sw
), "#33");
225 Assert
.AreEqual ("'\\\"'", Generate (new CodePrimitiveExpression ('"'), sw
), "#34");
227 Assert
.AreEqual ("'\x23'", Generate (new CodePrimitiveExpression ('\x23'), sw
), "#35");
229 Assert
.AreEqual ("'\x24'", Generate (new CodePrimitiveExpression ('\x24'), sw
), "#36");
231 Assert
.AreEqual ("'\x25'", Generate (new CodePrimitiveExpression ('\x25'), sw
), "#37");
233 Assert
.AreEqual ("'\x26'", Generate (new CodePrimitiveExpression ('\x26'), sw
), "#38");
235 Assert
.AreEqual ("'\\''", Generate (new CodePrimitiveExpression ('\''), sw
), "#39");
237 Assert
.AreEqual ("'\\u2028'", Generate (new CodePrimitiveExpression ('\u2028'), sw
), "#40");
239 Assert
.AreEqual ("'\\u2029'", Generate (new CodePrimitiveExpression ('\u2029'), sw
), "#41");
241 Assert
.AreEqual ("'\u2030'", Generate (new CodePrimitiveExpression ('\u2030'), sw
), "#42");
247 public void PrimitiveExpressionTest_SByte ()
249 StringBuilder sb
= new StringBuilder ();
251 using (StringWriter sw
= new StringWriter (sb
)) {
252 Assert
.AreEqual ("5", Generate (new CodePrimitiveExpression ((sbyte) 5), sw
));
258 public void PrimitiveExpressionTest_UInt16 ()
260 StringBuilder sb
= new StringBuilder ();
262 using (StringWriter sw
= new StringWriter (sb
)) {
263 Assert
.AreEqual ("5", Generate (new CodePrimitiveExpression ((ushort) 5), sw
));
269 public void PrimitiveExpressionTest_UInt32 ()
271 StringBuilder sb
= new StringBuilder ();
273 using (StringWriter sw
= new StringWriter (sb
)) {
274 Assert
.AreEqual ("5u", Generate (new CodePrimitiveExpression ((uint) 5), sw
));
280 public void PrimitiveExpressionTest_UInt64 ()
282 StringBuilder sb
= new StringBuilder ();
284 using (StringWriter sw
= new StringWriter (sb
)) {
285 Assert
.AreEqual ("5ul", Generate (new CodePrimitiveExpression ((ulong) 5), sw
));
291 public void ParameterDeclarationExpressionTest ()
293 CodeParameterDeclarationExpression cpde
= null;
295 StringBuilder sb
= new StringBuilder ();
297 using (StringWriter sw
= new StringWriter (sb
)) {
298 cpde
= new CodeParameterDeclarationExpression ();
299 Assert
.AreEqual ("void ", Generate (cpde
, sw
), "#1");
302 cpde
= new CodeParameterDeclarationExpression ((string) null,
304 Assert
.AreEqual ("void ", Generate (cpde
, sw
), "#2");
307 cpde
= new CodeParameterDeclarationExpression ("A", (string) null);
308 Assert
.AreEqual ("A ", Generate (cpde
, sw
), "#4");
311 cpde
= new CodeParameterDeclarationExpression ((string) null, "B");
312 Assert
.AreEqual ("void B", Generate (cpde
, sw
), "#4");
315 cpde
= new CodeParameterDeclarationExpression ("A", "B");
316 Assert
.AreEqual ("A B", Generate (cpde
, sw
), "#5");
319 cpde
.Direction
= FieldDirection
.Out
;
320 Assert
.AreEqual ("out A B", Generate (cpde
, sw
), "#6");
323 cpde
.Direction
= FieldDirection
.Ref
;
324 Assert
.AreEqual ("ref A B", Generate (cpde
, sw
), "#7");
330 public void ArrayCreateExpressionTest ()
334 sb
= new StringBuilder ();
335 using (StringWriter sw
= new StringWriter (sb
)) {
337 string.Format (CultureInfo
.InvariantCulture
,
338 "new int[] {{{0} 5}}",
339 Environment
.NewLine
),
340 Generate (new CodeArrayCreateExpression (
342 new CodeExpression
[] {
343 new CodePrimitiveExpression (5)
348 sb
= new StringBuilder ();
349 using (StringWriter sw
= new StringWriter (sb
)) {
350 Assert
.AreEqual ("new int[5]",
351 Generate (new CodeArrayCreateExpression (
353 new CodePrimitiveExpression (5))
357 sb
= new StringBuilder ();
358 using (StringWriter sw
= new StringWriter (sb
)) {
360 string.Format (CultureInfo
.InvariantCulture
,
361 "new string[] {{{0}" +
365 Environment
.NewLine
),
366 Generate (new CodeArrayCreateExpression (
368 new CodeExpression
[] {
369 new CodePrimitiveExpression ("a"),
370 new CodePrimitiveExpression ("b"),
371 new CodePrimitiveExpression ("c"),
379 public void EscapedIdentifierTest ()
384 sb
= new StringBuilder ();
385 using (StringWriter sw
= new StringWriter (sb
)) {
386 code
= Generate (new CodeVariableReferenceExpression ("using"), sw
);
387 Assert
.AreEqual ("@using", code
, "#1");
391 sb
= new StringBuilder ();
392 using (StringWriter sw
= new StringWriter (sb
)) {
393 code
= Generate (new CodeTypeReferenceExpression ("using"), sw
);
394 Assert
.AreEqual ("@using", code
, "#2");
398 sb
= new StringBuilder ();
399 using (StringWriter sw
= new StringWriter (sb
)) {
400 code
= Generate (new CodePropertyReferenceExpression (null, "using"), sw
);
401 Assert
.AreEqual ("@using", code
, "#3");
405 sb
= new StringBuilder ();
406 using (StringWriter sw
= new StringWriter (sb
)) {
407 code
= Generate (new CodeMethodReferenceExpression (null, "using"), sw
);
408 Assert
.AreEqual ("@using", code
, "#4");
412 sb
= new StringBuilder ();
413 using (StringWriter sw
= new StringWriter (sb
)) {
414 code
= Generate (new CodeFieldReferenceExpression (null, "using"), sw
);
415 Assert
.AreEqual ("@using", code
, "#5");
419 sb
= new StringBuilder ();
420 using (StringWriter sw
= new StringWriter (sb
)) {
421 code
= Generate (new CodeEventReferenceExpression (null, "using"), sw
);
422 Assert
.AreEqual ("@using", code
, "#6");
428 public void EventReferenceTest ()
433 sb
= new StringBuilder ();
434 using (StringWriter sw
= new StringWriter (sb
)) {
435 code
= Generate (new CodeEventReferenceExpression (null, null), sw
);
436 Assert
.AreEqual (string.Empty
, code
, "#1");
439 sb
= new StringBuilder ();
440 using (StringWriter sw
= new StringWriter (sb
)) {
441 code
= Generate (new CodeEventReferenceExpression (null, "abc"), sw
);
442 Assert
.AreEqual ("abc", code
, "#2");
445 sb
= new StringBuilder ();
446 using (StringWriter sw
= new StringWriter (sb
)) {
447 code
= Generate (new CodeEventReferenceExpression (new CodeThisReferenceExpression (), null), sw
);
448 Assert
.AreEqual ("this.", code
, "#3");
451 sb
= new StringBuilder ();
452 using (StringWriter sw
= new StringWriter (sb
)) {
453 code
= Generate (new CodeEventReferenceExpression (new CodeThisReferenceExpression (), "abc"), sw
);
454 Assert
.AreEqual ("this.abc", code
, "#4");
457 sb
= new StringBuilder ();
458 using (StringWriter sw
= new StringWriter (sb
)) {
459 code
= Generate (new CodeEventReferenceExpression (new CodePrimitiveExpression ("primitive"), null), sw
);
460 Assert
.AreEqual ("\"primitive\".", code
, "#5");
463 sb
= new StringBuilder ();
464 using (StringWriter sw
= new StringWriter (sb
)) {
465 code
= Generate (new CodeEventReferenceExpression (new CodePrimitiveExpression ("primitive"), "abc"), sw
);
466 Assert
.AreEqual ("\"primitive\".abc", code
, "#6");
471 public void DefaultValueExpressionTest ()
473 StringBuilder sb
= new StringBuilder ();
475 using (StringWriter sw
= new StringWriter (sb
)) {
476 Assert
.AreEqual ("default(string)", Generate (new CodeDefaultValueExpression (new CodeTypeReference (typeof(string))), sw
), "#0");
483 public void DelegateInvokeTest ()
488 sb
= new StringBuilder ();
489 using (StringWriter sw
= new StringWriter (sb
)) {
490 code
= Generate (new CodeDelegateInvokeExpression (null, new CodePrimitiveExpression ("abc")), sw
);
491 Assert
.AreEqual ("(\"abc\")", code
, "#1");
494 sb
= new StringBuilder ();
495 using (StringWriter sw
= new StringWriter (sb
)) {
496 code
= Generate (new CodeDelegateInvokeExpression (new CodeThisReferenceExpression (), new CodePrimitiveExpression ("abc")), sw
);
497 Assert
.AreEqual ("this(\"abc\")", code
, "#2");
500 sb
= new StringBuilder ();
501 using (StringWriter sw
= new StringWriter (sb
)) {
502 code
= Generate (new CodeDelegateInvokeExpression (new CodePrimitiveExpression ("primitive"), new CodePrimitiveExpression ("abc")), sw
);
503 Assert
.AreEqual ("\"primitive\"(\"abc\")", code
, "#3");
506 sb
= new StringBuilder ();
507 using (StringWriter sw
= new StringWriter (sb
)) {
508 code
= Generate (new CodeDelegateInvokeExpression (new CodeEventReferenceExpression (new CodeThisReferenceExpression (), "Click"), new CodePrimitiveExpression ("abc")), sw
);
509 Assert
.AreEqual ("this.Click(\"abc\")", code
, "#4");
512 sb
= new StringBuilder ();
513 using (StringWriter sw
= new StringWriter (sb
)) {
514 code
= Generate (new CodeDelegateInvokeExpression (new CodeEventReferenceExpression (new CodeThisReferenceExpression (), null), new CodePrimitiveExpression ("abc")), sw
);
515 Assert
.AreEqual ("this.(\"abc\")", code
, "#5");
518 sb
= new StringBuilder ();
519 using (StringWriter sw
= new StringWriter (sb
)) {
520 code
= Generate (new CodeDelegateInvokeExpression (new CodeEventReferenceExpression (new CodePrimitiveExpression ("primitive"), "Click"), new CodePrimitiveExpression ("abc")), sw
);
521 Assert
.AreEqual ("\"primitive\".Click(\"abc\")", code
, "#6");
524 sb
= new StringBuilder ();
525 using (StringWriter sw
= new StringWriter (sb
)) {
526 code
= Generate (new CodeDelegateInvokeExpression (new CodeEventReferenceExpression (new CodePrimitiveExpression ("primitive"), null), new CodePrimitiveExpression ("abc")), sw
);
527 Assert
.AreEqual ("\"primitive\".(\"abc\")", code
, "#7");
530 sb
= new StringBuilder ();
531 using (StringWriter sw
= new StringWriter (sb
)) {
532 code
= Generate (new CodeDelegateInvokeExpression (), sw
);
533 Assert
.AreEqual ("()", code
, "#8");
537 private string Generate (CodeExpression expression
, StringWriter sw
)
539 generator
.GenerateCodeFromExpression (expression
, sw
, options
);
540 return sw
.ToString ();