// // MonoTests.System.Diagnostics.StackFrameTest.cs // // Author: // Alexander Klyubin (klyubin@aqris.com) // // (C) 2001 // using System; using System.Diagnostics; using System.Reflection; using NUnit.Framework; namespace MonoTests.System.Diagnostics { /// /// Tests the case where StackFrame is created for specified file name and /// location inside it. /// [TestFixture] public class StackFrameTest1 : Assertion { private StackFrame frame1; private StackFrame frame2; [SetUp] public void SetUp () { frame1 = new StackFrame ("dir/someFile", 13, 45); frame2 = new StackFrame ("SomeFile2.cs", 24); } [TearDown] public void TearDown () { frame1 = null; frame2 = null; } /// /// Tests whether getting file name works. /// [Test] public void TestGetFileName () { AssertEquals ("File name (1)", "dir/someFile", frame1.GetFileName ()); AssertEquals ("File name (2)", "SomeFile2.cs", frame2.GetFileName ()); } /// /// Tests whether getting file line number works. /// [Test] public void TestGetFileLineNumber () { AssertEquals ("Line number (1)", 13, frame1.GetFileLineNumber ()); AssertEquals ("Line number (2)", 24, frame2.GetFileLineNumber ()); } /// /// Tests whether getting file column number works. /// [Test] public void TestGetFileColumnNumber () { AssertEquals ("Column number (1)", 45, frame1.GetFileColumnNumber ()); AssertEquals ("Column number (2)", 0, frame2.GetFileColumnNumber ()); } /// /// Tests whether getting method associated with frame works. /// [Test] public void TestGetMethod () { Assert ("Method not null (1)", (frame1.GetMethod () != null)); AssertEquals ("Class declaring the method (1)", this.GetType (), frame1.GetMethod ().DeclaringType); AssertEquals ("Method name (1)", "SetUp", frame1.GetMethod ().Name); Assert ("Method not null (2)", (frame2.GetMethod () != null)); AssertEquals ("Class declaring the method (2)", this.GetType (), frame2.GetMethod ().DeclaringType); AssertEquals ("Method name (2)", "SetUp", frame2.GetMethod ().Name); } } /// /// Tests the case where StackFrame is created for current method. /// /// /// FIXME: Must be compiled with /debug switch. Otherwise some file /// information will be incorrect for the following test cases. /// What's the best way to do both types of tests with and without /// debug information? /// [TestFixture] public class StackFrameTest2 : Assertion { private StackFrame frame1; private StackFrame frame2; private StackFrame frame3; [SetUp] public void SetUp () { frame1 = new StackFrame (); frame2 = new StackFrame (true); frame3 = new StackFrame (0); } [TearDown] public void TearDown () { frame1 = null; frame2 = null; frame3 = null; } /// /// Tests whether getting file name works. /// [Test] public void TestGetFileName1 () { AssertNull ("File name (1)", frame1.GetFileName ()); } [Test] public void TestGetFileName2 () { AssertNotNull ("File name not null", frame2.GetFileName ()); Assert ("File name not empty", frame2.GetFileName ().Length != 0); Assert ("File name (2) " + frame2.GetFileName () + " ends with StackFrameTest.cs", frame2.GetFileName ().EndsWith ("StackFrameTest.cs")); } /// /// Tests whether getting file line number works. /// [Test] public void TestGetFileLineNumber () { AssertEquals ("Line number (1)", 0, frame1.GetFileLineNumber ()); AssertEquals ("Line number (2)", 132, frame2.GetFileLineNumber ()); AssertEquals ("Line number (3)", 0, frame3.GetFileLineNumber ()); } /// /// Tests whether getting file column number works. /// [Test] [Category ("NotWorking")] // bug #45730 - Column numbers always zero public void TestGetFileColumnNumber () { AssertEquals ("Column number (1)", 0, frame1.GetFileColumnNumber ()); AssertEquals ("Column number (2)", 4, frame2.GetFileColumnNumber ()); AssertEquals ("Column number (3)", 0, frame3.GetFileColumnNumber ()); } /// /// Tests whether getting method associated with frame works. /// [Test] public void TestGetMethod () { Assert ("Method not null (1)", (frame1.GetMethod () != null)); AssertEquals ("Class declaring the method (1)", this.GetType (), frame1.GetMethod ().DeclaringType); AssertEquals ("Method name (1)", "SetUp", frame1.GetMethod ().Name); Assert ("Method not null (2)", (frame2.GetMethod () != null)); AssertEquals ("Class declaring the method (2)", this.GetType (), frame2.GetMethod ().DeclaringType); AssertEquals ("Method name (2)", "SetUp", frame2.GetMethod ().Name); Assert ("Method not null (3)", (frame3.GetMethod () != null)); AssertEquals ("Class declaring the method (3)", this.GetType (), frame3.GetMethod ().DeclaringType); AssertEquals ("Method name (3)", "SetUp", frame3.GetMethod ().Name); } } /// /// Tests the case where StackFrame is created for current method but /// skipping some frames. /// /// /// FIXME: Must be compiled with /debug switch. Otherwise some file /// information will be incorrect for the following test cases. /// What's the best way to do both types of tests with and without /// debug information? /// [TestFixture] public class StackFrameTest3 : Assertion { protected StackFrame frame1; protected StackFrame frame2; [SetUp] public void SetUp () { // In order to get better test cases with stack traces NestedSetUp (); } private void NestedSetUp () { frame1 = new StackFrame (2); frame2 = new StackFrame (1, true); // Without this access of frame2 on the RHS, none of // the properties or methods seem to return any data ??? string s = frame2.GetFileName (); } [TearDown] public void TearDown () { frame1 = null; frame2 = null; } /// /// Tests whether getting file name works. /// [Test] public void TestGetFileName () { AssertNull ("File name (1)", frame1.GetFileName ()); AssertNotNull ("File name (2) should not be null", frame2.GetFileName ()); Assert ("File name (2) " + frame2.GetFileName () + " ends with StackFrameTest.cs", frame2.GetFileName ().EndsWith ("StackFrameTest.cs")); } /// /// Tests whether getting file line number works. /// [Test] #if ONLY_1_1 [Category ("NotDotNet")] // .NET 1.1 is off by one #endif public void TestGetFileLineNumber () { AssertEquals ("Line number (1)", 0, frame1.GetFileLineNumber ()); AssertEquals ("Line number (2)", 261, frame2.GetFileLineNumber ()); } /// /// Tests whether getting file column number works. /// [Test] #if ONLY_1_1 [Category ("NotDotNet")] // .NET 1.1 is off by one #endif [Category ("NotWorking")] // bug #45730 - Column numbers always zero public void TestGetFileColumnNumber () { AssertEquals ("Column number (1)", 0, frame1.GetFileColumnNumber ()); AssertEquals ("Column number (2)", 4, frame2.GetFileColumnNumber ()); } /// /// Tests whether getting method associated with frame works. /// [Test] public void TestGetMethod () { Assert ("Method not null (1)", (frame1.GetMethod () != null)); Assert ("Method not null (2)", (frame2.GetMethod () != null)); AssertEquals ("Class declaring the method (2)", this.GetType (), frame2.GetMethod ().DeclaringType); AssertEquals ("Method name (2)", "SetUp", frame2.GetMethod ().Name); } } }