1 // 2 // MonoTests.System.Diagnostics.StackFrameTest.cs 3 // 4 // Author: 5 // Alexander Klyubin (klyubin@aqris.com) 6 // 7 // (C) 2001 8 // 9 10 using System; 11 using System.Diagnostics; 12 using System.Reflection; 13 using NUnit.Framework; 14 15 namespace MonoTests.System.Diagnostics 16 { 17 /// <summary> 18 /// Tests the case where StackFrame is created for specified file name and 19 /// location inside it. 20 /// </summary> 21 [TestFixture] 22 public class StackFrameTest1 23 { 24 private StackFrame frame1; 25 private StackFrame frame2; 26 27 [SetUp] SetUp()28 public void SetUp () 29 { 30 frame1 = new StackFrame ("dir/someFile", 13, 45); 31 frame2 = new StackFrame ("SomeFile2.cs", 24); 32 } 33 34 [TearDown] TearDown()35 public void TearDown () 36 { 37 frame1 = null; 38 frame2 = null; 39 } 40 41 /// <summary> 42 /// Tests whether getting file name works. 43 /// </summary> 44 [Test] 45 [Category("LLVMNotWorking")] TestGetFileName()46 public void TestGetFileName () 47 { 48 Assert.AreEqual ("dir/someFile", 49 frame1.GetFileName (), 50 "File name (1)"); 51 52 Assert.AreEqual ("SomeFile2.cs", 53 frame2.GetFileName (), 54 "File name (2)"); 55 } 56 57 /// <summary> 58 /// Tests whether getting file line number works. 59 /// </summary> 60 [Test] 61 [Category("LLVMNotWorking")] TestGetFileLineNumber()62 public void TestGetFileLineNumber () 63 { 64 Assert.AreEqual (13, 65 frame1.GetFileLineNumber (), 66 "Line number (1)"); 67 68 Assert.AreEqual (24, 69 frame2.GetFileLineNumber (), 70 "Line number (2)"); 71 } 72 73 /// <summary> 74 /// Tests whether getting file column number works. 75 /// </summary> 76 [Test] TestGetFileColumnNumber()77 public void TestGetFileColumnNumber () 78 { 79 Assert.AreEqual (45, 80 frame1.GetFileColumnNumber (), 81 "Column number (1)"); 82 83 Assert.AreEqual (0, 84 frame2.GetFileColumnNumber (), 85 "Column number (2)"); 86 } 87 88 /// <summary> 89 /// Tests whether getting method associated with frame works. 90 /// </summary> 91 [Test] TestGetMethod()92 public void TestGetMethod () 93 { 94 Assert.IsTrue ((frame1.GetMethod () != null), "Method not null (1)"); 95 96 Assert.AreEqual (this.GetType (), 97 frame1.GetMethod ().DeclaringType, 98 "Class declaring the method (1)"); 99 Assert.AreEqual ("SetUp", 100 frame1.GetMethod ().Name, 101 "Method name (1)"); 102 103 Assert.IsTrue ((frame2.GetMethod () != null), "Method not null (2)"); 104 105 Assert.AreEqual (this.GetType (), 106 frame2.GetMethod ().DeclaringType, 107 "Class declaring the method (2)"); 108 Assert.AreEqual ("SetUp", 109 frame2.GetMethod ().Name, 110 "Method name (2)"); 111 } 112 } 113 114 /// <summary> 115 /// Tests the case where StackFrame is created for current method. 116 /// </summary> 117 /// <remarks> 118 /// FIXME: Must be compiled with /debug switch. Otherwise some file 119 /// information will be incorrect for the following test cases. 120 /// What's the best way to do both types of tests with and without 121 /// debug information? 122 /// </remarks> 123 [TestFixture] 124 public class StackFrameTest2 125 { 126 private StackFrame frame1; 127 private StackFrame frame2; 128 private StackFrame frame3; 129 130 [SetUp] SetUp()131 public void SetUp () 132 { 133 frame1 = new StackFrame (); 134 frame2 = new StackFrame (true); 135 frame3 = new StackFrame (0); 136 } 137 138 [TearDown] TearDown()139 public void TearDown () 140 { 141 frame1 = null; 142 frame2 = null; 143 frame3 = null; 144 } 145 146 /// <summary> 147 /// Tests whether getting file name works. 148 /// </summary> 149 [Test] TestGetFileName1()150 public void TestGetFileName1 () 151 { 152 Assert.IsNull (frame1.GetFileName (), 153 "File name (1)"); 154 } 155 156 [Test] 157 [Category ("LLVMNotWorking")] TestGetFileName2()158 public void TestGetFileName2 () 159 { 160 #if MOBILE && !DEBUG 161 Assert.Ignore ("The .mdb file won't be present inside the app and no file name will be available"); 162 #endif 163 Assert.IsNotNull (frame2.GetFileName (), "File name not null"); 164 Assert.IsTrue (frame2.GetFileName ().Length != 0, "File name not empty"); 165 Assert.IsTrue (frame2.GetFileName ().EndsWith ("StackFrameTest.cs"), 166 "File name (2) " + frame2.GetFileName () + " ends with StackFrameTest.cs"); 167 } 168 169 /// <summary> 170 /// Tests whether getting file line number works. 171 /// </summary> 172 [Test] 173 [Category ("LLVMNotWorking")] TestGetFileLineNumber()174 public void TestGetFileLineNumber () 175 { 176 #if MOBILE && !DEBUG 177 Assert.Ignore ("The .mdb file won't be present inside the app and no line number will be available"); 178 #endif 179 Assert.AreEqual (0, 180 frame1.GetFileLineNumber (), 181 "Line number (1)"); 182 183 Assert.AreEqual (134, 184 frame2.GetFileLineNumber (), 185 "Line number (2)"); 186 187 Assert.AreEqual (0, 188 frame3.GetFileLineNumber (), 189 "Line number (3)"); 190 } 191 192 /// <summary> 193 /// Tests whether getting file column number works. 194 /// </summary> 195 [Test] 196 [Category ("NotWorking")] // bug #45730 - Column numbers always zero TestGetFileColumnNumber()197 public void TestGetFileColumnNumber () 198 { 199 Assert.AreEqual (0, 200 frame1.GetFileColumnNumber (), 201 "Column number (1)"); 202 203 Assert.AreEqual (4, 204 frame2.GetFileColumnNumber (), 205 "Column number (2)"); 206 207 Assert.AreEqual (0, 208 frame3.GetFileColumnNumber (), 209 "Column number (3)"); 210 } 211 212 /// <summary> 213 /// Tests whether getting method associated with frame works. 214 /// </summary> 215 [Test] TestGetMethod()216 public void TestGetMethod () 217 { 218 Assert.IsNotNull (frame1.GetMethod (), 219 "Method not null (1)"); 220 221 Assert.AreEqual (this.GetType (), 222 frame1.GetMethod ().DeclaringType, 223 "Class declaring the method (1)"); 224 Assert.AreEqual ("SetUp", 225 frame1.GetMethod ().Name, 226 "Method name (1)"); 227 228 Assert.IsNotNull (frame2.GetMethod (), 229 "Method not null (2)"); 230 231 Assert.AreEqual (this.GetType (), 232 frame2.GetMethod ().DeclaringType, 233 "Class declaring the method (2)"); 234 Assert.AreEqual ("SetUp", 235 frame2.GetMethod ().Name, 236 "Method name (2)"); 237 238 Assert.IsNotNull (frame3.GetMethod (), 239 "Method not null (3)"); 240 241 Assert.AreEqual (this.GetType (), 242 frame3.GetMethod ().DeclaringType, 243 "Class declaring the method (3)"); 244 Assert.AreEqual ("SetUp", 245 frame3.GetMethod ().Name, 246 "Method name (3)"); 247 } 248 } 249 250 /// <summary> 251 /// Tests the case where StackFrame is created for current method but 252 /// skipping some frames. 253 /// </summary> 254 /// <remarks> 255 /// FIXME: Must be compiled with /debug switch. Otherwise some file 256 /// information will be incorrect for the following test cases. 257 /// What's the best way to do both types of tests with and without 258 /// debug information? 259 /// </remarks> 260 [TestFixture] 261 public class StackFrameTest3 262 { 263 protected StackFrame frame1; 264 protected StackFrame frame2; 265 266 [SetUp] SetUp()267 public void SetUp () 268 { 269 // In order to get better test cases with stack traces 270 NestedSetUp (); 271 } 272 NestedSetUp()273 private void NestedSetUp () 274 { 275 frame1 = new StackFrame (2); 276 frame2 = new StackFrame (1, true); 277 // Without this access of frame2 on the RHS, none of 278 // the properties or methods seem to return any data ??? 279 string s = frame2.GetFileName (); 280 } 281 282 [TearDown] TearDown()283 public void TearDown () 284 { 285 frame1 = null; 286 frame2 = null; 287 } 288 289 /// <summary> 290 /// Tests whether getting file name works. 291 /// </summary> 292 [Test] 293 [Category ("LLVMNotWorking")] TestGetFileName()294 public void TestGetFileName () 295 { 296 #if MOBILE && !DEBUG 297 Assert.Ignore ("The .mdb file won't be present inside the app and no file name will be available"); 298 #endif 299 Assert.IsNull (frame1.GetFileName (), 300 "File name (1)"); 301 302 Assert.IsNotNull (frame2.GetFileName (), 303 "File name (2) should not be null"); 304 305 Assert.IsTrue (frame2.GetFileName ().EndsWith ("StackFrameTest.cs"), 306 "File name (2) " + frame2.GetFileName () + " ends with StackFrameTest.cs"); 307 } 308 309 /// <summary> 310 /// Tests whether getting file line number works. 311 /// </summary> 312 [Test] 313 [Category ("LLVMNotWorking")] TestGetFileLineNumber()314 public void TestGetFileLineNumber () 315 { 316 #if MOBILE && !DEBUG 317 Assert.Ignore ("The .mdb file won't be present inside the app and no line number will be available"); 318 #endif 319 Assert.AreEqual (0, 320 frame1.GetFileLineNumber (), 321 "Line number (1)"); 322 323 Assert.AreEqual (270, 324 frame2.GetFileLineNumber (), 325 "Line number (2)"); 326 } 327 328 /// <summary> 329 /// Tests whether getting file column number works. 330 /// </summary> 331 [Test] 332 [Category ("NotWorking")] // bug #45730 - Column numbers always zero TestGetFileColumnNumber()333 public void TestGetFileColumnNumber () 334 { 335 Assert.AreEqual (0, 336 frame1.GetFileColumnNumber (), 337 "Column number (1)"); 338 339 Assert.AreEqual (4, 340 frame2.GetFileColumnNumber (), 341 "Column number (2)"); 342 } 343 344 /// <summary> 345 /// Tests whether getting method associated with frame works. 346 /// </summary> 347 [Test] TestGetMethod()348 public void TestGetMethod () 349 { 350 Assert.IsTrue ((frame1.GetMethod () != null), "Method not null (1)"); 351 352 Assert.IsTrue ((frame2.GetMethod () != null), "Method not null (2)"); 353 354 Assert.AreEqual (this.GetType (), 355 frame2.GetMethod ().DeclaringType, 356 "Class declaring the method (2)"); 357 358 Assert.AreEqual ("SetUp", 359 frame2.GetMethod ().Name, 360 "Method name (2)"); 361 } 362 } 363 } 364