using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using UnitTestSharp; namespace TestsForUnitTestSharp { public class CpuTimeoutAttributeTests : TestFixture { [IgnoreFixture] public class SpinningFixture : TestFixture { private static void BurnCpu() { var elapsed = Stopwatch.StartNew(); double accumulator = 0; while (elapsed.ElapsedMilliseconds < 100) { accumulator += Math.Sqrt(accumulator + 1); } } [CpuTimeout(10000)] public void WithAllowance() { BurnCpu(); } public void WithoutAllowance() { BurnCpu(); } } [IgnoreTest] public bool RunSpinningTest(string methodName, out string output) { int? oldTimeout = TestRunner.TestCpuTimeoutInMilliseconds; bool oldIgnoreDebugger = TestRunner.IgnoreDebugger; TestRunner.TestCpuTimeoutInMilliseconds = 10; TestRunner.IgnoreDebugger = true; try { int failedChecks = 0; string captured = ""; bool passed = TestRunner.RunTest(new SpinningFixture(), typeof(SpinningFixture).GetMethod(methodName), null, 0, (outputString) => captured += outputString, ref failedChecks); output = captured; return passed; } finally { TestRunner.TestCpuTimeoutInMilliseconds = oldTimeout; TestRunner.IgnoreDebugger = oldIgnoreDebugger; } } public void OverDefaultBudget_WithAttribute_Passes() { string output; Check(RunSpinningTest("WithAllowance", out output)); CheckNotEqualRegex("error", output); } public void OverDefaultBudget_WithoutAttribute_FailsOnCpuTime() { string output; CheckFalse(RunSpinningTest("WithoutAllowance", out output)); CheckEqualRegex("CPU time", output); } } }