2 // Microsoft.VisualBasic.* Test Cases
5 // Gert Driesen (drieseng@users.sourceforge.net)
7 // (c) 2005 Gert Driesen
11 using System.CodeDom.Compiler;
12 using System.Globalization;
16 using NUnit.Framework;
18 namespace MonoTests.Microsoft.VisualBasic
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 "AddHandler , EventHandler{0}", NewLine), Generate (), "#3");
122 attachEventStatement.Event = cere;
123 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
124 "AddHandler 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 "AddHandler ., EventHandler{0}", NewLine), Generate (), "#5");
131 attachEventStatement.Listener = new CodeSnippetExpression ("");
132 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
133 "AddHandler ., {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 "'{0}", NewLine), Generate (), "#1");
147 comment.Text = "a\nb";
148 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
149 "'a\n'b{0}", 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 "End If{0}", NewLine), Generate (), "#2");
193 conditionStatement.Condition = new CodeSnippetExpression ("true == false");
194 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
195 "If true == false Then{0}" +
196 "End If{0}", NewLine), Generate (), "#3");
198 conditionStatement.TrueStatements.AddRange (trueStatements);
199 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
200 "If true == false Then{0}" +
211 "End If{0}", NewLine), Generate (), "#3");
213 conditionStatement.FalseStatements.AddRange (falseStatements);
214 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
215 "If true == false Then{0}" +
237 "End If{0}", NewLine), Generate (), "#4");
239 options.ElseOnClosing = true;
241 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
242 "If true == false Then{0}" +
264 "End If{0}", NewLine), Generate (), "#5");
266 options.ElseOnClosing = false;
268 conditionStatement.TrueStatements.Clear ();
270 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
271 "If true == false Then{0}" +
283 "End If{0}", NewLine), Generate (), "#6");
285 conditionStatement.TrueStatements.AddRange (trueStatements);
286 conditionStatement.FalseStatements.Clear ();
287 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
288 "If true == false Then{0}" +
299 "End If{0}", NewLine), Generate (), "#7");
303 public void CodeExpressionStatementTest ()
305 CodeExpressionStatement ces = new CodeExpressionStatement ();
311 } catch (ArgumentNullException) {
314 ces.Expression = new CodeSnippetExpression ("something");
315 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
316 "something{0}", NewLine), Generate (), "#2");
320 public void CodeGotoStatementTest ()
322 statement = new CodeGotoStatement ("something");
323 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
324 "goto something{0}", NewLine), Generate ());
328 public void CodeIterationStatementTest ()
330 CodeIterationStatement cis = new CodeIterationStatement ();
335 Assert.Fail ("#1: null InitStatement should cause NRE");
336 } catch (NullReferenceException) {
339 cis.InitStatement = new CodeVariableDeclarationStatement (typeof (int),
340 "testInt", new CodePrimitiveExpression (1));
343 Assert.Fail ("#2: null TestExpression should cause ArgumentNullException");
344 } catch (ArgumentNullException) {
347 cis.TestExpression = new CodeBinaryOperatorExpression (
348 new CodeVariableReferenceExpression ("testInt"),
349 CodeBinaryOperatorType.LessThan,
350 new CodePrimitiveExpression (10));
353 Assert.Fail ("#3: null IncrementStatement should cause NRE");
354 } catch (NullReferenceException) {
357 cis.IncrementStatement = new CodeAssignStatement (
358 new CodeVariableReferenceExpression ("testInt"),
359 new CodeBinaryOperatorExpression (
360 new CodeVariableReferenceExpression ("testInt"),
361 CodeBinaryOperatorType.Add,
362 new CodePrimitiveExpression (1)));
363 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
364 "Dim testInt As Integer = 1{0}" +
365 "Do While (testInt < 10){0}" +
366 " testInt = (testInt + 1){0}" +
367 "Loop{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 "Dim testInt As Integer = 1{0}" +
379 "Do While (testInt < 10){0}" +
396 " testInt = (testInt + 1){0}" +
397 "Loop{0}", NewLine), Generate (), "#5");
401 public void CodeLabeledStatementTest ()
403 CodeLabeledStatement cls = new CodeLabeledStatement ();
406 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
407 ":{0}", NewLine), Generate (), "#1");
410 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
411 "class:{0}", NewLine), Generate (), "#2");
413 cls.Statement = new CodeSnippetStatement ("A");
414 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
421 NewLine), Generate (), "#3");
425 public void CodeMethodReturnStatementTest ()
427 CodeMethodReturnStatement cmrs = new CodeMethodReturnStatement ();
430 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
431 "Return{0}", NewLine), Generate (), "#1");
433 cmrs.Expression = new CodePrimitiveExpression (1);
434 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
435 "Return 1{0}", NewLine), Generate (), "#2");
439 public void CodeRemoveEventStatementTest ()
441 CodeEventReferenceExpression cere = new CodeEventReferenceExpression (
442 new CodeSnippetExpression ("A"), "class");
443 CodeSnippetExpression handler = new CodeSnippetExpression ("EventHandler");
445 CodeRemoveEventStatement cres = new CodeRemoveEventStatement ();
451 } catch (ArgumentNullException) {
458 } catch (ArgumentNullException) {
462 cres.Listener = handler;
463 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
464 "RemoveHandler , EventHandler{0}", NewLine), Generate (), "#3");
467 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
468 "RemoveHandler A.[class], EventHandler{0}", NewLine), Generate (), "#4");
470 cres.Event = new CodeEventReferenceExpression (
471 new CodeSnippetExpression ((string) null), "");
472 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
473 "RemoveHandler ., EventHandler{0}", NewLine), Generate (), "#5");
475 cres.Listener = new CodeSnippetExpression ("");
476 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
477 "RemoveHandler ., {0}", NewLine), Generate (), "#6");
481 public void CodeSnippetStatementTest ()
483 CodeSnippetStatement css = new CodeSnippetStatement ();
486 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
487 "{0}", NewLine), Generate (), "#1");
490 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
491 "class{0}", NewLine), Generate (), "#2");
494 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
495 "{0}", NewLine), Generate (), "#3");
499 [ExpectedException (typeof (ArgumentException))]
500 public void CodeStatement ()
502 CodeStatement cs = new CodeStatement ();
509 public void CodeThrowExceptionStatementTest ()
511 CodeThrowExceptionStatement ctet = new CodeThrowExceptionStatement ();
513 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
514 "Throw{0}", NewLine), Generate (), "#1");
516 ctet.ToThrow = new CodeSnippetExpression ("whatever");
517 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
518 "Throw whatever{0}", NewLine), Generate (), "#2");
522 public void CodeTryCatchFinallyStatementTest ()
524 CodeStatement cs = new CodeGotoStatement ("exit");
525 CodeCatchClause ccc1 = new CodeCatchClause ("ex1", new CodeTypeReference ("System.ArgumentException"));
526 CodeCatchClause ccc2 = new CodeCatchClause (null, new CodeTypeReference ("System.ApplicationException"));
527 CodeSnippetStatement fin1 = new CodeSnippetStatement ("A");
528 CodeSnippetStatement fin2 = new CodeSnippetStatement ("B");
530 statement = new CodeTryCatchFinallyStatement (new CodeStatement[] { cs },
531 new CodeCatchClause[] { ccc1, ccc2 }, new CodeStatement[] { fin1, fin2 });
533 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
536 "Catch ex1 As System.ArgumentException{0}" +
538 "Catch __exception As System.ApplicationException{0}" +
540 "Catch As System.ApplicationException{0}" +
550 "End Try{0}", NewLine), Generate (), "#1");
552 options.ElseOnClosing = true;
553 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
556 "Catch ex1 As System.ArgumentException{0}" +
558 "Catch __exception As System.ApplicationException{0}" +
560 "Catch As System.ApplicationException{0}" +
570 "End Try{0}", NewLine), Generate (), "#2");
572 statement = new CodeTryCatchFinallyStatement ();
574 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
576 "End Try{0}", NewLine), Generate (), "#3");
578 options.ElseOnClosing = false;
580 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
582 "End Try{0}", NewLine), Generate (), "#4");
586 public void CodeVariableDeclarationStatementTest ()
588 CodeVariableDeclarationStatement cvds = new CodeVariableDeclarationStatement ();
591 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
593 "Dim __exception As System.Void{0}",
595 "Dim As System.Void{0}",
597 NewLine), Generate (), "#1");
600 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
601 "Dim [class] As System.Void{0}", NewLine), Generate (), "#2");
604 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
605 "Dim A As System.Void{0}", NewLine), Generate (), "#3");
607 cvds.Type = new CodeTypeReference (typeof (int));
608 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
609 "Dim A As Integer{0}", NewLine), Generate (), "#4");
611 cvds.InitExpression = new CodePrimitiveExpression (25);
612 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
613 "Dim A As Integer = 25{0}", NewLine), Generate (), "#5");
616 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
618 "Dim __exception As Integer = 25{0}",
620 "Dim As Integer = 25{0}",
622 NewLine), Generate (), "#6");