spec/timers_spec.rb in timers-1.1.0 vs spec/timers_spec.rb in timers-2.0.0
- old
+ new
@@ -1,40 +1,40 @@
require 'spec_helper'
describe Timers do
- # Level of accuracy enforced by most tests (50ms)
+ # Level of accuracy enforced by tests (50ms)
Q = 0.05
it "sleeps until the next timer" do
interval = Q * 2
started_at = Time.now
fired = false
subject.after(interval) { fired = true }
subject.wait
- fired.should be_true
- (Time.now - started_at).should be_within(Q).of interval
+ expect(fired).to be_true
+ expect(Time.now - started_at).to be_within(Q).of interval
end
it "fires instantly when next timer is in the past" do
fired = false
subject.after(Q) { fired = true }
sleep(Q * 2)
subject.wait
- fired.should be_true
+ expect(fired).to be_true
end
it "calculates the interval until the next timer should fire" do
interval = 0.1
subject.after(interval)
- subject.wait_interval.should be_within(Q).of interval
+ expect(subject.wait_interval).to be_within(Q).of interval
sleep(interval)
- subject.wait_interval.should be(0)
+ expect(subject.wait_interval).to be(0)
end
it "fires timers in the correct order" do
result = []
@@ -43,35 +43,159 @@
subject.after(Q * 1) { result << :one }
sleep Q * 4
subject.fire
- result.should == [:one, :two, :three]
+ expect(result).to eq [:one, :two, :three]
end
+ it "raises TypeError if given an invalid time" do
+ expect do
+ subject.after(nil) { nil }
+ end.to raise_exception(TypeError)
+ end
+
describe "recurring timers" do
it "continues to fire the timers at each interval" do
result = []
subject.every(Q * 2) { result << :foo }
sleep Q * 3
subject.fire
- result.should == [:foo]
+ expect(result).to eq [:foo]
sleep Q * 5
subject.fire
- result.should == [:foo, :foo]
+ expect(result).to eq [:foo, :foo]
end
end
-
+
describe "millisecond timers" do
it "calculates the proper interval to wait until firing" do
interval_ms = 25
subject.after_milliseconds(interval_ms)
expected_elapse = subject.wait_interval
- subject.wait_interval.should be_within(Q).of (interval_ms / 1000.0)
+ expect(subject.wait_interval).to be_within(Q).of(interval_ms / 1000.0)
+ end
+ end
+
+ describe "pause and continue timers" do
+ before(:each) do
+ @interval = Q * 2
+ started_at = Time.now
+
+ @fired = false
+ @timer = subject.every(@interval) { @fired = true }
+ @fired2 = false
+ @timer2 = subject.every(@interval) { @fired2 = true }
+ end
+
+ it "does not fire when paused" do
+ @timer.pause
+ subject.wait
+ expect(@fired).to be_false
+ end
+
+ it "fires when continued after pause" do
+ @timer.pause
+ subject.wait
+ @timer.continue
+ subject.wait
+ expect(@fired).to be_true
+ end
+
+ it "can pause all timers at once" do
+ subject.pause
+ subject.wait
+ expect(@fired).to be_false
+ expect(@fired2).to be_false
+ end
+
+ it "can continue all timers at once" do
+ subject.pause
+ subject.wait
+ subject.continue
+ subject.wait
+ expect(@fired).to be_true
+ expect(@fired2).to be_true
+ end
+
+ it "can fire the timer directly" do
+ fired = false
+ timer = subject.after( Q * 1 ) { fired = true }
+ timer.pause
+ subject.wait
+ expect(fired).not_to be_true
+ timer.continue
+ expect(fired).not_to be_true
+ timer.fire
+ expect(fired).to be_true
+ end
+
+ end
+
+ describe "delay timer" do
+ it "adds appropriate amount of time to timer" do
+ timer = subject.after(10)
+ timer.delay(5)
+ expect(timer.offset - subject.current_offset).to be_within(Q).of(15)
+ end
+ end
+
+ describe "delay timer collection" do
+ it "delay on set adds appropriate amount of time to all timers" do
+ timer = subject.after(10)
+ timer2 = subject.after(20)
+ subject.delay(5)
+ expect(timer.offset - subject.current_offset).to be_within(Q).of(15)
+ expect(timer2.offset - subject.current_offset).to be_within(Q).of(25)
+ end
+ end
+
+ describe "on delaying a timer" do
+ it "fires timers in the correct order" do
+ result = []
+
+ second = subject.after(Q * 2) { result << :two }
+ third = subject.after(Q * 3) { result << :three }
+ first = subject.after(Q * 1) { result << :one }
+ first.delay(Q * 3)
+
+ sleep Q * 5
+ subject.fire
+
+ expect(result).to eq [:two, :three, :one]
+ end
+ end
+
+ describe "Timer inspection" do
+ it "before firing" do
+ fired = false
+ timer = subject.after(Q * 5) { fired = true }
+ timer.pause
+ expect(fired).not_to be_true
+ expect(timer.inspect).to match(/\A#<Timers::Timer:[\da-f]+ fires in [-\.\de]+ seconds>\Z/)
+ end
+
+ it "after firing" do
+ fired = false
+ timer = subject.after(Q) { fired = true }
+
+ subject.wait
+
+ expect(fired).to be_true
+ expect(timer.inspect).to match(/\A#<Timers::Timer:[\da-f]+ fired [-\.\de]+ seconds ago>\Z/)
+ end
+
+ it "recurring firing" do
+ result = []
+ timer = subject.every(Q) { result << :foo }
+
+ subject.wait
+ expect(result).not_to be_empty
+ expect(timer.inspect).to match(/\A#<Timers::Timer:[\da-f]+ fires in [-\.\de]+ seconds, recurs every #{sprintf("%0.2f", Q)}>\Z/)
end
end
end