diff options
Diffstat (limited to 'spec/ruby/core/kernel/sleep_spec.rb')
| -rw-r--r-- | spec/ruby/core/kernel/sleep_spec.rb | 65 |
1 files changed, 46 insertions, 19 deletions
diff --git a/spec/ruby/core/kernel/sleep_spec.rb b/spec/ruby/core/kernel/sleep_spec.rb index 4401e54256..61d8cc2380 100644 --- a/spec/ruby/core/kernel/sleep_spec.rb +++ b/spec/ruby/core/kernel/sleep_spec.rb @@ -1,12 +1,13 @@ require_relative '../../spec_helper' +require_relative '../fiber/fixtures/scheduler' describe "Kernel#sleep" do it "is a private method" do - Kernel.should have_private_instance_method(:sleep) + Kernel.private_instance_methods(false).should.include?(:sleep) end it "returns an Integer" do - sleep(0.001).should be_kind_of(Integer) + sleep(0.001).should.is_a?(Integer) end it "accepts a Float" do @@ -28,12 +29,12 @@ describe "Kernel#sleep" do end it "raises an ArgumentError when passed a negative duration" do - -> { sleep(-0.1) }.should raise_error(ArgumentError) - -> { sleep(-1) }.should raise_error(ArgumentError) + -> { sleep(-0.1) }.should.raise(ArgumentError) + -> { sleep(-1) }.should.raise(ArgumentError) end it "raises a TypeError when passed a String" do - -> { sleep('2') }.should raise_error(TypeError) + -> { sleep('2') }.should.raise(TypeError) end it "pauses execution indefinitely if not given a duration" do @@ -62,26 +63,52 @@ describe "Kernel#sleep" do actual_duration.should > 0.01 # 100 * 0.0001 => 0.01 end - ruby_version_is ""..."3.3" do - it "raises a TypeError when passed nil" do - -> { sleep(nil) }.should raise_error(TypeError) + it "accepts a nil duration" do + running = false + t = Thread.new do + running = true + sleep(nil) + 5 end + + Thread.pass until running + Thread.pass while t.status and t.status != "sleep" + + t.wakeup + t.value.should == 5 end - ruby_version_is "3.3" do - it "accepts a nil duration" do - running = false - t = Thread.new do - running = true - sleep(nil) - 5 + context "Kernel.sleep with Fiber scheduler" do + before :each do + Fiber.set_scheduler(FiberSpecs::LoggingScheduler.new) + end + + after :each do + Fiber.set_scheduler(nil) + end + + it "calls the scheduler without arguments when no duration is given" do + sleeper = Fiber.new(blocking: false) do + sleep end + sleeper.resume + Fiber.scheduler.events.should == [{ event: :kernel_sleep, fiber: sleeper, args: [] }] + end - Thread.pass until running - Thread.pass while t.status and t.status != "sleep" + it "calls the scheduler with the given duration" do + sleeper = Fiber.new(blocking: false) do + sleep(0.01) + end + sleeper.resume + Fiber.scheduler.events.should == [{ event: :kernel_sleep, fiber: sleeper, args: [0.01] }] + end - t.wakeup - t.value.should == 5 + it "does not call the scheduler if the fiber is blocking" do + sleeper = Fiber.new(blocking: true) do + sleep(0.01) + end + sleeper.resume + Fiber.scheduler.events.should == [] end end end |
