[LoongArch64] Part-5:add loongarch support in some files for LoongArch64. (#21769)
[mono-project.git] / mcs / class / System / Test / Microsoft.CSharp / CodeGeneratorFromExpressionTest.cs
blobfde53c5199d68ec10d1235f9aa6a5f4fe64474bc
1 //
2 // Microsoft.CSharp.* Test Cases
3 //
4 // Authors:
5 // Erik LeBel (eriklebel@yahoo.ca)
6 //
7 // (c) 2003 Erik LeBel
8 //
9 using System;
10 using System.CodeDom;
11 using System.CodeDom.Compiler;
12 using System.Globalization;
13 using System.IO;
14 using System.Text;
16 using Microsoft.CSharp;
18 using NUnit.Framework;
20 namespace MonoTests.Microsoft.CSharp
22 /// <summary>
23 /// Test ICodeGenerator's GenerateCodeFromExpression, along with a
24 /// minimal set CodeDom components.
25 /// </summary>
26 [TestFixture]
27 public class CodeGeneratorFromExpressionTest
29 private CSharpCodeProvider provider;
30 private ICodeGenerator generator;
31 private CodeGeneratorOptions options;
33 [SetUp]
34 public void SetUp ()
36 provider = new CSharpCodeProvider ();
37 generator = provider.CreateGenerator ();
38 options = new CodeGeneratorOptions ();
41 [Test]
42 public void DefaultExpressionTest ()
44 using (StringWriter sw = new StringWriter ()) {
45 try {
46 Generate (new CodeExpression (), sw);
47 Assert.Fail ("#1");
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");
58 [Test]
59 public void NullExpressionTest ()
61 using (StringWriter sw = new StringWriter ()) {
62 try {
63 Generate (null, sw);
64 Assert.Fail ("#1");
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");
74 [Test]
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");
81 sb.Length = 0;
82 Assert.AreEqual ("char", Generate (new CodeTypeReferenceExpression (typeof (char)), sw), "#2");
83 sb.Length = 0;
84 Assert.AreEqual (typeof(DateTime).FullName, Generate (new CodeTypeReferenceExpression (typeof (DateTime)), sw), "#3");
85 sb.Length = 0;
86 Assert.AreEqual ("short", Generate (new CodeTypeReferenceExpression (typeof (short)), sw), "#4");
87 sb.Length = 0;
88 Assert.AreEqual ("int", Generate (new CodeTypeReferenceExpression (typeof (int)), sw), "#5");
89 sb.Length = 0;
90 Assert.AreEqual ("long", Generate (new CodeTypeReferenceExpression (typeof (long)), sw), "#6");
91 sb.Length = 0;
92 Assert.AreEqual ("object", Generate (new CodeTypeReferenceExpression (typeof (object)), sw), "#7");
93 sb.Length = 0;
94 Assert.AreEqual ("void", Generate (new CodeTypeReferenceExpression (typeof (void)), sw), "#8");
95 sb.Length = 0;
96 Assert.AreEqual ("void", Generate (new CodeTypeReferenceExpression ((string) null), sw), "#9");
97 sb.Length = 0;
98 Assert.AreEqual ("void", Generate (new CodeTypeReferenceExpression (""), sw), "#10");
99 sb.Length = 0;
100 Assert.AreEqual ("byte", Generate (new CodeTypeReferenceExpression (typeof (byte)), sw), "#11");
101 sb.Length = 0;
102 Assert.AreEqual ("decimal", Generate (new CodeTypeReferenceExpression (typeof (decimal)), sw), "#12");
103 sb.Length = 0;
104 Assert.AreEqual ("double", Generate (new CodeTypeReferenceExpression (typeof (double)), sw), "#13");
105 sb.Length = 0;
106 Assert.AreEqual ("sbyte", Generate (new CodeTypeReferenceExpression (typeof (sbyte)), sw), "#14");
107 sb.Length = 0;
108 Assert.AreEqual ("ushort", Generate (new CodeTypeReferenceExpression (typeof (ushort)), sw), "#15");
109 sb.Length = 0;
110 Assert.AreEqual ("uint", Generate (new CodeTypeReferenceExpression (typeof (uint)), sw), "#16");
111 sb.Length = 0;
112 Assert.AreEqual ("ulong", Generate (new CodeTypeReferenceExpression (typeof (ulong)), sw), "#17");
113 sb.Length = 0;
114 Assert.AreEqual ("float", Generate (new CodeTypeReferenceExpression (typeof (float)), sw), "#18");
115 sb.Length = 0;
116 sw.Close ();
120 [Test]
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");
127 sb.Length = 0;
128 Assert.AreEqual ("\"AB\\\"C\"", Generate (new CodePrimitiveExpression ("AB\"C"), sw), "#2");
129 sb.Length = 0;
130 Assert.AreEqual ("5", Generate (new CodePrimitiveExpression ((byte) 5), sw), "#4");
131 sb.Length = 0;
132 Assert.AreEqual ("20", Generate (new CodePrimitiveExpression ((short) 20), sw), "#5");
133 sb.Length = 0;
134 Assert.AreEqual ("243", Generate (new CodePrimitiveExpression (243), sw), "#6");
135 sb.Length = 0;
136 Assert.AreEqual ("434343", Generate (new CodePrimitiveExpression ((long) 434343), sw), "#7");
137 sb.Length = 0;
138 Assert.AreEqual ("6.445F", Generate (new CodePrimitiveExpression ((float) 6.445), sw), "#8");
139 sb.Length = 0;
140 Assert.AreEqual ("5.76D", Generate (new CodePrimitiveExpression ((double) 5.76), sw), "#9");
141 sb.Length = 0;
142 Assert.AreEqual ("7.667m", Generate (new CodePrimitiveExpression ((decimal) 7.667), sw), "#10");
143 sb.Length = 0;
144 Assert.AreEqual ("true", Generate (new CodePrimitiveExpression (true), sw), "#11");
145 sb.Length = 0;
146 Assert.AreEqual ("false", Generate (new CodePrimitiveExpression (false), sw), "#12");
147 sw.Close ();
151 [Test]
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");
158 sb.Length = 0;
159 Assert.AreEqual ("'\x01'", Generate (new CodePrimitiveExpression ('\x01'), sw), "#1");
160 sb.Length = 0;
161 Assert.AreEqual ("'\x02'", Generate (new CodePrimitiveExpression ('\x02'), sw), "#2");
162 sb.Length = 0;
163 Assert.AreEqual ("'\x03'", Generate (new CodePrimitiveExpression ('\x03'), sw), "#3");
164 sb.Length = 0;
165 Assert.AreEqual ("'\x04'", Generate (new CodePrimitiveExpression ('\x04'), sw), "#4");
166 sb.Length = 0;
167 Assert.AreEqual ("'\x05'", Generate (new CodePrimitiveExpression ('\x05'), sw), "#5");
168 sb.Length = 0;
169 Assert.AreEqual ("'\x06'", Generate (new CodePrimitiveExpression ('\x06'), sw), "#6");
170 sb.Length = 0;
171 Assert.AreEqual ("'\a'", Generate (new CodePrimitiveExpression ('\a'), sw), "#7");
172 sb.Length = 0;
173 Assert.AreEqual ("'\b'", Generate (new CodePrimitiveExpression ('\b'), sw), "#8");
174 sb.Length = 0;
175 Assert.AreEqual ("'\\t'", Generate (new CodePrimitiveExpression ('\t'), sw), "#9");
176 sb.Length = 0;
177 Assert.AreEqual ("'\\n'", Generate (new CodePrimitiveExpression ('\n'), sw), "#10");
178 sb.Length = 0;
179 Assert.AreEqual ("'\v'", Generate (new CodePrimitiveExpression ('\v'), sw), "#11");
180 sb.Length = 0;
181 Assert.AreEqual ("'\f'", Generate (new CodePrimitiveExpression ('\f'), sw), "#12");
182 sb.Length = 0;
183 Assert.AreEqual ("'\\r'", Generate (new CodePrimitiveExpression ('\r'), sw), "#13");
184 sb.Length = 0;
185 Assert.AreEqual ("'\x0E'", Generate (new CodePrimitiveExpression ('\x0E'), sw), "#14");
186 sb.Length = 0;
187 Assert.AreEqual ("'\x0F'", Generate (new CodePrimitiveExpression ('\x0F'), sw), "#15");
188 sb.Length = 0;
189 Assert.AreEqual ("'\x10'", Generate (new CodePrimitiveExpression ('\x10'), sw), "#16");
190 sb.Length = 0;
191 Assert.AreEqual ("'\x11'", Generate (new CodePrimitiveExpression ('\x11'), sw), "#17");
192 sb.Length = 0;
193 Assert.AreEqual ("'\x12'", Generate (new CodePrimitiveExpression ('\x12'), sw), "#18");
194 sb.Length = 0;
195 Assert.AreEqual ("'\x13'", Generate (new CodePrimitiveExpression ('\x13'), sw), "#19");
196 sb.Length = 0;
197 Assert.AreEqual ("'\x14'", Generate (new CodePrimitiveExpression ('\x14'), sw), "#20");
198 sb.Length = 0;
199 Assert.AreEqual ("'\x15'", Generate (new CodePrimitiveExpression ('\x15'), sw), "#21");
200 sb.Length = 0;
201 Assert.AreEqual ("'\x16'", Generate (new CodePrimitiveExpression ('\x16'), sw), "#22");
202 sb.Length = 0;
203 Assert.AreEqual ("'\x17'", Generate (new CodePrimitiveExpression ('\x17'), sw), "#23");
204 sb.Length = 0;
205 Assert.AreEqual ("'\x18'", Generate (new CodePrimitiveExpression ('\x18'), sw), "#24");
206 sb.Length = 0;
207 Assert.AreEqual ("'\x19'", Generate (new CodePrimitiveExpression ('\x19'), sw), "#25");
208 sb.Length = 0;
209 Assert.AreEqual ("'\x1A'", Generate (new CodePrimitiveExpression ('\x1A'), sw), "#26");
210 sb.Length = 0;
211 Assert.AreEqual ("'\x1B'", Generate (new CodePrimitiveExpression ('\x1B'), sw), "#27");
212 sb.Length = 0;
213 Assert.AreEqual ("'\x1C'", Generate (new CodePrimitiveExpression ('\x1C'), sw), "#28");
214 sb.Length = 0;
215 Assert.AreEqual ("'\x1D'", Generate (new CodePrimitiveExpression ('\x1D'), sw), "#29");
216 sb.Length = 0;
217 Assert.AreEqual ("'\x1E'", Generate (new CodePrimitiveExpression ('\x1E'), sw), "#30");
218 sb.Length = 0;
219 Assert.AreEqual ("'\x1F'", Generate (new CodePrimitiveExpression ('\x1F'), sw), "#31");
220 sb.Length = 0;
221 Assert.AreEqual ("'\x20'", Generate (new CodePrimitiveExpression ('\x20'), sw), "#32");
222 sb.Length = 0;
223 Assert.AreEqual ("'\x21'", Generate (new CodePrimitiveExpression ('\x21'), sw), "#33");
224 sb.Length = 0;
225 Assert.AreEqual ("'\\\"'", Generate (new CodePrimitiveExpression ('"'), sw), "#34");
226 sb.Length = 0;
227 Assert.AreEqual ("'\x23'", Generate (new CodePrimitiveExpression ('\x23'), sw), "#35");
228 sb.Length = 0;
229 Assert.AreEqual ("'\x24'", Generate (new CodePrimitiveExpression ('\x24'), sw), "#36");
230 sb.Length = 0;
231 Assert.AreEqual ("'\x25'", Generate (new CodePrimitiveExpression ('\x25'), sw), "#37");
232 sb.Length = 0;
233 Assert.AreEqual ("'\x26'", Generate (new CodePrimitiveExpression ('\x26'), sw), "#38");
234 sb.Length = 0;
235 Assert.AreEqual ("'\\''", Generate (new CodePrimitiveExpression ('\''), sw), "#39");
236 sb.Length = 0;
237 Assert.AreEqual ("'\\u2028'", Generate (new CodePrimitiveExpression ('\u2028'), sw), "#40");
238 sb.Length = 0;
239 Assert.AreEqual ("'\\u2029'", Generate (new CodePrimitiveExpression ('\u2029'), sw), "#41");
240 sb.Length = 0;
241 Assert.AreEqual ("'\u2030'", Generate (new CodePrimitiveExpression ('\u2030'), sw), "#42");
242 sw.Close ();
246 [Test]
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));
253 sw.Close ();
257 [Test]
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));
264 sw.Close ();
268 [Test]
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));
275 sw.Close ();
279 [Test]
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));
286 sw.Close ();
290 [Test]
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");
300 sb.Length = 0;
302 cpde = new CodeParameterDeclarationExpression ((string) null,
303 (string) null);
304 Assert.AreEqual ("void ", Generate (cpde, sw), "#2");
305 sb.Length = 0;
307 cpde = new CodeParameterDeclarationExpression ("A", (string) null);
308 Assert.AreEqual ("A ", Generate (cpde, sw), "#4");
309 sb.Length = 0;
311 cpde = new CodeParameterDeclarationExpression ((string) null, "B");
312 Assert.AreEqual ("void B", Generate (cpde, sw), "#4");
313 sb.Length = 0;
315 cpde = new CodeParameterDeclarationExpression ("A", "B");
316 Assert.AreEqual ("A B", Generate (cpde, sw), "#5");
317 sb.Length = 0;
319 cpde.Direction = FieldDirection.Out;
320 Assert.AreEqual ("out A B", Generate (cpde, sw), "#6");
321 sb.Length = 0;
323 cpde.Direction = FieldDirection.Ref;
324 Assert.AreEqual ("ref A B", Generate (cpde, sw), "#7");
325 sb.Length = 0;
329 [Test]
330 public void ArrayCreateExpressionTest ()
332 StringBuilder sb;
334 sb = new StringBuilder ();
335 using (StringWriter sw = new StringWriter (sb)) {
336 Assert.AreEqual (
337 string.Format (CultureInfo.InvariantCulture,
338 "new int[] {{{0} 5}}",
339 Environment.NewLine),
340 Generate (new CodeArrayCreateExpression (
341 typeof (int),
342 new CodeExpression [] {
343 new CodePrimitiveExpression (5)
345 , sw), "#1");
348 sb = new StringBuilder ();
349 using (StringWriter sw = new StringWriter (sb)) {
350 Assert.AreEqual ("new int[5]",
351 Generate (new CodeArrayCreateExpression (
352 typeof (int),
353 new CodePrimitiveExpression (5))
354 , sw), "#2");
357 sb = new StringBuilder ();
358 using (StringWriter sw = new StringWriter (sb)) {
359 Assert.AreEqual (
360 string.Format (CultureInfo.InvariantCulture,
361 "new string[] {{{0}" +
362 " \"a\",{0}" +
363 " \"b\",{0}" +
364 " \"c\"}}",
365 Environment.NewLine),
366 Generate (new CodeArrayCreateExpression (
367 typeof (string),
368 new CodeExpression [] {
369 new CodePrimitiveExpression ("a"),
370 new CodePrimitiveExpression ("b"),
371 new CodePrimitiveExpression ("c"),
373 , sw));
374 sw.Close ();
378 [Test]
379 public void EscapedIdentifierTest ()
381 StringBuilder sb;
382 string code;
384 sb = new StringBuilder ();
385 using (StringWriter sw = new StringWriter (sb)) {
386 code = Generate (new CodeVariableReferenceExpression ("using"), sw);
387 Assert.AreEqual ("@using", code, "#1");
388 sw.Close ();
391 sb = new StringBuilder ();
392 using (StringWriter sw = new StringWriter (sb)) {
393 code = Generate (new CodeTypeReferenceExpression ("using"), sw);
394 Assert.AreEqual ("@using", code, "#2");
395 sw.Close ();
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");
402 sw.Close ();
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");
409 sw.Close ();
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");
416 sw.Close ();
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");
423 sw.Close ();
427 [Test]
428 public void EventReferenceTest ()
430 StringBuilder sb;
431 string code;
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");
470 [Test]
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");
477 sb.Length = 0;
478 sw.Close ();
482 [Test]
483 public void DelegateInvokeTest ()
485 StringBuilder sb;
486 string code;
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 ();