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}" +
207 "}}{0}", NewLine), Generate (), "#3");
209 conditionStatement.FalseStatements.AddRange (falseStatements);
210 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
211 "if (true == false) {{{0}" +
226 "}}{0}", NewLine), Generate (), "#4");
228 options.ElseOnClosing = true;
230 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
231 "if (true == false) {{{0}" +
245 "}}{0}", NewLine), Generate (), "#5");
247 options.ElseOnClosing = false;
249 conditionStatement.TrueStatements.Clear ();
251 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
252 "if (true == false) {{{0}" +
261 "}}{0}", NewLine), Generate (), "#6");
263 conditionStatement.TrueStatements.AddRange (trueStatements);
264 conditionStatement.FalseStatements.Clear ();
265 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
266 "if (true == false) {{{0}" +
273 "}}{0}", NewLine), Generate (), "#7");
277 public void CodeExpressionStatementTest ()
279 CodeExpressionStatement ces = new CodeExpressionStatement ();
285 } catch (ArgumentNullException) {
288 ces.Expression = new CodeSnippetExpression ("something");
289 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
290 "something;{0}", NewLine), Generate (), "#2");
294 public void CodeGotoStatementTest ()
296 statement = new CodeGotoStatement ("something");
297 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
298 "goto something;{0}", NewLine), Generate ());
302 public void CodeIterationStatementTest ()
304 CodeIterationStatement cis = new CodeIterationStatement ();
309 Assert.Fail ("#1: null InitStatement should cause NRE");
310 } catch (NullReferenceException) {
313 cis.InitStatement = new CodeVariableDeclarationStatement (typeof(int),
314 "testInt", new CodePrimitiveExpression(1));
317 Assert.Fail ("#2: null TestExpression should cause ArgumentNullException");
318 } catch (ArgumentNullException) {
321 cis.TestExpression = new CodeBinaryOperatorExpression (
322 new CodeVariableReferenceExpression ("testInt"),
323 CodeBinaryOperatorType.LessThan,
324 new CodePrimitiveExpression (10));
327 Assert.Fail ("#3: null IncrementStatement should cause NRE");
328 } catch (NullReferenceException) {
331 cis.IncrementStatement = new CodeAssignStatement (
332 new CodeVariableReferenceExpression ("testInt"),
333 new CodeBinaryOperatorExpression (
334 new CodeVariableReferenceExpression ("testInt"),
335 CodeBinaryOperatorType.Add,
336 new CodePrimitiveExpression (1)));
337 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
338 "for (int testInt = 1; (testInt < 10); testInt = (testInt + 1)) {{{0}" +
339 "}}{0}", NewLine), Generate (), "#4");
341 cis.Statements.AddRange (new CodeStatement[] {
342 new CodeExpressionStatement (new CodeSnippetExpression ("DoA()")),
343 new CodeExpressionStatement (new CodeSnippetExpression (";")),
344 new CodeExpressionStatement (new CodeSnippetExpression ("DoB()")),
345 new CodeLabeledStatement ("test", new CodeSnippetStatement ("C")),
346 new CodeExpressionStatement (new CodeSnippetExpression ("")),
347 new CodeSnippetStatement ("A"),
348 new CodeExpressionStatement (new CodeSnippetExpression ("DoC()")) });
349 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
350 "for (int testInt = 1; (testInt < 10); testInt = (testInt + 1)) {{{0}" +
359 "}}{0}", NewLine), Generate (), "#5");
363 public void CodeLabeledStatementTest ()
365 CodeLabeledStatement cls = new CodeLabeledStatement ();
368 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
369 ":{0}", NewLine), Generate (), "#1");
372 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
373 "class:{0}", NewLine), Generate (), "#2");
375 cls.Statement = new CodeSnippetStatement ("A");
376 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
379 NewLine), Generate (), "#3");
383 public void CodeMethodReturnStatementTest ()
385 CodeMethodReturnStatement cmrs = new CodeMethodReturnStatement ();
388 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
389 "return;{0}", NewLine), Generate (), "#1");
391 cmrs.Expression = new CodePrimitiveExpression (1);
392 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
393 "return 1;{0}", NewLine), Generate (), "#2");
397 public void CodeRemoveEventStatementTest ()
399 CodeEventReferenceExpression cere = new CodeEventReferenceExpression (
400 new CodeSnippetExpression ("A"), "class");
401 CodeSnippetExpression handler = new CodeSnippetExpression ("EventHandler");
403 CodeRemoveEventStatement cres = new CodeRemoveEventStatement ();
409 } catch (ArgumentNullException) {
416 } catch (ArgumentNullException) {
420 cres.Listener = handler;
421 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
422 " -= EventHandler;{0}", NewLine), Generate (), "#3");
425 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
426 "A.@class -= EventHandler;{0}", NewLine), Generate (), "#4");
428 cres.Event = new CodeEventReferenceExpression (
429 new CodeSnippetExpression ((string) null), "");
430 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
431 ". -= EventHandler;{0}", NewLine), Generate (), "#5");
433 cres.Listener = new CodeSnippetExpression ("");
434 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
435 ". -= ;{0}", NewLine), Generate (), "#6");
439 public void CodeSnippetStatementTest ()
441 CodeSnippetStatement css = new CodeSnippetStatement ();
444 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
445 "{0}", NewLine), Generate (), "#1");
448 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
449 "class{0}", NewLine), Generate (), "#2");
452 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
453 "{0}", NewLine), Generate (), "#3");
457 [ExpectedException (typeof (ArgumentException))]
458 public void CodeStatement ()
460 CodeStatement cs = new CodeStatement ();
467 public void CodeThrowExceptionStatementTest ()
469 CodeThrowExceptionStatement ctes = new CodeThrowExceptionStatement ();
472 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
473 "throw;{0}", NewLine), Generate (), "#1");
475 ctes.ToThrow = new CodeSnippetExpression ("whatever");
476 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
477 "throw whatever;{0}", NewLine), Generate (), "#2");
481 public void CodeTryCatchFinallyStatementTest ()
483 CodeStatement cs = new CodeGotoStatement ("exit");
484 CodeCatchClause ccc1 = new CodeCatchClause ("ex1", new CodeTypeReference ("System.ArgumentException"));
485 CodeCatchClause ccc2 = new CodeCatchClause (null, new CodeTypeReference ("System.ApplicationException"));
486 CodeSnippetStatement fin1 = new CodeSnippetStatement ("A");
487 CodeSnippetStatement fin2 = new CodeSnippetStatement ("B");
489 statement = new CodeTryCatchFinallyStatement (new CodeStatement[] { cs },
490 new CodeCatchClause[] { ccc1, ccc2 }, new CodeStatement[] { fin1, fin2 });
492 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
496 "catch (System.ArgumentException ex1) {{{0}" +
498 "catch (System.ApplicationException ) {{{0}" +
503 "}}{0}", NewLine), Generate (), "#1");
505 options.ElseOnClosing = true;
507 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
510 "}} catch (System.ArgumentException ex1) {{{0}" +
511 "}} catch (System.ApplicationException ) {{{0}" +
515 "}}{0}", NewLine), Generate (), "#2");
517 statement = new CodeTryCatchFinallyStatement ();
519 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
521 "}}{0}", NewLine), Generate (), "#3");
523 options.ElseOnClosing = false;
525 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
527 "}}{0}", NewLine), Generate (), "#4");
531 public void CodeVariableDeclarationStatementTest ()
533 CodeVariableDeclarationStatement cvds = new CodeVariableDeclarationStatement ();
536 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
537 "void ;{0}", NewLine), Generate (), "#1");
540 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
541 "void @class;{0}", NewLine), Generate (), "#2");
544 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
545 "void A;{0}", NewLine), Generate (), "#3");
547 cvds.Type = new CodeTypeReference (typeof (int));
548 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
549 "int A;{0}", NewLine), Generate (), "#4");
551 cvds.InitExpression = new CodePrimitiveExpression (25);
552 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
553 "int A = 25;{0}", NewLine), Generate (), "#5");
556 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
557 "int = 25;{0}", NewLine), Generate (), "#5");