spec/synchronizable/synchronizable_spec.rb in synchronizable-0.0.2 vs spec/synchronizable/synchronizable_spec.rb in synchronizable-0.0.3
- old
+ new
@@ -1,30 +1,34 @@
require 'spec_helper'
+class TestLock
+ attr_reader :sync_invoked
+
+ def initialize
+ @sync_invoked = false
+ end
+
+ def synchronize(&block)
+ @sync_invoked = true
+ end
+
+ def reset
+ @sync_invoked = false
+ end
+end
+
describe Synchronizable do
- context "when extended by an object" do
+ context "when extended" do
let(:object) { String.new }
it "creates an instance-level lock" do
object.instance_variables.should_not include(:@__lock)
object.extend(Synchronizable)
object.instance_variables.should include(:@__lock)
end
it "creates a locked version of each original method" do
- class TestLock
- attr_reader :sync_invoked
-
- def initialize
- @sync_invoked = false
- end
-
- def synchronize(&block)
- @sync_invoked = true
- end
- end
-
lock = TestLock.new
object.extend(Synchronizable)
object.instance_variable_set(:@__lock, lock)
# methods from Object not wrapped
@@ -49,17 +53,35 @@
t = Test.new
t.extend(Synchronizable)
t.m2.should == 10
end
- end
- it "protects a block via #synchronize" do
- s = ""
- s.methods.should_not include(:synchronize)
- s.extend(Synchronizable)
- s.methods.should include(:synchronize)
- s.synchronize do
- s.split
+ it "handles singleton methods" do
+ class Foo
+ def self.m1
+ 100
+ end
+ end
+
+
+ Foo.m1.should == 100
+ lock = TestLock.new
+ Foo.extend(Synchronizable)
+ Foo.instance_variable_set(:@__lock, lock)
+
+ lock.sync_invoked.should == false
+ Foo.m1
+ lock.sync_invoked.should == true
end
+
+ it "protects a block via #synchronize" do
+ s = ""
+ s.methods.should_not include(:synchronize)
+ s.extend(Synchronizable)
+ s.methods.should include(:synchronize)
+ s.synchronize do
+ s.split
+ end
+ end
end
-end
\ No newline at end of file
+end