2 // Microsoft.CSharp.* Test Cases
5 // Erik LeBel (eriklebel@yahoo.ca)
11 using System.CodeDom.Compiler;
12 using System.Globalization;
16 using NUnit.Framework;
18 namespace MonoTests.Microsoft.CSharp
21 /// Test ICodeGenerator's GenerateCodeFromStatement, along with a
22 /// minimal set CodeDom components.
25 public class CodeGeneratorFromStatementTest: CodeGeneratorTestBase
27 private CodeStatement statement = null;
33 statement = new CodeStatement ();
36 protected override string Generate (CodeGeneratorOptions options)
38 StringWriter writer = new StringWriter ();
39 writer.NewLine = NewLine;
41 generator.GenerateCodeFromStatement (statement, writer, options);
43 return writer.ToString ();
47 [ExpectedException (typeof (ArgumentException))]
48 public void DefaultStatementTest ()
54 [ExpectedException (typeof (NullReferenceException))]
55 public void NullStatementTest ()
62 public void CodeAssignStatementTest ()
64 CodeSnippetExpression cse1 = new CodeSnippetExpression("A");
65 CodeSnippetExpression cse2 = new CodeSnippetExpression("B");
67 CodeAssignStatement assignStatement = new CodeAssignStatement (cse1, cse2);
68 statement = assignStatement;
70 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
71 "A = B;{0}", NewLine), Generate (), "#1");
73 assignStatement.Left = null;
77 } catch (ArgumentNullException) {
80 assignStatement.Left = cse1;
83 assignStatement.Right = null;
87 } catch (ArgumentNullException) {
90 assignStatement.Right = cse2;
95 public void CodeAttachEventStatementTest ()
97 CodeEventReferenceExpression cere = new CodeEventReferenceExpression (
98 new CodeSnippetExpression ("A"), "class");
99 CodeSnippetExpression handler = new CodeSnippetExpression ("EventHandler");
101 CodeAttachEventStatement attachEventStatement = new CodeAttachEventStatement ();
102 statement = attachEventStatement;
107 } catch (ArgumentNullException) {
110 attachEventStatement.Event = cere;
114 } catch (ArgumentNullException) {
117 attachEventStatement.Event = null;
118 attachEventStatement.Listener = handler;
119 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
120 " += EventHandler;{0}", NewLine), Generate (), "#3");
122 attachEventStatement.Event = cere;
123 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
124 "A.@class += EventHandler;{0}", NewLine), Generate (), "#4");
126 attachEventStatement.Event = new CodeEventReferenceExpression (
127 new CodeSnippetExpression ((string) null), "");
128 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
129 ". += EventHandler;{0}", NewLine), Generate (), "#5");
131 attachEventStatement.Listener = new CodeSnippetExpression ("");
132 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
133 ". += ;{0}", NewLine), Generate (), "#6");
137 public void CodeCommentStatementTest ()
139 CodeCommentStatement commentStatement = new CodeCommentStatement ();
140 CodeComment comment = new CodeComment ();
141 commentStatement.Comment = comment;
142 statement = commentStatement;
144 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
145 "// \n", NewLine), Generate (), "#1");
147 comment.Text = "a\nb";
148 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
149 "// a\n//b\n", NewLine), Generate (), "#2");
151 comment.Text = "a\r\nb";
152 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
153 "// a\r\n//b{0}", NewLine), Generate (), "#3");
155 comment.Text = "a\rb";
156 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
157 "// a\r//b{0}", NewLine), Generate (), "#4");
161 public void CodeConditionStatementTest ()
163 CodeStatement[] trueStatements = new CodeStatement[] {
164 new CodeExpressionStatement (new CodeSnippetExpression ("DoA()")),
165 new CodeExpressionStatement (new CodeSnippetExpression (";")),
166 new CodeExpressionStatement (new CodeSnippetExpression ("DoB()")),
167 new CodeExpressionStatement (new CodeSnippetExpression ("")),
168 new CodeSnippetStatement ("A"),
169 new CodeExpressionStatement (new CodeSnippetExpression ("DoC()")) };
171 CodeStatement[] falseStatements = new CodeStatement[] {
172 new CodeExpressionStatement (new CodeSnippetExpression ("DoD()")),
173 new CodeSnippetStatement ("B"),
174 new CodeExpressionStatement (new CodeSnippetExpression (";")),
175 new CodeExpressionStatement (new CodeSnippetExpression ("DoE()")),
176 new CodeExpressionStatement (new CodeSnippetExpression ("")),
177 new CodeExpressionStatement (new CodeSnippetExpression ("DoF()")) };
179 CodeConditionStatement conditionStatement = new CodeConditionStatement ();
180 statement = conditionStatement;
185 } catch (ArgumentNullException) {
188 conditionStatement.Condition = new CodeSnippetExpression ("");
189 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
191 "}}{0}", NewLine), Generate (), "#2");
193 conditionStatement.Condition = new CodeSnippetExpression ("true == false");
194 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
195 "if (true == false) {{{0}" +
196 "}}{0}", NewLine), Generate (), "#3");
198 conditionStatement.TrueStatements.AddRange (trueStatements);
199 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
200 "if (true == false) {{{0}" +
211 "}}{0}", NewLine), Generate (), "#3");
213 conditionStatement.FalseStatements.AddRange (falseStatements);
214 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
215 "if (true == false) {{{0}" +
238 "}}{0}", NewLine), Generate (), "#4");
240 options.ElseOnClosing = true;
242 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
243 "if (true == false) {{{0}" +
265 "}}{0}", NewLine), Generate (), "#5");
267 options.ElseOnClosing = false;
269 conditionStatement.TrueStatements.Clear ();
271 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
272 "if (true == false) {{{0}" +
285 "}}{0}", NewLine), Generate (), "#6");
287 conditionStatement.TrueStatements.AddRange (trueStatements);
288 conditionStatement.FalseStatements.Clear ();
289 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
290 "if (true == false) {{{0}" +
301 "}}{0}", NewLine), Generate (), "#7");
305 public void CodeExpressionStatementTest ()
307 CodeExpressionStatement ces = new CodeExpressionStatement ();
313 } catch (ArgumentNullException) {
316 ces.Expression = new CodeSnippetExpression ("something");
317 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
318 "something;{0}", NewLine), Generate (), "#2");
322 public void CodeGotoStatementTest ()
324 statement = new CodeGotoStatement ("something");
325 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
326 "goto something;{0}", NewLine), Generate ());
330 public void CodeIterationStatementTest ()
332 CodeIterationStatement cis = new CodeIterationStatement ();
337 Assert.Fail ("#1: null InitStatement should cause NRE");
338 } catch (NullReferenceException) {
341 cis.InitStatement = new CodeVariableDeclarationStatement (typeof(int),
342 "testInt", new CodePrimitiveExpression(1));
345 Assert.Fail ("#2: null TestExpression should cause ArgumentNullException");
346 } catch (ArgumentNullException) {
349 cis.TestExpression = new CodeBinaryOperatorExpression (
350 new CodeVariableReferenceExpression ("testInt"),
351 CodeBinaryOperatorType.LessThan,
352 new CodePrimitiveExpression (10));
355 Assert.Fail ("#3: null IncrementStatement should cause NRE");
356 } catch (NullReferenceException) {
359 cis.IncrementStatement = new CodeAssignStatement (
360 new CodeVariableReferenceExpression ("testInt"),
361 new CodeBinaryOperatorExpression (
362 new CodeVariableReferenceExpression ("testInt"),
363 CodeBinaryOperatorType.Add,
364 new CodePrimitiveExpression (1)));
365 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
366 "for (int testInt = 1; (testInt < 10); testInt = (testInt + 1)) {{{0}" +
367 "}}{0}", NewLine), Generate (), "#4");
369 cis.Statements.AddRange (new CodeStatement[] {
370 new CodeExpressionStatement (new CodeSnippetExpression ("DoA()")),
371 new CodeExpressionStatement (new CodeSnippetExpression (";")),
372 new CodeExpressionStatement (new CodeSnippetExpression ("DoB()")),
373 new CodeLabeledStatement ("test", new CodeSnippetStatement ("C")),
374 new CodeExpressionStatement (new CodeSnippetExpression ("")),
375 new CodeSnippetStatement ("A"),
376 new CodeExpressionStatement (new CodeSnippetExpression ("DoC()")) });
377 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
378 "for (int testInt = 1; (testInt < 10); testInt = (testInt + 1)) {{{0}" +
395 "}}{0}", NewLine), Generate (), "#5");
399 public void CodeLabeledStatementTest ()
401 CodeLabeledStatement cls = new CodeLabeledStatement ();
404 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
405 ":{0}", NewLine), Generate (), "#1");
408 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
409 "class:{0}", NewLine), Generate (), "#2");
411 cls.Statement = new CodeSnippetStatement ("A");
412 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
419 NewLine), Generate (), "#3");
423 public void CodeMethodReturnStatementTest ()
425 CodeMethodReturnStatement cmrs = new CodeMethodReturnStatement ();
428 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
429 "return;{0}", NewLine), Generate (), "#1");
431 cmrs.Expression = new CodePrimitiveExpression (1);
432 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
433 "return 1;{0}", NewLine), Generate (), "#2");
437 public void CodeRemoveEventStatementTest ()
439 CodeEventReferenceExpression cere = new CodeEventReferenceExpression (
440 new CodeSnippetExpression ("A"), "class");
441 CodeSnippetExpression handler = new CodeSnippetExpression ("EventHandler");
443 CodeRemoveEventStatement cres = new CodeRemoveEventStatement ();
449 } catch (ArgumentNullException) {
456 } catch (ArgumentNullException) {
460 cres.Listener = handler;
461 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
462 " -= EventHandler;{0}", NewLine), Generate (), "#3");
465 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
466 "A.@class -= EventHandler;{0}", NewLine), Generate (), "#4");
468 cres.Event = new CodeEventReferenceExpression (
469 new CodeSnippetExpression ((string) null), "");
470 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
471 ". -= EventHandler;{0}", NewLine), Generate (), "#5");
473 cres.Listener = new CodeSnippetExpression ("");
474 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
475 ". -= ;{0}", NewLine), Generate (), "#6");
479 public void CodeSnippetStatementTest ()
481 CodeSnippetStatement css = new CodeSnippetStatement ();
484 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
485 "{0}", NewLine), Generate (), "#1");
488 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
489 "class{0}", NewLine), Generate (), "#2");
492 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
493 "{0}", NewLine), Generate (), "#3");
497 [ExpectedException (typeof (ArgumentException))]
498 public void CodeStatement ()
500 CodeStatement cs = new CodeStatement ();
507 public void CodeThrowExceptionStatementTest ()
509 CodeThrowExceptionStatement ctes = new CodeThrowExceptionStatement ();
512 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
513 "throw;{0}", NewLine), Generate (), "#1");
515 ctes.ToThrow = new CodeSnippetExpression ("whatever");
516 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
517 "throw whatever;{0}", NewLine), Generate (), "#2");
521 public void CodeTryCatchFinallyStatementTest ()
523 CodeStatement cs = new CodeGotoStatement ("exit");
524 CodeCatchClause ccc1 = new CodeCatchClause ("ex1", new CodeTypeReference ("System.ArgumentException"));
525 CodeCatchClause ccc2 = new CodeCatchClause (null, new CodeTypeReference ("System.ApplicationException"));
526 CodeSnippetStatement fin1 = new CodeSnippetStatement ("A");
527 CodeSnippetStatement fin2 = new CodeSnippetStatement ("B");
529 statement = new CodeTryCatchFinallyStatement (new CodeStatement[] { cs },
530 new CodeCatchClause[] { ccc1, ccc2 }, new CodeStatement[] { fin1, fin2 });
532 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
536 "catch (System.ArgumentException ex1) {{{0}" +
538 "catch (System.ApplicationException ) {{{0}" +
548 "}}{0}", NewLine), Generate (), "#1");
550 options.ElseOnClosing = true;
552 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
555 "}} catch (System.ArgumentException ex1) {{{0}" +
556 "}} catch (System.ApplicationException ) {{{0}" +
565 "}}{0}", NewLine), Generate (), "#2");
567 statement = new CodeTryCatchFinallyStatement ();
569 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
571 "}}{0}", NewLine), Generate (), "#3");
573 options.ElseOnClosing = false;
575 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
577 "}}{0}", NewLine), Generate (), "#4");
581 public void CodeVariableDeclarationStatementTest ()
583 CodeVariableDeclarationStatement cvds = new CodeVariableDeclarationStatement ();
586 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
587 "void ;{0}", NewLine), Generate (), "#1");
590 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
591 "void @class;{0}", NewLine), Generate (), "#2");
594 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
595 "void A;{0}", NewLine), Generate (), "#3");
597 cvds.Type = new CodeTypeReference (typeof (int));
598 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
599 "int A;{0}", NewLine), Generate (), "#4");
601 cvds.InitExpression = new CodePrimitiveExpression (25);
602 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
603 "int A = 25;{0}", NewLine), Generate (), "#5");
606 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
607 "int = 25;{0}", NewLine), Generate (), "#5");