public async Task TimeBudget_throws_an_informative_exception_if_no_time_is_left() { var budget = new TimeBudget(5.Seconds()); await Clock.Current.Wait(1.Seconds()); budget.RecordEntry("one"); await Clock.Current.Wait(10.Seconds()); Action action = () => budget.RecordEntryAndThrowIfBudgetExceeded("two"); action.ShouldThrow <BudgetExceededException>() .Which .Message .Should() .Be($"Budget of 5 seconds exceeded.{NewLine}" + $" ✔ one @ 1.00 seconds{NewLine}" + $" ❌ two @ 11.00 seconds (budget of 5 seconds exceeded by 6.00 seconds.)"); }