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 CodeAttachEventStatementKeywordTest ()
139 CodeEventReferenceExpression cere = new CodeEventReferenceExpression (
140 new CodeSnippetExpression ("Set"), "Event");
141 CodeSnippetExpression handler = new CodeSnippetExpression ("Handles");
143 CodeAttachEventStatement attachEventStatement = new CodeAttachEventStatement ();
144 statement = attachEventStatement;
149 } catch (ArgumentNullException) {
152 attachEventStatement.Event = cere;
156 } catch (ArgumentNullException) {
159 attachEventStatement.Event = null;
160 attachEventStatement.Listener = handler;
161 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
162 "AddHandler , Handles{0}", NewLine), Generate (), "#3");
164 attachEventStatement.Event = cere;
165 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
166 "AddHandler Set.[Event], Handles{0}", NewLine), Generate (), "#4");
168 attachEventStatement.Event = new CodeEventReferenceExpression (
169 new CodeSnippetExpression ((string) null), "");
170 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
171 "AddHandler ., Handles{0}", NewLine), Generate (), "#5");
173 attachEventStatement.Listener = new CodeSnippetExpression ("");
174 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
175 "AddHandler ., {0}", NewLine), Generate (), "#6");
178 public void CodeCommentStatementTest ()
180 CodeCommentStatement commentStatement = new CodeCommentStatement ();
181 CodeComment comment = new CodeComment ();
182 commentStatement.Comment = comment;
183 statement = commentStatement;
185 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
186 "'{0}", NewLine), Generate (), "#1");
188 comment.Text = "a\nb";
189 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
190 "'a\n'b{0}", NewLine), Generate (), "#2");
192 comment.Text = "a\r\nb";
193 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
194 "'a\r\n'b{0}", NewLine), Generate (), "#3");
196 comment.Text = "a\rb";
197 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
198 "'a\r'b{0}", NewLine), Generate (), "#4");
202 public void CodeConditionStatementTest ()
204 CodeStatement[] trueStatements = new CodeStatement[] {
205 new CodeExpressionStatement (new CodeSnippetExpression ("DoA()")),
206 new CodeExpressionStatement (new CodeSnippetExpression (";")),
207 new CodeExpressionStatement (new CodeSnippetExpression ("DoB()")),
208 new CodeExpressionStatement (new CodeSnippetExpression ("")),
209 new CodeSnippetStatement ("A"),
210 new CodeExpressionStatement (new CodeSnippetExpression ("DoC()")) };
212 CodeStatement[] falseStatements = new CodeStatement[] {
213 new CodeExpressionStatement (new CodeSnippetExpression ("DoD()")),
214 new CodeSnippetStatement ("B"),
215 new CodeExpressionStatement (new CodeSnippetExpression (";")),
216 new CodeExpressionStatement (new CodeSnippetExpression ("DoE()")),
217 new CodeExpressionStatement (new CodeSnippetExpression ("")),
218 new CodeExpressionStatement (new CodeSnippetExpression ("DoF()")) };
220 CodeConditionStatement conditionStatement = new CodeConditionStatement ();
221 statement = conditionStatement;
226 } catch (ArgumentNullException) {
229 conditionStatement.Condition = new CodeSnippetExpression ("");
230 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
232 "End If{0}", NewLine), Generate (), "#2");
234 conditionStatement.Condition = new CodeSnippetExpression ("true == false");
235 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
236 "If true == false Then{0}" +
237 "End If{0}", NewLine), Generate (), "#3");
239 conditionStatement.TrueStatements.AddRange (trueStatements);
240 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
241 "If true == false Then{0}" +
248 "End If{0}", NewLine), Generate (), "#3");
250 conditionStatement.FalseStatements.AddRange (falseStatements);
251 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
252 "If true == false Then{0}" +
266 "End If{0}", NewLine), Generate (), "#4");
268 options.ElseOnClosing = true;
270 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
271 "If true == false Then{0}" +
285 "End If{0}", NewLine), Generate (), "#5");
287 options.ElseOnClosing = false;
289 conditionStatement.TrueStatements.Clear ();
291 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
292 "If true == false Then{0}" +
300 "End If{0}", NewLine), Generate (), "#6");
302 conditionStatement.TrueStatements.AddRange (trueStatements);
303 conditionStatement.FalseStatements.Clear ();
304 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
305 "If true == false Then{0}" +
312 "End If{0}", NewLine), Generate (), "#7");
316 public void CodeExpressionStatementTest ()
318 CodeExpressionStatement ces = new CodeExpressionStatement ();
324 } catch (ArgumentNullException) {
327 ces.Expression = new CodeSnippetExpression ("something");
328 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
329 "something{0}", NewLine), Generate (), "#2");
333 public void CodeGotoStatementTest ()
335 statement = new CodeGotoStatement ("something");
336 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
337 "goto something{0}", NewLine), Generate ());
341 public void CodeIterationStatementTest ()
343 CodeIterationStatement cis = new CodeIterationStatement ();
348 Assert.Fail ("#1: null InitStatement should cause NRE");
349 } catch (NullReferenceException) {
352 cis.InitStatement = new CodeVariableDeclarationStatement (typeof (int),
353 "testInt", new CodePrimitiveExpression (1));
356 Assert.Fail ("#2: null TestExpression should cause ArgumentNullException");
357 } catch (ArgumentNullException) {
360 cis.TestExpression = new CodeBinaryOperatorExpression (
361 new CodeVariableReferenceExpression ("testInt"),
362 CodeBinaryOperatorType.LessThan,
363 new CodePrimitiveExpression (10));
366 Assert.Fail ("#3: null IncrementStatement should cause NRE");
367 } catch (NullReferenceException) {
370 cis.IncrementStatement = new CodeAssignStatement (
371 new CodeVariableReferenceExpression ("testInt"),
372 new CodeBinaryOperatorExpression (
373 new CodeVariableReferenceExpression ("testInt"),
374 CodeBinaryOperatorType.Add,
375 new CodePrimitiveExpression (1)));
376 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
377 "Dim testInt As Integer = 1{0}" +
378 "Do While (testInt < 10){0}" +
379 " testInt = (testInt + 1){0}" +
380 "Loop{0}", NewLine), Generate (), "#4");
382 cis.Statements.AddRange (new CodeStatement[] {
383 new CodeExpressionStatement (new CodeSnippetExpression ("DoA()")),
384 new CodeExpressionStatement (new CodeSnippetExpression (";")),
385 new CodeExpressionStatement (new CodeSnippetExpression ("DoB()")),
386 new CodeLabeledStatement ("test", new CodeSnippetStatement ("C")),
387 new CodeExpressionStatement (new CodeSnippetExpression ("")),
388 new CodeSnippetStatement ("A"),
389 new CodeExpressionStatement (new CodeSnippetExpression ("DoC()")) });
390 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
391 "Dim testInt As Integer = 1{0}" +
392 "Do While (testInt < 10){0}" +
401 " testInt = (testInt + 1){0}" +
402 "Loop{0}", NewLine), Generate (), "#5");
406 public void CodeLabeledStatementTest ()
408 CodeLabeledStatement cls = new CodeLabeledStatement ();
411 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
412 ":{0}", NewLine), Generate (), "#1");
415 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
416 "class:{0}", NewLine), Generate (), "#2");
418 cls.Statement = new CodeSnippetStatement ("A");
419 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
422 NewLine), Generate (), "#3");
426 public void CodeMethodReturnStatementTest ()
428 CodeMethodReturnStatement cmrs = new CodeMethodReturnStatement ();
431 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
432 "Return{0}", NewLine), Generate (), "#1");
434 cmrs.Expression = new CodePrimitiveExpression (1);
435 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
436 "Return 1{0}", NewLine), Generate (), "#2");
440 public void CodeRemoveEventStatementTest ()
442 CodeEventReferenceExpression cere = new CodeEventReferenceExpression (
443 new CodeSnippetExpression ("A"), "class");
444 CodeSnippetExpression handler = new CodeSnippetExpression ("EventHandler");
446 CodeRemoveEventStatement cres = new CodeRemoveEventStatement ();
452 } catch (ArgumentNullException) {
459 } catch (ArgumentNullException) {
463 cres.Listener = handler;
464 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
465 "RemoveHandler , EventHandler{0}", NewLine), Generate (), "#3");
468 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
469 "RemoveHandler A.[class], EventHandler{0}", NewLine), Generate (), "#4");
471 cres.Event = new CodeEventReferenceExpression (
472 new CodeSnippetExpression ((string) null), "");
473 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
474 "RemoveHandler ., EventHandler{0}", NewLine), Generate (), "#5");
476 cres.Listener = new CodeSnippetExpression ("");
477 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
478 "RemoveHandler ., {0}", NewLine), Generate (), "#6");
482 public void CodeSnippetStatementTest ()
484 CodeSnippetStatement css = new CodeSnippetStatement ();
487 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
488 "{0}", NewLine), Generate (), "#1");
491 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
492 "class{0}", NewLine), Generate (), "#2");
495 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
496 "{0}", NewLine), Generate (), "#3");
500 [ExpectedException (typeof (ArgumentException))]
501 public void CodeStatement ()
503 CodeStatement cs = new CodeStatement ();
510 public void CodeThrowExceptionStatementTest ()
512 CodeThrowExceptionStatement ctet = new CodeThrowExceptionStatement ();
514 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
515 "Throw{0}", NewLine), Generate (), "#1");
517 ctet.ToThrow = new CodeSnippetExpression ("whatever");
518 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
519 "Throw whatever{0}", NewLine), Generate (), "#2");
523 public void CodeTryCatchFinallyStatementTest ()
525 CodeStatement cs = new CodeGotoStatement ("exit");
526 CodeCatchClause ccc1 = new CodeCatchClause ("ex1", new CodeTypeReference ("System.ArgumentException"));
527 CodeCatchClause ccc2 = new CodeCatchClause (null, new CodeTypeReference ("System.ApplicationException"));
528 CodeSnippetStatement fin1 = new CodeSnippetStatement ("A");
529 CodeSnippetStatement fin2 = new CodeSnippetStatement ("B");
531 statement = new CodeTryCatchFinallyStatement (new CodeStatement[] { cs },
532 new CodeCatchClause[] { ccc1, ccc2 }, new CodeStatement[] { fin1, fin2 });
534 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
537 "Catch ex1 As System.ArgumentException{0}" +
538 "Catch __exception As System.ApplicationException{0}" +
542 "End Try{0}", NewLine), Generate (), "#1");
544 options.ElseOnClosing = true;
545 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
548 "Catch ex1 As System.ArgumentException{0}" +
549 "Catch __exception As System.ApplicationException{0}" +
553 "End Try{0}", NewLine), Generate (), "#2");
555 statement = new CodeTryCatchFinallyStatement ();
557 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
559 "End Try{0}", NewLine), Generate (), "#3");
561 options.ElseOnClosing = false;
563 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
565 "End Try{0}", NewLine), Generate (), "#4");
569 public void CodeVariableDeclarationStatementTest ()
571 CodeVariableDeclarationStatement cvds = new CodeVariableDeclarationStatement ();
574 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
575 "Dim __exception As System.Void{0}",
576 NewLine), Generate (), "#1");
579 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
580 "Dim [class] As System.Void{0}", NewLine), Generate (), "#2");
583 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
584 "Dim A As System.Void{0}", NewLine), Generate (), "#3");
586 cvds.Type = new CodeTypeReference (typeof (int));
587 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
588 "Dim A As Integer{0}", NewLine), Generate (), "#4");
590 cvds.InitExpression = new CodePrimitiveExpression (25);
591 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
592 "Dim A As Integer = 25{0}", NewLine), Generate (), "#5");
595 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
596 "Dim __exception As Integer = 25{0}",
597 NewLine), Generate (), "#6");